Компилятор — программа трансляции кода¶
Компилятор — это программа, преобразующая исходный код, написанный на одном языке программирования (языке-источнике), в эквивалентный код на другом языке (языке-цели), как правило, в машинный код или байт-код. Компиляторы относятся к классу трансляторов и являются фундаментальным инструментом программного обеспечения: именно они делают возможным выполнение программ, написанных на высокоуровневых языках, на процессорах, понимающих только машинные инструкции.
¶История
Термин «компилятор» ввела в употребление Грейс Хоппер в 1952 году в контексте работы над языком A-0 для машины UNIVAC I. Ранее она же создала один из первых трансляторов — A-0 System, преобразовавший символические инструкции в машинный код. В 1957 году появился Fortran — первый широко используемый компилятор, разработанный командой Джона Бэкуса в IBM. В 1958 году был создан компилятор для языка ALGOL 58, а в 1960-х годах — для языков COBOL, Pascal и C. Компилятор для языка C, созданный Деннисом Ритчи в 1970-х годах, стал одним из самых влиятельных: он сопровождал развитие Unix и оказал сильное влияние на последующие компиляторы.
¶Принцип работы
Классический компилятор состоит из нескольких последовательных этапов (фаз):
- Лексический анализ — исходный текст разбивается на лексемы (токены): идентификаторы, ключевые слова, операторы, константы.
- Синтаксический анализ — по токенам строится синтаксическое дерево (AST), проверяется соответствие грамматике языка.
- Семантический анализ — проверяется смысловая корректность: типы, области видимости, объявления.
- Оптимизация — дерево или промежуточное представление преобразуется с целью улучшения характеристик итогового кода (устранение мёртвого кода, разворачивание циклов, встраивание функций).
- Генерация кода — создаётся целевой код: машинные инструкции, байт-код или текст на другом языке.
Многие компиляторы используют промежуточное представление (IR, intermediate representation), что упрощает поддержку нескольких целевых архитектур.
¶Классификация
По типу выходного кода:
- Нативные компиляторы — генерируют машинный код для конкретной архитектуры (например, GCC, Clang, MSVC).
- Кросс-компиляторы — генерируют код для архитектуры, отличной от той, на которой выполняется сама компиляция (широко используются при разработке встраиваемого ПО).
- Компиляторы байт-кода — создают код для виртуальной машины (например, javac для Java, kotlinc для Kotlin, компилятор .NET).
- Транспайлеры — компилируют исходный код одного высокоуровневого языка в другой (например, TypeScript в JavaScript, CoffeeScript в JavaScript).
По способу работы:
- Однопроходные — обрабатывают исходный текст за один проход.
- Многопроходные — выполняют несколько проходов, что позволяет проводить более глубокий анализ и оптимизацию.
- JIT-компиляторы (компиляция «на лету») — компилируют код во время выполнения программы, часто сочетая интерпретацию и компиляцию (например, в виртуальных машинах Java и .NET).
¶Основные компиляторы
| Компилятор | Язык | Разработчик |
|---|---|---|
| GCC | C, C++, Fortran и др. | Проект GNU |
| Clang / LLVM | C, C++, Objective-C | Проект LLVM |
| MSVC | C, C++ | Microsoft |
| javac | Java | Oracle |
| rustc | Rust | Проект Rust |
| GHC | Haskell | Проект GHC |
¶Компилятор и интерпретатор
Часто компилятор противопоставляется интерпретатору. Интерпретатор выполняет программу построчно, не создавая отдельного целевого файла, тогда как компилятор переводит программу целиком. На практике граница размыта: многие современные системы (Java, C#, Python с модулями PyPy) используют гибридные подходы — предварительную компиляцию с последующей интерпретацией или JIT-компиляцией.
¶Значение
Компиляторы лежат в основе современного программирования: они обеспечивают переносимость кода, производительность исполнения и возможность использования абстракций высокоуровневых языков. Разработка компиляторов — направление информатики, связанное с формальной грамматикой, теорией автоматов, оптимизацией и аппаратным обеспечением. В России компиляторная техника преподаётся в ведущих технических вузах, а отечественные разработки используются, в частности, в системах программирования для специализированных процессорных архитектур.
Источники:
- «Компиляторы: принципы, технологии и инструменты» — А. Ахо, М. Лам, Р. Сети, Д. Ульман
- «Дизайн и реализация компиляторов» — С. С. Липпман
- Статья «Compiler» в Wikipedia
- Документация проектов GCC, LLVM и Rust
