Попросту говоря,
компилятор —
это программа, которая считывает текст
программы,
написанной на одном языке — исходном, и транслирует (переводит) его в
эквивалентный текст на другом языке — целевом (рис. 1.1). Одна из важных ролей
компилятора состоит в сообщении об ошибках
в исходной программе, обнаруженных в процессе
трансляции.
Если целевая программа
представляет собой программу на машинном
языке, она затем может быть вызвана
пользователем для обработки некоторых
входных данных и получения некоторых
выходных данных (рис. 1.2).
Интерпретатор представляет собой еще один
распространенный вид языкового процессора.
Вместо получения целевой программы, как в
случае транслятора, интерпретатор непосредственно
выполняет операции, указанные в исходной
программе, над входными данными,
предоставляемыми пользователем (рис.
1.3).

Целевая программа на
машинном языке, производимая компилятором,
обычно гораздо
быстрее, чем интерпретатор, получает
выходные данные на основании входных.
Однако интерпретатор обычно обладает
лучшими способностями к диагностике ошибок, чем
компилятор, поскольку он выполняет
исходную программу инструкция за
инструкцией.
Пример 1.1.
Языковой процессор Java объединяет в себе и
компиляцию, и интерпретацию (рис. 1.4). Исходная программа
на Java может сначала компилироваться в
промежуточный вид, именуемый байт-кодом
(bytecode). Затем байт-код интерпретируется
виртуальной машиной. Преимущество такого
решения в том, что скомпилированный на
одной машине байт-код может быть выполнен
на другой, например, будучи передан по
сети.

Для более быстрой
обработки входных данных некоторые
компиляторы Java, именуемые
just-in-time-компиляторами, транслируют байт-код
в машинный язык непосредственно перед
запуском промежуточной программы для
обработки входных данных.
Кроме компиляторов,
потребовать создания выполнимой целевой
программы могут и другие программы (рис. 1.5).
Исходная программа может быть разделена на модули,
находящиеся в различных файлах. Сборка
исходной программы иногда поручается
отдельной программе, именуемой препроцессором.
Препроцессор может также раскрывать
сокращения, именуемые макросами, в
инструкции исходного языка.
Исходная
программа

Целевой машинный
код
Рис. 1.5. Система
обработки языка
Модифицированная
исходная программа затем передается
компилятору. Компилятор может выдать в качестве
выходных данных программу на языке
ассемблера,
поскольку ассемблерный код легче создать и
проще отлаживать. Язык ассемблера затем
обрабатывается программой, которая
называется ассемблер, и дает в качестве выходных данных
перемещаемый машинный код.
Большие программы
зачастую компилируются по частям, так что
перемещаемый
машинный код должен быть скомпонован
совместно с другими перемещаемыми объектными
файлами и библиотечными файлами в код,
который можно будет выполнять на данной
машине. Компоновщик ("линкер") выполняет разрешение внешних адресов
памяти, по которым код из одного файла
может обращаться к информации из другого
файла. Загрузчик затем помещает все выполнимые
объектные
файлы в память для выполнения.
Упражнения.
Упражнение 1.1.1. В чем заключается разница между
компилятором и интерпретатором?
Упражнение 1.1.2. Каковы преимущества (а) компилятора
перед интерпретатором и (б) интерпретатора перед
компилятором?
Упражнение 1.1.3. Каковы преимущества системы
обработки языка, в которой компилятор дает
выход на языке ассемблера, по сравнению с
системой, в которой компилятор дает выход
на машинном языке?
Упражнение 1.1.4. Компилятор, который транслирует
программу на высокоуровневом языке
программирования в программу на другом
высокоуровневом языке программирования, называется
транслятором из исходного текста в
исходный текст (source-to-source). Каковы
преимущества использования языка
программирования С в качестве целевого для
такого компилятора?
Упражнение 1.1.5. Опишите некоторые из задач, которые
должен выполнять ассемблер.
Комментариев нет:
Отправить комментарий