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