Открыть сервисСервис

Компилятор — программа трансляции кода

Компилятор — это программа, преобразующая исходный код, написанный на одном языке программирования (языке-источнике), в эквивалентный код на другом языке (языке-цели), как правило, в машинный код или байт-код. Компиляторы относятся к классу трансляторов и являются фундаментальным инструментом программного обеспечения: именно они делают возможным выполнение программ, написанных на высокоуровневых языках, на процессорах, понимающих только машинные инструкции.

История

Термин «компилятор» ввела в употребление Грейс Хоппер в 1952 году в контексте работы над языком A-0 для машины UNIVAC I. Ранее она же создала один из первых трансляторов — A-0 System, преобразовавший символические инструкции в машинный код. В 1957 году появился Fortran — первый широко используемый компилятор, разработанный командой Джона Бэкуса в IBM. В 1958 году был создан компилятор для языка ALGOL 58, а в 1960-х годах — для языков COBOL, Pascal и C. Компилятор для языка C, созданный Деннисом Ритчи в 1970-х годах, стал одним из самых влиятельных: он сопровождал развитие Unix и оказал сильное влияние на последующие компиляторы.

Принцип работы

Классический компилятор состоит из нескольких последовательных этапов (фаз):

  1. Лексический анализ — исходный текст разбивается на лексемы (токены): идентификаторы, ключевые слова, операторы, константы.
  2. Синтаксический анализ — по токенам строится синтаксическое дерево (AST), проверяется соответствие грамматике языка.
  3. Семантический анализ — проверяется смысловая корректность: типы, области видимости, объявления.
  4. Оптимизация — дерево или промежуточное представление преобразуется с целью улучшения характеристик итогового кода (устранение мёртвого кода, разворачивание циклов, встраивание функций).
  5. Генерация кода — создаётся целевой код: машинные инструкции, байт-код или текст на другом языке.

Многие компиляторы используют промежуточное представление (IR, intermediate representation), что упрощает поддержку нескольких целевых архитектур.

Классификация

По типу выходного кода:

  • Нативные компиляторы — генерируют машинный код для конкретной архитектуры (например, GCC, Clang, MSVC).
  • Кросс-компиляторы — генерируют код для архитектуры, отличной от той, на которой выполняется сама компиляция (широко используются при разработке встраиваемого ПО).
  • Компиляторы байт-кода — создают код для виртуальной машины (например, javac для Java, kotlinc для Kotlin, компилятор .NET).
  • Транспайлеры — компилируют исходный код одного высокоуровневого языка в другой (например, TypeScript в JavaScript, CoffeeScript в JavaScript).

По способу работы:

  • Однопроходные — обрабатывают исходный текст за один проход.
  • Многопроходные — выполняют несколько проходов, что позволяет проводить более глубокий анализ и оптимизацию.
  • JIT-компиляторы (компиляция «на лету») — компилируют код во время выполнения программы, часто сочетая интерпретацию и компиляцию (например, в виртуальных машинах Java и .NET).

Основные компиляторы

КомпиляторЯзыкРазработчик
GCCC, C++, Fortran и др.Проект GNU
Clang / LLVMC, C++, Objective-CПроект LLVM
MSVCC, C++Microsoft
javacJavaOracle
rustcRustПроект Rust
GHCHaskellПроект GHC

Компилятор и интерпретатор

Часто компилятор противопоставляется интерпретатору. Интерпретатор выполняет программу построчно, не создавая отдельного целевого файла, тогда как компилятор переводит программу целиком. На практике граница размыта: многие современные системы (Java, C#, Python с модулями PyPy) используют гибридные подходы — предварительную компиляцию с последующей интерпретацией или JIT-компиляцией.

Значение

Компиляторы лежат в основе современного программирования: они обеспечивают переносимость кода, производительность исполнения и возможность использования абстракций высокоуровневых языков. Разработка компиляторов — направление информатики, связанное с формальной грамматикой, теорией автоматов, оптимизацией и аппаратным обеспечением. В России компиляторная техника преподаётся в ведущих технических вузах, а отечественные разработки используются, в частности, в системах программирования для специализированных процессорных архитектур.

Источники:

Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru