суббота, 31 июля 2010 г.

Компиляторы. Интерпретаторы. Что есть что.

Попросту говоря, компилятор это программа, которая считывает текст про­граммы, написанной на одном языке исходном, и транслирует (переводит) его в эквивалентный текст на другом языке целевом (рис. 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. Опишите некоторые из задач, которые должен выполнять ас­семблер.

Комментариев нет:

Отправить комментарий