Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТЯП-2 Основные принципы построения трансляторов...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆
  1. Определение компилятора. Отличие компилятора от транслятора

Кроме понятия «транслятор» широко употребляется также близкое ему по смыс­лу понятие «компилятор». Само слово «компилятор» происходит от английского термина «compiler» («со­ставитель», «компоновщик»). Термин обязан своему происхождению способно­сти компиляторов составлять объектную программу из фрагментов машинных кодов, соответствующих синтаксическим конструкциям исходной программы.

  1. Компилятор — это транслятор, который осуществляет перевод исходной програм­мы в эквивалентную ей результирующую программу на языке машинных команд или на языке ассемблера.

Таким образом, компилятор отличается от транслятора лишь тем, что его резульирующая программа всегда должна быть написана на языке машинных кодов или на языке ассемблера в то время как результирующая программа транслятора, в общем слу­чае, может быть написана на любом языке, например, — возможен транслятор программ с языка Pascal на язык С.

Однажды полученная в результате компиляции целевая программа может в дальнейшем выполняться много раз с различными входными данными.

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

Процесс компиляции и последующего выполнения программы можно изобразить следующим образом (рис. 2.2):

Рис. 2.2. Схема работы компилятора

Результирующая программа, созданная компилятором, обязательно ориентирована на определенную вычислительную систему, и, следовательно, всегда предназначена для выполнения на вычислительной систе­ме с определенной архитектурой.

ПРИМЕЧАНИЕ. Следует упомянуть, что в современных системах программирования существуют компиляторы, в которых результирующая программа создается на некотором промежуточном языке. Сам мо себе этот промежуточный язык не может непосредственно исполняться на ком­пьютере, а требует специального промежуточного интерпретатора для выполнения написанным на нем программ. Хотя в данном случае термин «транслятор» был бы, наверное, более правильным, в литературе употребляется понятие «компилятор», поскольку промежуточный язык является языком очень низкого уровня, будучи родственным машинным командам и языкам ассемблера.

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

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

Целевая программа может быть:

  • последовательностью абсолютных машинных команд,

  • последовательностью перемещаемых машинных команд,

  • программой на языке ассемблера,

  • программой на некотором другом языке низкого уровня.

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

Однако для более сложных программ необходимо создавать объектные программы в форме последовательности перемещаемых машинных команд. Перемещаемая машинная команда представляет собой команду, в которой адресация ячеек памяти производится относительно некоторого подвижного начала. Объектную программу называют также перемещаемым объектным сегментом. Этот сегмент может быть связан с другими сегментами, такими, как независимо компилируемые подпрограммы пользователя, подпрограммы ввода-вывода и библиотечные функции. Такое связывание (binding), то есть создание единого перемещаемого объектного сегмента из набора различных сегментов, осуществляется программой, которая называется редактором связей (linkage editor). Далее единый перемещаемый объектный сегмент или модуль загрузки размещается в памяти программой, называемой загрузчиком (loader), которая превращает перемещаемые адреса в абсолютные. После этого программа готова к выполнению. Приведенная схема связывания называется статическим связыванием (static binding).

В настоящее время часто используется также динамическое связывание (dynamic binding). Это означает, что объектный сегмент не включается в единый перемещаемый объектный сегмент до тех пор, пока не произойдет обращение к этому сегменту. Выбор статического или динамического связывания зависит от операционной системы. Заметим, что динамическое связывание часто используется для того, чтобы разрешить нескольким выполняемым программам разделять одну копию подпрограммы.