Транслятор: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
→‎Реализации: оформление, стилевые правки
→‎Компилирование: пунктуация, стилевые правки, оформление
Строка 35: Строка 35:


Язык [[Ада (язык программирования)|Ада]] поддерживает объектно-базированное программирование, что и послужило причиной выбора его в качестве основного языка программирования для i432.
Язык [[Ада (язык программирования)|Ада]] поддерживает объектно-базированное программирование, что и послужило причиной выбора его в качестве основного языка программирования для i432.
{{конец цитаты}}</ref>), но они являются исключением из правила в силу сложности и дороговизны. Транслятор, который преобразует программы в машинный язык, принимаемый и исполняемый непосредственно процессором, называется ''[[компилятор]]ом''.<ref name="Себеста">{{книга|автор=Роберт У. Себеста.|часть=1.7. Методы реализации|заглавие=Основные концепции языков программирования|оригинал=Concepts of Programming Languages|ответственный=Пер. с англ|издание=5-е изд|место=М.|издательство=[[Вильямс (издательство)|Вильямс]]|год=2001|страницы=45—52|страниц=672|isbn=5-8459-0192-8 (рус.), ISBN 0-201-75295-6 (англ.)|тираж=5000}}</ref>
{{конец цитаты}}</ref>), но они являются исключением из правила в силу сложности и дороговизны. Транслятор, который преобразует программы в машинный язык, принимаемый и исполняемый непосредственно процессором, называется [[компилятор]]ом.<ref name="Себеста">{{книга|автор=Роберт У. Себеста.|часть=1.7. Методы реализации|заглавие=Основные концепции языков программирования|оригинал=Concepts of Programming Languages|ответственный=Пер. с англ|издание=5-е изд|место=М.|издательство=[[Вильямс (издательство)|Вильямс]]|год=2001|страницы=45—52|страниц=672|isbn=5-8459-0192-8 (рус.), ISBN 0-201-75295-6 (англ.)|тираж=5000}}</ref>


Процесс компиляции, как правило, состоит из нескольких этапов: [[лексический анализ|лексического]], [[синтаксический анализ|синтаксического]] и [[семантический анализ|семантического анализов]], генерации на основе результатов анализов промежуточного кода, [[оптимизация компилятора|оптимизации]] промежуточного кода и генерации результирующего объектного кода, в данном случае машинного. Помимо этого, программа, как правило, имеет внешние инфраструктуры: сервисы, предоставляемые [[операционная система|операционной системой]] и сторонние [[Библиотека (программирование)|библиотеки]] (например, файловый ввод-вывод или графический интерфейс), для чего машинный код программы необходимо ''связать'' с этими сервисами и функциями библиотек. Связывание со [[статическая библиотека|статическими библиотеками]] выполняется ''редактором связей'' или ''[[компоновщик]]ом'' (который может представлять собой отдельную программу или быть частью компилятора), а с операционной системой и [[динамическая библиотека|динамическими библиотеками]] связывание выполняется при начале исполнения программы ''[[загрузчик программ|загрузчиком]]''.
Процесс компиляции, как правило, состоит из нескольких этапов: [[лексический анализ|лексического]], [[синтаксический анализ|синтаксического]] и [[семантический анализ|семантического анализов]], генерации на основе результатов анализов промежуточного кода, [[оптимизация компилятора|оптимизации]] промежуточного кода и генерации результирующего объектного кода, в данном случае машинного. Помимо этого, программа, как правило, использует средства внешней инфраструктуры: сервисы, предоставляемые [[операционная система|операционной системой]], и сторонние [[Библиотека (программирование)|библиотеки]] (например, для файлового ввода-вывода или графического интерфейса), для чего машинный код программы необходимо ''связать'' с этими сервисами и функциями библиотек. Связывание со [[статическая библиотека|статическими библиотеками]] выполняется [[Компоновщик|редактором связей или компоновщиком]] (который может представлять собой отдельную программу или быть частью компилятора), а с операционной системой и [[динамическая библиотека|динамическими библиотеками]] связывание выполняется [[загрузчик программ|загрузчиком]] при начале исполнения программы ([[динамическое связывание]]).


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


В случае, если исходный язык является [[язык ассемблера|языком ассемблера]] (низкоуровневым языком, близким к машинному языку), то компилятор такого языка называется ''[[ассемблер]]ом''.
В случае, если исходный язык является [[язык ассемблера|языком ассемблера]] (низкоуровневым языком, близким к машинному языку), то компилятор такого языка называется [[ассемблер]]ом.


=== Интерпретация ===
=== Интерпретация ===

Версия от 17:07, 18 июня 2015

Трансля́тор — программа или техническое средство, выполняющее трансляцию программы.[1][2]

Трансляция программы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке и, в определённом смысле, равносильную первой.[1]

Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдаёт для печати текста программы и т. д.[1]

Язык, на котором представлена входная программа, называется исходным языком, а сама программа — исходным кодом. Выходной язык называется целевым языком, а выходная (результирующая) программа - объектным кодом.

В общем случае, понятие трансляции относится не только к языкам программирования, но и к другим языкам — как формальным компьютерным (вроде языков разметки типа HTML), так и естественным (русскому, английскому и т. п.).[3][4]

Виды трансляторов

Трансляторы подразделяют[2]:

  • Диалоговый. Обеспечивает использование языка программирования в Шаблон:Translation.
  • Синтаксически-ориентированный (синтаксически-управляемый). Получает на вход описание синтаксиса и семантики языка и текст на описанном языке, который и транслируется в соответствии с заданным описанием.
  • Однопроходной. Формирует объектный модуль за один последовательный просмотр исходной программы.
  • Многопроходной. Формирует объектный модуль за несколько просмотров исходной программы.
  • Оптимизирующий. Выполняет оптимизацию кода в создаваемом объектном модуле.
  • Тестовый. Набор макрокоманд языка ассемблера, позволяющих задавать различные отладочные процедуры в программах, составленных на языке ассемблера.
  • Обратный. Для программы в машинном коде выдаёт эквивалентную программу на каком-либо языке программирования (см.: дизассемблер, декомпилятор).

Реализации

Цель трансляции — преобразовать текст с одного языка на другой, который понятен адресату текста. В случае трансляции компьютерной программы адресатом является либо техническое устройство (процессор), либо программа-интерпретатор.

Компилирование

Язык процессоров (машинный код) обычно является низкоуровневым. Существуют платформы, использующие в качестве машинного язык высокого уровня (например, iAPX-432[5]), но они являются исключением из правила в силу сложности и дороговизны. Транслятор, который преобразует программы в машинный язык, принимаемый и исполняемый непосредственно процессором, называется компилятором.[6]

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

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

В случае, если исходный язык является языком ассемблера (низкоуровневым языком, близким к машинному языку), то компилятор такого языка называется ассемблером.

Интерпретация

Другой метод реализации — когда программа исполняется с помощью интерпретатора вообще без трансляции. Интерпретатор программно моделирует машину, цикл выборки-исполнения которой работает с командами на языках высокого уровня, а не с машинными командами. Такое программное моделирование создаёт виртуальную машину, реализующую язык. Этот подход называется чистой интерпретацией.[6] Чистая интерпретация применяется, как правило, для языков с простой структурой (например, АПЛ или Лисп). Интерпретаторы командной строки обрабатывают команды в скриптах в UNIX или в пакетных файлах (.bat) в MS-DOS также как правило в режиме чистой интерпретации.

Достоинство чистого интерпретатора: отсутствие промежуточных действий для трансляции упрощает реализацию интерпретатора и делает его удобнее в использовании, в том числе в диалоговом режиме. Недостаток — интерпретатор должен быть в наличии на целевой машине, где должна исполняться программа. Также, как правило, имеется более или менее значительный проигрыш в скорости. А свойство чистого интерпретатора, что ошибки в интерпретируемой программе обнаруживаются только при попытке выполнения команды (или строки) с ошибкой, можно признать как недостатком, так и достоинством.

Существуют компромиссные между компиляцией и чистой интерпретацией варианты реализации языков программирования, когда интерпретатор перед исполнением программы транслирует её на промежуточный язык (например, в байт-код или p-код), более удобный для интерпретации (то есть речь идёт об интерпретаторе со встроенным транслятором). Такой метод называется смешанной реализацией.[6] Примером смешанной реализации языка может служить Perl. Этот подход сочетает как достоинства компилятора и интерпретатора (бо́льшая скорость исполнения и удобство использования), так и недостатки (для трансляции и хранения программы на промежуточном языке требуются дополнительные ресурсы; для исполнения программы на целевой машине должен быть представлен интерпретатор). Также, как и в случае компилятора, смешанная реализация требует, чтобы перед исполнением исходный код не содержал ошибок (лексических, синтаксических и семантических).

Динамическая компиляция

По мере увеличения ресурсов компьютеров и расширения гетерогенных сетей (в том числе Интернета), связывающих компьютеры разных типов и архитектур, выделился новый вид интерпретации, при котором исходный (или промежуточный) код компилируется в машинный код непосредственно во время исполнения, «на лету» (англ. just in time, JIT). Уже скомпилированные участки кода кэшируются, чтобы при повторном обращении к ним они сразу получали управление, без перекомпиляции. Этот подход получил название динамической, или JIT-компиляции.

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

Этот метод хорошо подходит для веб-приложений. Соответственно, динамическая компиляция появилась и поддерживается в той или иной мере в реализациях Java, .NET Framework, Perl, Python.

Смешение понятий трансляции и интерпретации

Трансляция и интерпретация — разные процессы: трансляция занимается переводом программ с одного языка на другой, а интерпретация отвечает за исполнение программ. Однако, поскольку, целью трансляции, как правило, является подготовка программы к интерпретации, то эти процессы обычно рассматриваются вместе. Например, языки программирования часто характеризуются как «компилируемые» или «интерпретируемые», в зависимости от того, что преобладает при использовании языка: компиляция или интерпретация. Причём, практически все языки программирования низкого уровня и третьего поколения, вроде ассемблера, Си или Модулы-2, являются компилируемыми, а более высокоуровневые языки, вроде Python или SQL, — интерпретируемыми.

С другой стороны, существует взаимопроникновение процессов трансляции и интерпретации: интерпретаторы могут быть компилирующими (в том числе с динамической компиляцией), а в трансляторах может требоваться интерпретация для конструкций метапрограммирования (например, для макросов в языке ассемблера, условной компиляции в Си или шаблонов в C++).

Более того, один и тот же язык программирования может и транслироваться, и интерпретироваться, и в обоих случаях должны присутствовать общие этапы анализа и распознавания конструкций и директив исходного языка. Это относится и к программным реализациям, и к аппаратным — так, процессоры семейства x86 перед исполнением инструкций машинного языка выполняют их декодирование, выделяя в опкодах поля операндов (регистров, адресов памяти, непосредственных значений), разрядности и т. п., а в процессорах Pentium с архитектурой NetBurst тот же самый машинный код перед сохранением во внутреннем кэше дополнительно транслируется в последовательность микроопераций.

Примечания

  1. 1 2 3 ГОСТ 19781-83 // Вычислительная техника. Терминология: Справочное пособие. Выпуск 1 / Рецензент канд. техн. наук Ю. П. Селиванов. — М.: Издательство стандартов, 1989. — 168 с. — 55 000 экз. — ISBN 5-7050-0155-X.
  2. 1 2 Першиков В. И., Савинков В. М. Толковый словарь по информатике / Рецензенты: канд. физ.-мат. наук А. С. Марков и д-р физ.-мат. наук И. В. Поттосин. — М.: Финансы и статистика, 1991. — 543 с. — 50 000 экз. — ISBN 5-279-00367-0.
  3. СТ ИСО 2382/7-77 // Вычислительная техника. Терминология. Указ. соч.
  4. Толковый словарь по вычислительным системам = Dictionary of Computing / Под ред. В. Иллингуорта и др.: Пер. с англ. А. К. Белоцкого и др.; Под ред. Е. К. Масловского. — М.: Машиностроение, 1990. — 560 с. — 70 000 (доп.) экз. — ISBN 5-217-00617-X (СССР), ISBN 0-19-853913-4 (Великобритания).
  5. Органик Э. Организация системы Интел 432 = A Programmer’s View of the Intel 432 System / Пер. с англ. — М.: Мир, 1987. — С. 20, 31. — 446 с. — 59 000 экз.

    Можно привести ряд других примеров, в которых архитектура разработанных серий вычислительных машин базировалась или сильно зависела от некоторой модели структуры программы. Так, серия GE/Honeywell Multics основывалась на семантической модели выполнения программ, написанных на языке ПЛ/1. В Burroughs B5500, B6700 … B7800 прототипом послужила модель программы этапа выполнения, написанной на расширенном языке Алгол. …

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

    Язык Ада поддерживает объектно-базированное программирование, что и послужило причиной выбора его в качестве основного языка программирования для i432.

  6. 1 2 3 Роберт У. Себеста. 1.7. Методы реализации // Основные концепции языков программирования = Concepts of Programming Languages / Пер. с англ. — 5-е изд. — М.: Вильямс, 2001. — С. 45—52. — 672 с. — 5000 экз. — ISBN 5-8459-0192-8 (рус.), ISBN 0-201-75295-6 (англ.).

Литература

  • Касьянов В. Н., Поттосин И. В. Методы построения трансляторов. — Новосибирск: Наука, 1986. — 344 с.