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

3892 байта добавлено ,  4 года назад
Нет описания правки
(→‎Компилирование: пунктуация, стилевые правки, оформление)
{{другой термин|Трансляция|Трансляция}}
 
'''Трансля́тор''' — [[компьютерная программа|программа]] или техническое средство, выполняющее ''трансляцию программы''.<ref name="gost-19781-83">ГОСТ 19781-83 // {{книга|заглавие=Вычислительная техника. Терминология: Справочное пособие. Выпуск 1|ответственный=Рецензент канд. техн. наук Ю. П. Селиванов|место=М.|издательство=Издательство стандартов|год=1989|страниц=168|isbn=5-7050-0155-X|тираж=55&nbsp;000}}</ref><ref name="Першиков">{{книга|автор=Першиков В. И., Савинков В. М.|заглавие=Толковый словарь по информатике|ответственный=Рецензенты: канд. физ.-мат. наук А. С. Марков и д-р физ.-мат. наук И. В. Поттосин|место=М.|издательство=Финансы и статистика|год=1991|страниц=543|isbn=5-279-00367-0|тираж=50&nbsp;000}}</ref>
| заглавие = Вычислительная техника. Терминология: Справочное пособие. Выпуск 1
| ответственный = Рецензент канд. техн. наук Ю. П. Селиванов
| место = М.
| издательство = Издательство стандартов
| год = 1989
| страниц = 168
| isbn = 5-7050-0155-X
| тираж = {{formatnum:55000}}
}}</ref><ref name="Першиков">{{книга
| автор = Першиков В. И., Савинков В. М.
| заглавие = Толковый словарь по информатике
| ответственный = Рецензенты: канд. физ.-мат. наук А. С. Марков и д-р физ.-мат. наук И. В. Поттосин
| место = М.
| издательство = Финансы и статистика
| год = 1991
| страниц = 543
| isbn = 5-279-00367-0
| тираж = {{formatnum:50000}}
}}</ref>.
 
'''Трансляция программы''' — преобразование программы, представленной на одном из [[язык программирования|языков программирования]], в программу на другом языке и, в определённом смысле, равносильную первой.<ref name="gost-19781-83"/>.
 
Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдаёт для печати текста программы и т. д.<ref name="gost-19781-83"/>
 
Язык, на котором представлена входная программа, называется ''исходным языком'', а сама программа — ''[[исходный код|исходным кодом]]''. Выходной язык называется ''целевым языком, а выходная (результирующая) программа — -'' ''[[Объектный код|объектным кодом]]''.
 
В общем случае, понятие трансляции относится не только к языкам программирования, но и к другим языкам — как формальным [[компьютерный язык|компьютерным]] (вроде [[язык разметки|языков разметки]] типа [[HTML]]), так и [[Естественный язык|естественным]] ([[русский язык|русскому]], [[английский язык|английскому]] и т. п.).<ref>СТ ИСО 2382/7-77 // {{книга|заглавие=Вычислительная техника. Терминология. Указ. соч}}</ref><ref>{{книга|заглавие=Толковый словарь по вычислительным системам|оригинал=Dictionary of Computing|ответственный=Под ред. В. Иллингуорта и др.: Пер. с англ. А. К. Белоцкого и др.; Под ред. Е. К. Масловского|место=М.|издательство=Машиностроение|год=1990|страниц=560|isbn=5-217-00617-X (СССР), ISBN 0-19-853913-4 (Великобритания)|тираж=70&nbsp;000 (доп.)}}</ref>
| заглавие = Вычислительная техника. Терминология. Указ. соч
}}</ref><ref>{{книга
| заглавие = Толковый словарь по вычислительным системам
| оригинал = Dictionary of Computing
| ответственный = Под ред. В. Иллингуорта и др.: Пер. с англ. А. К. Белоцкого и др.; Под ред. Е. К. Масловского
| место = М.
| издательство = Машиностроение
| год = 1990
| страниц = 560
| isbn = 5-217-00617-X (СССР), ISBN 0-19-853913-4 (Великобритания)
| тираж = {{formatnum:70000}} (доп.)
}}</ref>.
 
== Виды трансляторов ==
 
Трансляторы подразделяют<ref name="Першиков"/>:
Сущесествует несколько видов трансляторов<ref name="Першиков"/>.
* ''Диалоговый''. Обеспечивает использование языка программирования в {{translation|:en:Time-sharing|режим разделения времени|режиме разделения времени}}.
* ''Диалоговый'' транслятор — транслятор, обеспечивающий использование языка программирования в {{translation|:en:Time-sharing|режим разделения времени|режиме разделения времени}}.
* ''Синтаксически-ориентированный ([[Синтаксически управляемая трансляция|синтаксически-управляемый]])''. Получает на вход описание [[синтаксис (программирование)|синтаксиса]] и [[семантика (программирование)|семантики]] языка и текст на описанном языке, который и транслируется в соответствии с заданным описанием.
* ''Синтаксически-ориентированный'' (''[[Синтаксически управляемая трансляция|синтаксически-управляемый]])'' транслятор — транслятор, получающий на вход описание [[синтаксис (программирование)|синтаксиса]] и [[семантика (программирование)|семантики]] языка, текст на описанном языке и выполняющий трансляцию в соответствии с заданным описанием.
* ''Однопроходной''. Формирует [[объектный модуль]] за один последовательный просмотр исходной программы.
* ''Однопроходной'' транслятор — транслятор, создающий [[объектный модуль]] при однократном последовательном чтении [[Исходный код|исходного кода]] (за один проход).
* ''Многопроходной''. Формирует объектный модуль за несколько просмотров исходной программы.
* ''Многопроходной'' транслятор — транслятор, создающий [[объектный модуль]] после нескольких чтений [[Исходный код|исходного кода]] (за несколько проходов).
* ''Оптимизирующий''. Выполняет [[оптимизация компилятора|оптимизацию]] кода в создаваемом объектном модуле.
* ''Оптимизирующий'' транслятор — транслятор, выполняющий [[Оптимизация (информатика)|оптимизацию]] создаваемого кода перед записью в [[объектный модуль|объектный файл]]. См. [[оптимизирующий компилятор]].
* ''Тестовый''. Набор [[макрокоманда|макрокоманд]] [[язык ассемблера|языка ассемблера]], позволяющих задавать различные [[отладка программы|отладочные]] [[подпрограмма|процедуры]] в программах, составленных на языке ассемблера.
* ''Тестовый'' транслятор — транслятор, получающий на вход [[исходный код]] и выдающий на выходе изменённый [[исходный код]]. Запускается перед основным транслятором для добавления в [[исходный код]] [[отладка программы|отладочных]] [[подпрограмма|процедур]]. Например, транслятор с [[Язык программирования|языка]] [[язык ассемблера|ассемблера]] может выполнять замену [[макрокоманда|макрокоманд]] на код.
* ''Обратный''. Для программы в машинном коде выдаёт эквивалентную программу на каком-либо языке программирования (см.: [[дизассемблер]], [[декомпилятор]]).
* ''Обратный'' транслятор — транслятор, выполняющий преобразование [[Машинный код|машинного кода]] в текст на каком-либо [[Язык программирования|языке программирования]]. См. [[дизассемблер]], [[декомпилятор]].
 
== Реализации ==
Цель трансляции — преобразовать текст с одного языка на другой, который понятен адресату текста. В случае трансляции компьютерной программы адресатом является либо техническое устройство ([[процессор]]), либо программа-[[интерпретатор]].
 
Цель трансляции — преобразование текста с одного языка на язык, понятный адресату. При трансляции [[Компьютерная программа|компьютерной программы]] адресатом может быть:
=== Компилирование ===
* устройство — [[процессор]] (трансляция называется компиляцией);
* программа — [[интерпретатор]] (трансляция называется интерпретацией).
 
Виды трансляции:
* [[#Компиляция|компиляция]];
* [[#Интерпретация|интерпретация]];
* [[#Динамическая компиляция|динамическая компиляция]].
 
=== Компиляция ===
 
{{main|Компилятор}}
 
Язык процессоров[[процессор]]а (устройства, машины) называется машинным языком, [[машинный код|машинным кодом]]). обычноКод являетсяна машинном языке исполняется процессором. Обычно, машинный язык — язык [[низкоуровневый язык программирования|низкоуровневымнизкого уровня]]., Существуютно платформысуществуют процессоры, использующие вязыки качестве машинного[[Высокоуровневый язык программирования|высокого уровня]] (например, [[Intel iAPX 432|iAPX-432]]<ref>{{книга|автор=Органик Э.|заглавие=Организация системы Интел 432|оригинал=A Programmer’s View of the Intel 432 System|ответственный=Пер. с англ|место=М.|издательство=Мир|год=1987|страницы=20, 31|страниц=446|тираж=59&nbsp;000}}
| автор = Органик Э.
| заглавие = Организация системы Интел 432
| оригинал = A Programmer’s View of the Intel 432 System
| ответственный = Пер. с англ
| место = М.
| издательство = Мир
| год = 1987
| страницы = 20, 31
| страниц = 446
| тираж = {{formatnum:59000}}
}}<!--
{{начало цитаты}}
Можно привести ряд других примеров, в которых [[Архитектура процессора|архитектура]] разработанных серий вычислительных машин базировалась или сильно зависела от некоторой модели структуры программы. Так, серия GE/Honeywell [[Multics]] основывалась на семантической модели выполнения программ, написанных на языке [[ПЛ/1]]. В [[Burroughs Corporation|Burroughs]] B5500, B6700 … B7800 прототипом послужила модель программы этапа выполнения, написанной на расширенном языке [[Алгол]]. …
 
Процессор i432, подобно этим ранним [[Архитектура процессора|архитектурам]], также базируется на семантической модели структуры программы. Однако, в отличие от своих предшественников, i432 не основывается на модели некоторого конкретного [[Язык программирования|языка программирования]]. Вместо этого, основной целью разработчиков было обеспечение непосредственной поддержки на этапе выполнения как для ''абстрактных данных'' (то есть программирование с [[абстрактные типы данных|абстрактными типами данных]]), так и для ''доменно-ориентированных [[операционная система|операционных систем]]''. …
 
Язык [[Ада (язык программирования)|Ада]] поддерживает объектно-базированное программирование, что и послужило причиной выбора его в качестве основного языка программирования для i432.
{{конец цитаты}}--></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>
 
'''Компилятор''' — транслятор, преобразующий исходный код с какого-либо [[Язык программирования|языка программирования]] на [[Машинный код|машинный язык]]<ref name="Себеста">{{книга
Процесс компиляции, как правило, состоит из нескольких этапов: [[лексический анализ|лексического]], [[синтаксический анализ|синтаксического]] и [[семантический анализ|семантического анализов]], генерации на основе результатов анализов промежуточного кода, [[оптимизация компилятора|оптимизации]] промежуточного кода и генерации результирующего объектного кода, в данном случае машинного. Помимо этого, программа, как правило, использует средства внешней инфраструктуры: сервисы, предоставляемые [[операционная система|операционной системой]], и сторонние [[Библиотека (программирование)|библиотеки]] (например, для файлового ввода-вывода или графического интерфейса), для чего машинный код программы необходимо ''связать'' с этими сервисами и функциями библиотек. Связывание со [[статическая библиотека|статическими библиотеками]] выполняется [[Компоновщик|редактором связей или компоновщиком]] (который может представлять собой отдельную программу или быть частью компилятора), а с операционной системой и [[динамическая библиотека|динамическими библиотеками]] связывание выполняется [[загрузчик программ|загрузчиком]] при начале исполнения программы ([[динамическое связывание]]).
| автор = Роберт У. Себеста.
| часть = 1.7. Методы реализации
| заглавие = Основные концепции языков программирования
| оригинал = Concepts of Programming Languages
| ответственный = Пер. с англ
| издание = 5-е изд
| место = М.
| издательство = [[Вильямс (издательство)|Вильямс]]
| год = 2001
| страницы = 45‑52
| страниц = 672
| isbn = 5-8459-0192-8 (рус.), ISBN 0-201-75295-6 (англ.)
| тираж = {{formatnum:5000}}
}}</ref>.
 
Процесс компиляции, как правило, состоит из нескольких этапов:
Достоинство компилятора: программа компилируется один раз и при каждом выполнении не требуется дополнительных преобразований. Соответственно, не требуется наличие компилятора на целевой машине, для которой компилируется программа. Недостаток: отдельный этап компиляции замедляет написание и отладку и затрудняет исполнение небольших, несложных или разовых программ.
* [[лексический анализ]];
* [[синтаксический анализ]];
* [[семантический анализ]];
* создание на основе результатов анализов промежуточного кода;
* [[оптимизация компилятора|оптимизация]] промежуточного кода;
* создание [[Объектный модуль|объектного кода]], в данном случае [[машинный код|машинного]].
 
Программа может использовать сервисы, предоставляемые [[операционная система|операционной системой]], и сторонние [[Библиотека (программирование)|библиотеки]] (например, библиотеки для работы с файлами и библиотеки для создания графического интерфейса). Для добавления в [[объектный модуль|объектный файл]] [[машинный код|машинного кода]] из других [[объектный модуль|объектных файлов]] (кода [[Библиотека (программирование)#Статические библиотеки|статических]] [[Библиотека (программирование)|библиотек]]) и информации о [[Библиотека (программирование)#Динамические библиотеки|динамических]] [[Библиотека (программирование)|библиотеках]] выполняется ''связывание'' ({{lang-en|link}}) или ''компоновка''. Связывание или компоновка выполняется [[Компоновщик|редактором связей или компоновщиком]]. Компоновщик может быть отдельной программой или частью [[компилятор]]а. Компоновщик создаёт [[Исполнимый модуль|исполняемый файл]]. Исполняемый файл (программа) запускается следующим образом:
В случае, если исходный язык является [[язык ассемблера|языком ассемблера]] (низкоуровневым языком, близким к машинному языку), то компилятор такого языка называется [[ассемблер]]ом.
* по запросу пользователя в ядре [[операционная система|операционной системы]] создаётся объект «[[Процесс (информатика)|процесс]]»;
* [[загрузчик программ|загрузчик программ]] [[операционная система|операционной системы]] выполняет следующие действия:
* читает [[исполняемый файл]];
* загружает его в [[Оперативная память|память]];
* загружает в [[Оперативная память|память]] [[Библиотека (программирование)#Динамические библиотеки|динамические библиотеки]];
* выполняет связывание машинного кода программы с динамическими библиотеками (динамическое связывание);
* передаёт управление программе.
 
Достоинства компиляции:
* компиляция программы выполняется один раз;
* наличие компилятора на устройстве, для которого компилируется программа, не требуется.
 
Недостатки компиляции:
* компиляция — медленный процесс;
* при внесении изменений в исходный код, требуется повторная компиляция.
 
[[Ассемблер]] — компилятор, преобразующий текст с языка [[язык ассемблера|ассемблера]] на [[Машинный код|машинный язык]]. [[Язык ассемблера]] — [[Язык программирования|язык]], близкий к [[машинный код|машинному языку]], язык [[Низкоуровневый язык программирования|низкого уровня]].
 
=== Интерпретация ===
 
{{main|Интерпретатор}}
 
Интерпретация — процесс чтения и выполнения [[Исходный код|исходного кода]]. Реализуется программой — [[интерпретатор]]ом.
Другой метод реализации — когда программа исполняется с помощью ''[[интерпретатор]]а'' вообще без трансляции. Интерпретатор программно моделирует машину, цикл выборки-исполнения которой работает с командами на языках высокого уровня, а не с машинными командами. Такое программное моделирование создаёт [[виртуальная машина|виртуальную машину]], реализующую язык. Этот подход называется '''чистой интерпретацией'''.<ref name="Себеста"/> Чистая интерпретация применяется, как правило, для языков с простой структурой (например, [[АПЛ (язык программирования)|АПЛ]] или [[Лисп]]). [[Интерпретатор командной строки|Интерпретаторы командной строки]] обрабатывают команды в [[скрипт]]ах в [[UNIX]] или в [[пакетный файл|пакетных файлах]] (<tt>.bat</tt>) в [[MS-DOS]] также как правило в режиме чистой интерпретации.
 
Интерпретатор может работать двумя способами:
Достоинство чистого интерпретатора: отсутствие промежуточных действий для трансляции упрощает реализацию интерпретатора и делает его удобнее в использовании, в том числе в диалоговом режиме. Недостаток — интерпретатор должен быть в наличии на целевой машине, где должна исполняться программа. Также, как правило, имеется более или менее значительный проигрыш в скорости. А свойство чистого интерпретатора, что ошибки в интерпретируемой программе обнаруживаются только при попытке выполнения команды (или строки) с ошибкой, можно признать как недостатком, так и достоинством.
# читать код и исполнять его сразу (''чистая интерпретация''<ref name="Себеста" />);
# читать код, создавать в [[Оперативная память|памяти]] промежуточное представление кода ([[байт-код]] или [[p-код]]), выполнять промежуточное представление кода (''смешанная реализация''<ref name="Себеста" />).
 
В первом случае трансляция не используется, а во втором — используется трансляция исходного кода в промежуточный код.
Существуют компромиссные между компиляцией и чистой интерпретацией варианты реализации языков программирования, когда интерпретатор перед исполнением программы транслирует её на промежуточный язык (например, в [[байт-код]] или [[p-код]]), более удобный для интерпретации (то есть речь идёт об интерпретаторе со встроенным транслятором). Такой метод называется '''смешанной реализацией'''.<ref name="Себеста"/> Примером смешанной реализации языка может служить [[Perl]]. Этот подход сочетает как достоинства компилятора и интерпретатора (бо́льшая скорость исполнения и удобство использования), так и недостатки (для трансляции и хранения программы на промежуточном языке требуются дополнительные ресурсы; для исполнения программы на целевой машине должен быть представлен интерпретатор). Также, как и в случае компилятора, смешанная реализация требует, чтобы перед исполнением исходный код не содержал ошибок (лексических, синтаксических и семантических).
 
Этапы работы интерпретатора:
* [[лексический анализ]];
* [[синтаксический анализ]];
* [[семантический анализ]];
* создание промежуточного представления кода (при чистой интерпретации не выполняется);
* исполнение.
 
Интерпретатор моделирует машину ([[виртуальная машина|виртуальную машину]]), реализует цикл выборки-исполнения команд машины. Команды машины записываются не на машинном языке, а на языке [[Высокоуровневый язык программирования|высокого уровня]]. Интерпретатор можно назвать исполнителем языка [[виртуальная машина|виртуальной машины]].
 
Чистая интерпретация применяется, обычно, для языков с простой структурой, например, [[Сценарный язык|языков сценариев]], языков [[АПЛ (язык программирования)|АПЛ]] и [[Лисп]].
 
Примеры интерпретаторов, создающих [[байт-код]]: [[Perl]], [[PHP]], [[Python]], [[Ruby]], [[Erlang]].
 
Достоинства интерпретаторов по сравнению с компиляторами:
* возможность работы в интерактивном режиме;
* отсутствие необходимости перекомпиляции [[Исходный код|исходного кода]] после внесения изменений и при переносе кода на другую [[Аппаратная платформа компьютера|платформу]].
 
Недостатки интерпретаторов по сравнению с компиляторами:
* низкая производительность (машинный код исполняется процессором, а интерпретируемый код — интерпретатором; машинный код самого интерпретатора исполняется процессором);
* необходимость наличия интерпретатора на устройстве, на котором планируется интерпретация программы;
* обнаружение ошибок синтаксиса на этапе выполнения (актуально для чистых интерпреаторов).
 
Сравнение чистого интерпретатора и интерпретатора, создающего [[байт-код]]:
* чистый интерпретатор проще в реализации, так как для него не нужно писать код транслятора;
* интерпретатор, создающий [[байт-код]], может выполнять его [[Оптимизация (информатика)|оптимизацию]] и добиваться большей производительности, чем чистый интерпретатор;
* интерпретатор, создающий [[байт-код]], потребляет больше ресурсов системы (трансляция в [[байт-код]] занимает процессорное время; [[байт-код]] занимает место в [[Оперативная память|памяти]]).
 
=== Динамическая компиляция ===
 
{{main|JIT-компиляция}}
 
ПоДинамическая мереили увеличенияJIT ресурсовкомпиляция — компьютеровтрансляция, ипри расширениякоторой [[гетерогеннаяисходный сетькод|гетерогенных сетейисходный]] (в том числе Интернета), связывающих компьютеры разных типов и архитектур, выделился новый вид интерпретации, при котором исходный (или промежуточный) код преобразуется (компилируется) в [[машинный код]] непосредственно во время исполнения, «на лету» ({{lang-en|just in time}}, {{lang-en2|JIT}}). УжеКомпиляция скомпилированныекаждого участкиучастка кода [[кэш]]ируются,выполняется чтобытолько приодин повторномраз; обращениискомпилированный ккод нимсохраняется онив сразу[[кеш]]е получалии управление,при безнеобходимости перекомпиляции.используется Этот подход получил название ''динамической'', или ''[[JIT-компиляция|JIT-компиляции]]''повторно.
 
Достоинства динамической компиляции по сравнению с компиляцией:
Достоинством динамической компиляции является то, что скорость интерпретации программ становится сравнимой со скоростью исполнения программ в обычных компилируемых языках, при этом сама программа хранится и распространяется в единственном виде, независимом от целевых платформ. Недостатком является бо́льшая сложность реализации и бо́льшие требования к ресурсам, чем в случае простых компиляторов или чистых интерпретаторов.
* скорость работы динамически компилируемых программ близка приближается к скорости работы компилируемых программ;
* отсутствие необходимости перекомпиляции программы при переносе на другую [[Аппаратная платформа компьютера|платформу]].
 
Недостатки динамической компиляции по сравнению с компиляцией и чистой интерпретацией:
Этот метод хорошо подходит для [[веб-приложение|веб-приложений]]. Соответственно, динамическая компиляция появилась и поддерживается в той или иной мере в реализациях [[Java]], [[.NET Framework]], [[Perl]], [[Python]].
* бо́льшая сложность реализации;
* бо́льшие требования к ресурсам.
 
Динамическая компиляция хорошо подходит для [[веб-приложение|веб-приложений]].
 
Динамическая компиляция появилась и поддерживается в той или иной мере в реализациях [[Java]], [[.NET Framework]], [[Perl]], [[Python]].
 
== Смешение понятий трансляции и интерпретации ==
Трансляция и интерпретация — разные процессы: трансляция занимается переводом программ с одного языка на другой, а интерпретация отвечает за исполнение программ. Однако, поскольку, целью трансляции, как правило, является подготовка программы к интерпретации, то эти процессы обычно рассматриваются вместе. Например, языки программирования часто характеризуются как «компилируемые» или «интерпретируемые», в зависимости от того, что преобладает при использовании языка: компиляция или интерпретация. Причём, практически все [[низкоуровневый язык программирования|языки программирования низкого уровня]] и [[язык программирования третьего поколения|третьего поколения]], вроде [[язык ассемблера|ассемблера]], [[Си (язык программирования)|Си]] или [[Модула-2|Модулы-2]], являются компилируемыми, а более [[высокоуровневый язык программирования|высокоуровневые языки]], вроде [[Python]] или [[SQL]], — интерпретируемыми.
 
Понятия «трансляция» и «интерпретация» отличаются. Во время трансляция выполняется преобразование кода программы с одного языка на другой. Во время интерпретации программа исполняется.
С другой стороны, существует взаимопроникновение процессов трансляции и интерпретации: интерпретаторы могут быть компилирующими (в том числе с динамической компиляцией), а в трансляторах может требоваться интерпретация для конструкций [[метапрограммирование|метапрограммирования]] (например, для [[макрос в языке ассемблера|макросов в языке ассемблера]], [[условная компиляция|условной компиляции]] в Си или [[шаблоны C++|шаблонов в C++]]).
 
Так как целью трансляции является, обычно, подготовка к интерпретации, эти процессы рассматриваются вместе. Например, языки программирования часто характеризуются как «компилируемые» или «интерпретируемые», в зависимости от того, что преобладает при использовании языка: компиляция или интерпретация. Причём, практически все языки [[низкоуровневый язык программирования|низкого уровня]] и [[язык программирования третьего поколения|третьего поколения]], вроде [[язык ассемблера|ассемблера]], [[Си (язык программирования)|Си]] или [[Модула-2|Модулы-2]], являются компилируемыми, а более [[высокоуровневый язык программирования|высокоуровневые языки]], вроде [[Python]] или [[SQL]] — интерпретируемыми.
Более того, один и тот же язык программирования может и транслироваться, и интерпретироваться, и в обоих случаях должны присутствовать общие этапы анализа и распознавания конструкций и директив исходного языка. Это относится и к программным реализациям, и к аппаратным — так, процессоры семейства [[x86]] перед исполнением инструкций машинного языка выполняют их декодирование, выделяя в [[опкод]]ах поля операндов (регистров, адресов памяти, непосредственных значений), разрядности и т. п., а в процессорах Pentium с архитектурой [[NetBurst]] тот же самый машинный код перед сохранением во внутреннем кэше дополнительно транслируется в последовательность микроопераций.
 
С другой стороны, существует взаимопроникновение процессов трансляции и интерпретации: интерпретаторы могут быть компилирующими (в том числе с динамической компиляцией), а в трансляторах может требоваться интерпретация для реализации [[метапрограммирование|метапрограммирования]] (например, для [[макрос в языке ассемблера|макросов в языке ассемблера]], [[условная компиляция|условной компиляции]] в [[Си (язык программирования)|Си]] или [[шаблоны C++|шаблонов]] в [[C++]]).
 
Более того, один и тот же [[язык программирования]] может и транслироваться, и интерпретироваться, и в обоих случаях должны присутствовать общие этапы анализа и распознавания конструкций и директив исходного языка. Это относится и к программным реализациям, и к аппаратным — так, [[процессор]]ы семейства [[x86]] перед исполнением инструкций [[Машинный код|машинного языка]] выполняют их декодирование, выделяя в [[опкод]]ах поля операндов (указание [[Регистр процессора|регистров]], адресов в [[Оперативная память|памяти]], [[Константа (программирование)|констант]]), [[Разрядность|разрядности]] и т. п., а в [[процессор]]ах [[Pentium]] с [[Архитектура процессора|архитектурой]] [[NetBurst]] тот же самый [[машинный код]] перед сохранением во внутреннем [[кэш]]е дополнительно транслируется в последовательность микроопераций.
 
== Примечания ==
 
== Литература ==
 
* {{книга|автор=Касьянов В. Н., Поттосин И. В.|заглавие=Методы построения трансляторов|место=Новосибирск|издательство=Наука|год=1986|страниц=344}}
* {{книга
| автор = Касьянов В. Н., Поттосин И. В.
| заглавие = Методы построения трансляторов
| место = Новосибирск
| издательство = Наука
| год = 1986
| страниц = 344
}}
 
[[Категория:Трансляторы|*]]
Анонимный участник