Интерпретатор и компилятор. Принципы работы и отличительные особенности.
Часто путают транслятор с языка программирования и систему программирования. Хотя «система программирования»- понятие гораздо большее, чем транслятор.
Транслятор - это программа, которая переводит (с англ. translate) с нотации одного языка в нотацию другого языка.
Трансляторы могут быть интерпретаторами (interpreter), т.е. совмещать анализ исходной программы с ее выполнением. Различие тут в том, что результатом работы интерпретатора будет не машинный код, а последовательность обращений к библиотеке функций интерпретатора.
Интерпретатор в отличие от компилятора может выбирать одну за другой инструкции и сразу их выполнять. При интерпретации (это важно!!!), в отличии от трансляции или компиляции, может быть начато выполнение программы, которая содержит синтаксические ошибки.
Кросс-трансляторы (кросс-компиляторы) - это вид трансляторов, которые переводят программу, записанную в нотации одного языка программирования и выполняющуюся в одной инструментальной среде, на одной ЭВМ, которая характеризуется своим операционным окружением и/или архитектурой, в код вычислительной системы другой среды другой ЭВМ.
Редактор внешних связей моделирует размещение объектных модулей в ОП и разрешает все связи между ними.
Иногда трансляторы в качестве результата трансляции выдают модуль на ассемблере соответствующей машины.
В вышерассмотренную схему можно добавит этап оптимизации программы, причем оптимизация может происходить до этапа трансляции (т.е. в терминах исходного языка) и/или после трансляции (в терминах машинного кода). Например, до трансляции вычислить все const-ые выражения. Этот этап особенно важен для класса машин, относящихся к mainframe-ам.
Этап трансляции. Каждый транслятор при обработке программы выполняет следующие действия:
• лексический анализ;
• синтаксический анализ;
• семантический анализ и генерация кода.
«Проход компиляции» - процесс полного просмотра (сканирования) исходного текста программы компилятором, его обработки и получения некоторых промежуточных результатов.
Логически работу компилятора можно представить в виде отдельных этапов и фаз на этих этапах, а физически - в виде проходов.
Однопроходные компиляторы. Процесс полной компиляции программы выполняется при однократном чтении кода. Различные фазы выполняются параллельно, что является очень удобным.
Многопроходные компиляторы. Получают объектный модуль не за один раз, а за несколько проходов. Результатом промежуточных проходов является некоторое внутреннее представление программы. Результатом последнего прохода является объектный модуль.
Количество проходов является важной технической характеристикой компилятора. Разработчики пытаются понизить количество проходов компиляторов для увеличения скорости работы и уменьшения объема необходимой памяти. Идеальный вариант - однопроходный компилятор, однако не всегда количество проходов можно уменьшить, т.к. количество проходов определяется грамматикой языка и семантическими правилами.
Компилятор с языка Си является двухпроходным:
1 проход - предпроцессорный, т.е. когда выполняются подстановки;
2 проход - лексический, синтаксический и семантический анализ. Результатом является объектный модуль.
Первые компиляторы были 7-ми и 8-ми - проходные по причине нехватки памяти.
Ассемблеры- трансляторы с языка ассемблера. Язык ассемблер - это язык низкого уровня. Структура и взаимосвязь цепочек языка близки к машинным командам вычислительной системы, где должна выполняться результирующая программа. Применение языка ассемблера позволяет разработчику управлять ресурсами вычислительной системы (ЦП, ОП, внешние устройства и т.д.) на уровне машинных команд. Каждая команда исходной программы на языке ассемблере в результате компиляции преобразуется в 1 машинную команду. Транслятор с языка ассемблера часто называется «ассемблер» или «программа ассемблера».
Транслятор - это программа, которая переводит (с англ. translate) с нотации одного языка в нотацию другого языка.
Компилятор - это транслятор, который переводит программу из нотации одного языка в нотацию машинного языка. Машинным языком может быть код конкретной машины, любой объектный код.
Трансляторы могут быть интерпретаторами (interpreter), т.е. совмещать анализ исходной программы с ее выполнением. Различие тут в том, что результатом работы интерпретатора будет не машинный код, а последовательность обращений к библиотеке функций интерпретатора.
Интерпретатор в отличие от компилятора может выбирать одну за другой инструкции и сразу их выполнять. При интерпретации (это важно!!!), в отличии от трансляции или компиляции, может быть начато выполнение программы, которая содержит синтаксические ошибки.
Транслятор (англ. translator — переводчик) — это программа-переводчик. Она преобразует программу, написанную на одном из языков высокого уровня, в программу, состоящую из машинных команд.
Трансляторы реализуются в виде компиляторов или интерпретаторов. С точки зрения выполнения работы компилятор и интерпретатор существенно различаются.
Компилятор (англ. compiler — составитель, собиратель) читает всю программу целиком, делает ее перевод и создает законченный вариант программы на машинном языке, который затем и выполняется.
Интерпретатор (англ. interpreter — истолкователь, устный переводчик) переводит и выполняет программу строка за строкой.
После того, как программа откомпилирована, ни сама исходная программа, ни компилятор более не нужны. В то же время программа, обрабатываемая интерпретатором, должна заново переводиться на машинный язык при каждом очередном запуске программы.
Откомпилированные программы работают быстрее, но интерпретируемые проще исправлять и изменять.
Каждый конкретный язык ориентирован либо на компиляцию, либо на интерпретацию — в зависимости от того, для каких целей он создавался. Например, Паскаль обычно используется для решения довольно сложных задач, в которых важна скорость работы программ. Поэтому данный язык обычно реализуется с помощью компилятора. С другой стороны, Бейсик создавался как язык для начинающих программистов, для которых построчное выполнение программы имеет неоспоримые преимущества.
Примеры реализации компиляторов C++, Pascal, Delphi
Примеры реализации интерпретаторов Java, SQL, PHP
Программист должен понимать, что язык программирования определяет характер программы, а не способ ее выполнения компьютером. Есть два способа выполнения программы компьютером: она может быть подвергнута компиляции или интерпретации. Программа, написанная на любом языке программирования, может как компилироваться, так и интерпретироваться, однако многие языки изначально созданы для выполнения преимущественно одним из этих способов. Например, Java рассчитан в основном на интерпретацию программы, а язык С — на компиляцию. Необходимо помнить, что при разработке языка С его конструкции оптимизировались специально для компиляции. И хотя интерпретаторы С существуют и доступны для программистов (особенно как средства отладки или объект для экспериментов — в качестве такого объекта можно использовать, например, интерпретатор, рассмотренный в части VI этой книги), С разрабатывался преимущественно для компиляции. Поэтому при разработке программ на С большинство программистов используют именно компилятор, а не интерпретатор. Поскольку не все читатели этой книги достаточно хорошо понимают отличие компилятора от интерпретатора, ниже дается краткое разъяснение по этому поводу.
В простейшем случае интерпретатор читает исходный текст программы по одной строке за раз, выполняет эту строку и только после этого переходит к следующей. Так работали ранние версии языка Basic. В языках типа Java исходный текст программы сначала конвертируется в промежуточную форму, а затем интерпретируется. В этом случае программа также интерпретируется в процессе выполнения.
Компилятор читает сразу всю программу и конвертирует ее в объектный код, то есть транслирует исходный текст программы в форму, более пригодную для непосредственного выполнения компьютером. Объектный код также называют двоичным или машинным кодом. Когда программа скомпилирована, в ее коде уже нет отдельных строк исходного кода.
В общем случае интерпретируемая программа выполняется медленнее, чем скомпилированная. Необходимо помнить, что компилятор преобразует исходный текст программы в объектный код, который выполняется компьютером непосредственно. Значит, потеря времени на компиляцию происходит лишь единожды, а в случае интерпретации — каждый раз при очередной компиляции фрагмента программы в процессе ее выполнения.
Дата добавления: 2015-04-10; просмотров: 2302;