- •Глава 13 Основные
- •Определение компилятора. Отличие компилятора от транслятора
- •Определение интерпретатора. Разница между интерпретаторами и трансляторами
- •Назначение трансляторов, компиляторов и интерпретаторов. Примеры реализации
- •Этапы трансляции. Общая схема работы транслятора
- •Понятие прохода. Многопроходные и однопроходные компиляторы
- •Интерпретаторы. Особенности построения интерпретаторов
- •Трансляторы с языка ассемблера («ассемблеры»)
- •Реализация компиляторов с языка ассемблера
- •Макроопределения и макрокоманды
- •Простейшие методы построения таблиц идентификаторов
- •Построение таблиц идентификаторов по методу бинарного дерева
- •Построение таблиц идентификаторов на основе хэш-функций
- •Построение таблиц идентификаторов по методу цепочек
- •Комбинированные способы построения таблиц идентификаторов
- •Принципы построения лексических анализаторов
- •Определение границ лексем
- •Выполнение действий, связанных с лексемами
- •Построение лексических анализаторов
- •Автоматизация построения лексических анализаторов (программа lex)
- •Дерево разбора. Преобразование дерева разбора в дерево операций
- •1 Повтор того, что сказано до начала Шагов. — Примеч. Ред.
- •Автоматизация построения синтаксических анализаторов (программа yacc)
Определение компилятора. Отличие компилятора от транслятора
Кроме понятия «транслятор» широко употребляется также близкое ему по смыслу понятие «компилятор».
Компилятор — это транслятор, который осуществляет перевод исходной программы в эквивалентную ей объектную программу на языке машинных команд или на языке ассемблера.
Таким образом, компилятор отличается от транслятора лишь тем, что его результирующая программа всегда должна быть написана на языке машинных кодов или на языке ассемблера. Результирующая программа транслятора, в общем случае, может быть написана на любом языке — возможен, например, транслятор программ с языка Pascal на язык C. Соответственно, всякий компилятор является транслятором, но не наоборот — не всякий транслятор будет компилятором. Например, упомянутый выше транслятор с языка Pascal на C компилятором являться не будет1.
Само слово «компилятор» происходит от английского термина «compiler» («составитель», «компоновщик»). Видимо, термин обязан своему происхождению способности компиляторов составлять объектные программы на основе исходных программ.
Результирующая программа компилятора называется «объектной программой» или «объектным кодом». Файл, в который она записана, обычно называется «объектным файлом». Даже в том случае, когда результирующая программа порождается на языке машинных команд, между объектной программой (объектным файлом) и исполняемой программой (исполняемым файлом) есть существенная разница. Порожденная компилятором программа не может непосредственно выполняться на компьютере, так как она не привязана к конкретной области памяти, где должны располагаться ее код и данные (более подробно — см. раздел «Принципы функционирования систем программирования», глава 15)2.
Компиляторы, безусловно, самый распространенный вид трансляторов (многие считают их вообще единственным видом трансляторов, хотя это не так). Они имеют самое широкое практическое применение, которым обязаны широкому распространению всевозможных языков программирования. Далее всегда будем говорить о компиляторах, подразумевая, что выходная программа написана на
1 B некоторых литературных источниках эти два понятия не разделяют между собой, хотя разница между ними все-таки существует.
2 Здесь есть еще один «подводный камень», связанный с терминологической путаницей. Термины «объектный код» и «объектный файл» возникли достаточно давно. Первоначально с ними не было связано никакихпроблем. Однако сейчас появилось понятие «объектно-ориентированное программирование» (а также анализ и проектирование), где под термином «объект» подразумевается совершенно иное, нежели в «объектном коде». Следует помнить, что «объектный код» никакого отношения к «объекту» с точки зрения объектно-ориентированного программирования не имеет! И хотя в результате компиляции программ, написанных на объектно-ориентированных языках, тоже получаются объектный код и объектные файлы, это никак не связывает между собой совершенно различные по смыслу термины.
языке машинных кодов или языке ассемблера (если это не так, то это будет специально указываться отдельно)1.
Естественно, трансляторы и компиляторы, как и все прочие программы, разрабатывает человек (люди) — обычно это группа разработчиков. B принципе они могли бы создавать его непосредственно на языке машинных команд, однако объем кода и данных современных компиляторов таков, что их создание на языке машинных команд практически невозможно в разумные сроки при разумных трудозатратах. Поэтому практически все современные компиляторы также создаются с помощью компиляторов (обычно в этой роли выступают предыдущие версии компиляторов той же фирмы-производителя). И в этом качестве компилятор является уже выходной программой для другого компилятора, которая ничем не лучше и не хуже всех прочих порождаемых выходных программ2.
