- •Тема 2. Основные принципы построения трансляторов
- •Трансляторы, компиляторы и интерпретаторы - общая схема работы
- •Формальное определение транслятора
- •Определение компилятора. Отличие компилятора от транслятора
- •Многопроходные и однопроходные компиляторы
- •Определение интерпретатора. Разница между интерпретаторами и трансляторами
- •Трансляция в ассемблер
- •Методики создания компилятора
- •Метод раскрутки
- •Кросс-транслятор
- •Виртуальная машина
- •Компиляция "на лету"
- •Этапы трансляции. Общая схема работы транслятора
- •Лексический анализ
- •Синтаксический анализ
- •Семантический анализ
- •Оптимизация кода
- •Генерация кода
- •Просмотры
Определение компилятора. Отличие компилятора от транслятора
Кроме понятия «транслятор» широко употребляется также близкое ему по смыслу понятие «компилятор». Само слово «компилятор» происходит от английского термина «compiler» («составитель», «компоновщик»). Термин обязан своему происхождению способности компиляторов составлять объектную программу из фрагментов машинных кодов, соответствующих синтаксическим конструкциям исходной программы.
Компилятор — это транслятор, который осуществляет перевод исходной программы в эквивалентную ей результирующую программу на языке машинных команд или на языке ассемблера.
Таким образом, компилятор отличается от транслятора лишь тем, что его резульирующая программа всегда должна быть написана на языке машинных кодов или на языке ассемблера в то время как результирующая программа транслятора, в общем случае, может быть написана на любом языке, например, — возможен транслятор программ с языка Pascal на язык С.
Однажды полученная в результате компиляции целевая программа может в дальнейшем выполняться много раз с различными входными данными.
Результирующая программа компилятора называется объектной программой, или объектным кодом, а исходную программу в этом случае часто называют исходным кодом. Файл, в который записана объектная программа, обычно называется объектным файлом. Даже в том случае, когда результирующая программа порождается на языке машинных команд, между объектной программой (объектным файлом) и исполняемой программой (исполняемым файлом) есть существенная разница. Порожденная компилятором программа не может непосредственно выполняться на компьютере (так как требует разрешения внешних ссылок и компоновки модулей).
Процесс компиляции и последующего выполнения программы можно изобразить следующим образом (рис. 2.2):
Рис. 2.2. Схема работы компилятора
Результирующая программа, созданная компилятором, обязательно ориентирована на определенную вычислительную систему, и, следовательно, всегда предназначена для выполнения на вычислительной системе с определенной архитектурой.
ПРИМЕЧАНИЕ. Следует упомянуть, что в современных системах программирования существуют компиляторы, в которых результирующая программа создается на некотором промежуточном языке. Сам мо себе этот промежуточный язык не может непосредственно исполняться на компьютере, а требует специального промежуточного интерпретатора для выполнения написанным на нем программ. Хотя в данном случае термин «транслятор» был бы, наверное, более правильным, в литературе употребляется понятие «компилятор», поскольку промежуточный язык является языком очень низкого уровня, будучи родственным машинным командам и языкам ассемблера.
Вычислительная система, на которой выполняется результирующая (объектная) программа, созданная компилятором, называется целевой вычислительной системой. В понятие целевой вычислительной системы входит не только архитектура аппаратных средств компьютера, но и операционная система, а зачастую также и набор динамически подключаемых библиотек, которые необходимы для выполнения объектной программы.
Целевая вычислительная система не обязательно является той же вычислительной системой, на которой работает сам компилятор. Часто они совпадают, но бывает так, что компилятор работает под управлением вычислительной системы одного типа, а строит объектные программы, предназначенные для выполнения на вычислительных системах совсем другого типа (кросс-трансляторы).
Целевая программа может быть:
последовательностью абсолютных машинных команд,
последовательностью перемещаемых машинных команд,
программой на языке ассемблера,
программой на некотором другом языке низкого уровня.
Наиболее эффективным методом с точки зрения скорости компиляции является отображение исходной программы в абсолютную программу на машинном языке, пригодную для непосредственного исполнения. Такой тип компиляции больше всего подходит для небольших программ, не использующих независимо компилируемых подпрограмм.
Однако для более сложных программ необходимо создавать объектные программы в форме последовательности перемещаемых машинных команд. Перемещаемая машинная команда представляет собой команду, в которой адресация ячеек памяти производится относительно некоторого подвижного начала. Объектную программу называют также перемещаемым объектным сегментом. Этот сегмент может быть связан с другими сегментами, такими, как независимо компилируемые подпрограммы пользователя, подпрограммы ввода-вывода и библиотечные функции. Такое связывание (binding), то есть создание единого перемещаемого объектного сегмента из набора различных сегментов, осуществляется программой, которая называется редактором связей (linkage editor). Далее единый перемещаемый объектный сегмент или модуль загрузки размещается в памяти программой, называемой загрузчиком (loader), которая превращает перемещаемые адреса в абсолютные. После этого программа готова к выполнению. Приведенная схема связывания называется статическим связыванием (static binding).
В настоящее время часто используется также динамическое связывание (dynamic binding). Это означает, что объектный сегмент не включается в единый перемещаемый объектный сегмент до тех пор, пока не произойдет обращение к этому сегменту. Выбор статического или динамического связывания зависит от операционной системы. Заметим, что динамическое связывание часто используется для того, чтобы разрешить нескольким выполняемым программам разделять одну копию подпрограммы.
