Основные составляющие: - Структура программы - Смысл программы Аналогия с человеком: предложение → человек → смысл предложения Теория построения трансляторов в значительной части посвящена методам выявления структуры входного текста и определения смысла этого текста в соответствии со структурой. Все это базируется на идеях, высказанных Хомским в середине XX века. Согласно этим идеям, смысл текста связан с его структурой. Односмысленные тексты имеют одну структуру, а двусмысленные тексты имеют несколько структур. Но и для тех и для других смысл всегда определяется его структурой. **Транслятор (переводчик)** - это программа, которая переводит входную программу на исходном языке в эквивалентную ей выходную программу на результирующем языке (с одного языка программирования на другой, например с Паскаля на C). **Компилятор (компоновщик)** - это программа, которая осуществляет перевод исходной программы в эквивалентную ей объектную программу на языке ассемблера (результат - объектный код). Исходный код → компилятор → объектный код Всякий компилятор является транслятором, но не наоборот. ## Этапы и фазы компилятора Этапы компиляции: - **Анализ** - разбиение исходной программы на составные части и создание ее промежуточного представления - Лексический анализ - Синтаксический анализ - Семантический анализ - **Синтез** - конструирование требуемой целевой программы из промежуточного представления - Генерация промежуточного кода - Оптимизация кода - Генерация итогового кода В процессе компиляции строится **таблица идентификаторов (символов)** - специальным образом организованный набор данных, служащий для хранения информации об элементах исходной программы, которая может быть использована на разных этапах и для порождения текста результирующей программы. Во время работы всех этапов осуществляется обработка ошибок. Порядок и состав фаз может меняться в разных компиляторах. ## Однопроходный и многопроходный компиляторы **Проход** - это процесс последовательного чтения компилятором данных из внешней памяти, их обработки и помещения результата в конечном файле **Однопроходный компилятор** выполняет все фазы компиляции сразу и получает итоговый код **Многопроходный компилятор** в результате одного прохода выполняет только некоторые фазы, получает промежуточное представление; в результате следующего прохода выполняются следующие фазы, снова получает промежуточное представление, и так может повторяться несколько раз Информация о количестве проходов для пользователя недоступна (да и не нужна). Чаще всего компиляторы являются двух- или трехпроходными. Количество необходимых проходов определяется прежде всего грамматикой и семантикой исходного языка. Чем сложнее грамматика, тем больше проходов требуется компилятору. Поэтому, например, компилятор языка C работает дольше, чем компилятор языка Паскаль.