История языков программирования.

Языки программирования разработаны так, чтобы они позволяли записать алгоритм в форме, понятной человеку и легко преобразуемой в команды машинного языка. Языки программирования позволяют избежать лабиринта регистров, адресов памяти и машинных циклов в процессе разработки программы сосредоточиться на решаемой задаче.

В основе ранних ПК лежал принцип хранимой программы, и в процессе программирования программист записывал все алгоритмы на машинном языке (языки программирования первого поколения). При программировании на машинном языке все элементы, входящие в команду, записываются в виде двоичных кодов. Так записываются и выполняемые операции, и адреса ячеек, в которых содержатся команды, и исходные данные, и результаты.

Первым шагом в устранении этих сложностей был отказ от использования чисел для представления кода операций и операнда, используемых в машинном языке. С этой целью кодам операций стали назначать мнемонические имена. Например, вместо кода загрузки программист мог написать LD (от LOAD). Для операндов были созданы правила, по которым можно были присваивать описательные имена (идентификаторы) ячейкам памяти и использовать их вместо адресов ячеек памяти в командах. Но затем программу все равно переводили на машинный язык вручную.

Потом были созданы программы, транслирующие программу, записанную в мнемонической форме, в машинный код. Такие программы называются ассемблерами (язык программирования второго поколения). Название ассемблер (сборщик) происходит от основной функции этих программ – собирать машинные команды, переводя мнемонические имена операций и идентификаторы операндов в коды команд и коды операндов. Мнемонические системы для представления программ были признаны языками программирования и названы языками ассемблера. Когда появились первые языки ассемблера, они казались гигантским шагом по направлению к более совершенным методам программирования.

Хотя языки второго поколения и имели большое преимущество перед машинными языками, им все же не удалось стать окончательной средой программирования. Примитивы, которые использовались в языках ассемблера, в сущности, ничем не отличались от примитивов, применяемых в соответствующих машинных языках. Различие заключалось только в синтаксических структурах, использовавшихся для их представления. Поэтому программа, написанная на языке ассемблера, является машинно-зависимой, то есть команды программы выполняются в соответствии с характеристиками отдельной машины. Программу, написания на языке ассемблера, нельзя перенести на машину с другой архитектурой. Для этого ее нужно переписать, чтобы она соответствовала конфигурации регистров и набору команд новой машины.

Другой недостаток языков ассемблера заключается в том, что хотя программисту и не приходится записывать команды в виде последовательности битов, он все-таки вынужден мыслить в небольших шагах машинного языка. Данная ситуация аналогична использованию при проектировании дома таких понятий, как доска, гвоздь, кирпич и т. д., вместо понятий комната, окно и т.п.

Говоря проще, элементарные примитивы, из которых, в конце концов, строится продукт, не обязательно должны использоваться при разработке этого продукта. В процессе проектирования лучше применять примитивы более высокого уровня, каждый из которых представляет собой понятие, связанное с одной из главных характеристик продукта. По окончании проектирования эти примитивы можно перевести в понятия более низкого уровня, имеющие отношение к деталям выполнения.

Следуя этим принципам, специалисты в области вычислительной техники начали разрабатывать языки программирования, более подходящие для создания программного обеспечения, чем языки ассемблера. В результате возникли языки программирования высокого уровня, которые отличались от своих предшественников тем, что в них использовались машинно-независимые примитивы высокого уровня. Известным примерами таких языков являются FORTRAN, разработанный для создания научных и инженерных прикладных программ, и COBOL, созданный военно-морским ведомством США для прикладных программ в бизнесе. Главным при разработке языков третьего поколения было создание набора примитивов высокого уровня, с помощью которых можно создавать программное обеспечение. Каждый из примитивов был построен так, что его можно выполнить как последовательность примитивов низкого уровня, входящих в машинный язык.

После определения (разработки) набора примитивов была написана программа, преобразующая программу, записанную с помощью этих примитивов, в программу на машинном языке. Такая программа называется транслятором. Трансляторы были очень похожи на ассемблеры второго поколения, только им приходилось объединять несколько машинных команд в короткие последовательности, чтобы имитировать действия, выраженные одним примитивом высокого уровня. Такие транслирующие программы часто называют компиляторами.

Интерпретатор, в отличие от компилятора, выполняет программу по мере ее ввода и не записывает транслируемую программу для последующего выполнения. То есть интерпретатор выполняет команды, как только они получены, а не создает копию программы, записанную на машинном языке, чтобы выполнить ее позже.

Современные трансляторы способны работать в режиме и интерпретатора, и компилятора. При разработке и отладке программы транслятор работает обычно в режиме интерпретатора, а при получения готовой исполняемой программы - в режиме компилятора.

Процесс преобразования программы с языка высокого уровня в машинные команды называется трансляцией. Программа в первоначальной форме называется исходной программой, преобразованная программа называется объектной. Процесс трансляции включает в себя три стадии: лексический анализ (лексический анализатор), синтаксический анализ (синтаксический анализатор) и генерацию объектного кода (генератор объектного кода). В процессе лексического анализа распознаются цепочки символов, которые представляют собой отдельные элементы, и классифицируются согласно тому, являются ли они числовыми значениями, арифметическими операторами, словами и т.д. (например, число 347, слово for). По мере классификации элементов лексический анализатор порождает цепочки битов – лексемы, и передает их синтаксическому анализатору. Синтаксический анализатор рассматривает программу как совокупность лексем и его задача состоит в том, чтобы сгруппировать эти элементы в отдельные высказывания. В большинстве языков программирования для обозначения конца высказывания используются знаки пунктуации, а для обозначения отдельных конструкций – ключевые (зарезервированные) слова. Последняя стадия трансляции программы – это генерация кода, т.е. создание команд машинного языка, выполняющих выражения, распознанные синтаксическим анализатором. Процессы лексического и синтаксического анализа и генерации кода в ЭВМ протекают одновременно.

Объектная программа, полученная после трансляции исходной программы, часто является только кусочком целой программы. Соединение объектных программ выполняется компоновщиком. Компоновщик связывает объектные программы, полученные в результате трансляции, процедуры операционной системы и другое обслуживающее программное обеспечение и создает исполняемую программу (загрузочный модуль, обычно с расширением .exe), которая сохраняется на запоминающем устройстве ЭВМ. Для выполнения оттранслированной программы загрузочный модуль помещается в память программой, которая называется загрузчиком и часто является частью планировщика операционной системы.

Таким образом, подготовка программы на языке высокого уровня к выполнению состоит из трех этапов: трансляции, компоновки и загрузки. После завершения трансляции и компоновки программу можно загрузить и выполнять, не возвращаясь к ее исходной версии. Если программу необходимо изменить, то все изменения производятся в исходной программе, которая затем снова транслируется и создается новый загрузочный модуль, содержащий внесенные изменения.

Существует тенденция группировать транслятор и другие программы, использующиеся в процессе разработки программного обеспечения, в пакеты, которые функционируют как одна система. Такую систему можно отнести к прикладному программному обеспечению. Используя такую систему, программист получает доступ к редактору для написания программ, транслятору для перевода программы на машинный язык и большому количеству инструментов отладки. Редактор обычно структурирует текст программы согласно правилам используемого языка, иногда распознает и дописывает зарезервированные слова. [1, 8]

 








Дата добавления: 2017-01-29; просмотров: 616;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.004 сек.