Сделай Сам Свою Работу на 5

Машинный код. Трансляторы, компиляторы, интерпретаторы.

Машинный код. Трансляторы, компиляторы, интерпретаторы.

2. Назначение трансляторов, компиляторов и интерпретаторов

3. Этапы трансляции. Общая схема работы транслятора

Машинный код. Трансляторы, компиляторы, интерпретаторы.

 

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

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

Трансляторы бывают двух типов - Интерпретаторы и Компиляторы.

Интерпретатор переводит Вашу программу с языка высокого уровня (например, БЕЙСИКа) в машинный код последовательно строку за строкой. Он работает примерно так: прочитал строку, проверил, нет ли в ней ошибок, перевел ее в машинный код, выполнил команды машинного кода, запомнил, где нужно результат и перешел к следующей строке. Чтобы сделать, например, операцию

 

10 PRINT 2 + 2,

 

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

Если же Вам позже придется вернуться к этой строке (например, с помощью GO TO 10), то все эти действия будут повторены.



А ведь многие операции выполняются в циклах.

Таким образом, интерпретатор работает крайне медленно. Зато имеется возможность работы в диалоговом режиме. Так, на Бейсике, когда Вы набираете программу, каждая строка сразу же и проверяется на правильность синтаксиса и, если Вы сделаете ошибку, то строка не будет введена в программу нажатием клавиши ENTER до тех пор, пока Вы эту ошибку не устраните. Вы всегда можете прервать работу программы, внести изменения и стартовать опять, причем с той строки, с какой хотите. Работать с интерпретатором БЕЙСИКа настолько удобно для начинающих, что на многих моделях персональных ЭВМ, в том числе и на «ZX-Spectrum`е», он уже «зашит» в постоянное запоминающее устройство (ПЗУ) и служит не только языком программирования, но и выполняет функции операционной системы компьютера. При включении компьютера в сеть он сразу готов к выполнению команд БЕЙСИКа.

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

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

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

Итак, программирование в машинном коде (на Ассемблере) позволяет повысить скорость работы программы по сравнению с работой через интерпретатор в 50…200 раз и в 1,5…3 раза по сравнению с кодом, прошедшим компиляцию. Это бывает чрезвычайно важно, если в программе есть многочисленные вложенные друг в друга циклы, если многократно выполняются поиск и выбор данных из обширных областей памяти. Много времени занимают операции, связанные с обработкой графических изображений на экране. Эффект плавного и быстрого перемещения (и изменения формы) объектов в компьютерных видеоиграх практически всегда создается программированием в машинном коде.

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

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

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

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

Основные задачи компиляторов Задача транслятора (translator) сделать программу, написанную на некотором языке программирования, понятной компьютеру. Этого можно добиться одним из двух способов: компиляцией (compilation) или интерпретацией (interpretation). Программу, являющуюся входными данными транслятора, будем называть исходной программой (source program). Обычно язык, на котором написана исходная программа, - это язык высокого уровня (high-level language). Компилятор (compiler) переводит исходную программу в эквивалентную программу на языке, понятном компьютеру, то есть на машинном языке. Мы будем называть программу, получающуюся в результате работы компилятора, целевой программой (target program). Процесс компиляции и последующего выполнения программы можно изобразить следующим образом: Сам компилятор также является программой, причем программой на машинном языке. Хотя, как мы увидим в дальнейшем, первоначально компилятор может быть написан на каком-нибудь языке более высокого уровня, чем машинный язык, а затем откомпилирован в машинный язык. Язык, на котором написан компилятор, будем называть языком реализации. Если мы обозначим язык, на котором написана исходная программа, то есть исходный язык (source language), L1, язык целевой программы (целевой язык – target language) L2, а язык реализации (implementation language) L3, то мы можем представить компилятор, как отображение множества L1 в множество L2 , т.е. 1 2 : 3 KL L → L . Процесс компиляции состоит из двух частей: анализа (analysis) и синтеза (synthesis). Анализирующая часть компилятора разбивает исходную программу на составляющие ее элементы (конструкции языка – language constructions) и создает промежуточное представление исходной программы. Синтезирующая часть из промежуточного представления создает новую, целевую, программу. Отметим, что однажды полученная в результате компиляции целевая программа может в дальнейшем выполняться много раз с различными входными данными. Далеко не всегда исходные программы корректны с точки зрения исходного языка. Более того, некорректные программы подаются на вход компилятору значительно чаще, чем корректные – таков уж современный процесс разработки программ. Поэтому крайне важной частью процесса компиляции является точная диагностика ошибок, допущенных во входной программе. Впрочем, это замечание верно не тоько для компиляторов, но и для интерпретаторов.

Интерпретатор - программа или устройство, осуществляющее пооператорную трансляцию и выполнение исходной программы. В отличие от компилятора, интерпретатор не порождает на выходе программу на машинном языке. Распознав команду исходного языка, он тут же выполняет ее. Как в компиляторах, так и в интерпретаторах используются одинаковые методы анализа исходного текста программы. Но интерпретатор позволяет начать обработку данных после написания даже одной команды. Это делает процесс разработки и отладки программ более гибким. Кроме того, отсутствие выходного машинного кода позволяет не «захламлять» внешние устройства дополнительными файлами, а сам интерпретатор можно достаточно легко адаптировать к любым машинным архитектурам, разработав его только один раз на широко распространенном языке программирования. Поэтому, интерпретируемые языки, типа Java Script, VB Script, получили широкое распространение. Недостатком интерпретаторов является низкая скорость выполнения программ. Обычно интерпретируемые программы выполняются в 50-100 раз медленнее программ, написанных в машинных кодах.

 

Практически во всех трансляторах (и в компиляторах, и в интерпретаторах) в том или ином виде присутствует большая часть перечисленных ниже процессов: лексический анализ; синтаксический анализ; семантический анализ; генерация внутреннего представления программы; оптимизация; генерация объектной программы. Транслятор — это программа, которая переводит входную программу на исход­ном (входном) языке в эквивалентную ей выходную программу на результирую­щем (выходном) языке. В работе транслятора уча­ствуют всегда три программы: 1) сам транслятор является программой обычно он входит в состав системного по вычислительной системы. То есть транс­лятор — это часть по. Он представляет собой на­бор машинных команд и данных и выполняется компьютером, как и все прочие программы в рамках ос. 2)исходными данными для работы транслятора служит текст входной программы — некоторая последовательность предложений входного языка про­граммирования. Этот файл должен содержать текст программы, удовлетворяющий синтаксическим и семантическим требова­ниям входного языка. 3)выходными данными транслятора является текст результирующей программы. Результирующая программа строится по синтаксическим правилам, заданным в выходном языке транслятора, а ее смысл определяется семантикой выходного языка. Важным требованием в определении транслятора является эк­вивалентность входной и выходной программ т.е совпадение их смысла с точки зрения семантики входного языка (для исходной программы) и семантики выходного языка (для результирующей про­граммы). Чтобы создать транслятор, необходимо, прежде всего, выбрать входной и выходной языки. С точки зрения преобразования предложений входного язы­ка в эквивалентные им предложения выходного языка транслятор выступает как переводчик. Результатом работы транслятора будет результирующая программа в том случае, если текст исходной программы является правильным — не со­держит ошибок с точки зрения синтаксиса и семантики входного языка. Если исходная программа неправильная, то резуль­татом работы транслятора будет сообщение об ошибке. Кроме понятия«транслятор» широко употребляется также близкое ему по смыс­лу понятие «компилятор». Компилятор — это транслятор, который осуществляет перевод исходной програм­мы в эквивалентную ей объектную программу на языке машинных команд или на языке ассемблера.т.о. Компилятор отличается от транслятора лишь тем, что его ре­зультирующая программа всегда должна быть написана на языке машинных ко­дов или на языке ассемблера. Результирующая программа компилятора называется «объектной программой» или «объектным кодом». Файл, в который она записана, обычно называется «объ­ектным файлом». Порожденная компилятором программа не может непосредственно выполняться на компьютере, так как она не привязана к конкретной области па­мяти, где должны располагаться ее код и данные..компиляторы, безусловно, самый распространенный вид трансляторов. Они име­ют самое широкое практическое применение, которым обязаны широкому рас­пространению всевозможных языков программирования. Сейчас в современных системах программирования стали появляться компиляторы, в которых результирующая программа создается не на языке машинных команд и не на языке ассемблера, а на некотором промежуточном языке. Он не может непосредственно исполняться на компьюте­ре, а требует специального промежуточного интерпретатора, для выполнения написан­ных на нем программ.интерпретатор — это программа, которая воспринимает входную программу на исходном языке и выполняет ее.в отличие от трансляторов интерпретаторы не порождают результирующую про­грамму — и в этом принципиаль­ная разница между ними. Интерпретатор, так же как и транслятор, анализирует текст исходной программы. Но он не порождает результирующей программы, а сразу же выполняет исходную в соответствии с ее смыслом, заданным семанти­кой входного языка. Т.о, результатом работы интерпретатора будет некоторый желаемый рез-т(если программа правильна) или сообщение об ошибке. Чтобы исполнить исходную программу, интерпретатор должен преобразовать ее в язык машинных кодов. Полученные ма­шинные коды не доступны пользователю. Они порождаются интер-ом, исполняются и уничтожаются по мере надобности. Пользователь видит результат выполнения этих кодов — т.е результат выполнения исходной программы.

 



©2015- 2019 stydopedia.ru Все материалы защищены законодательством РФ.