Обзор предметной области

Компилятор – программа, способная получать на вход код программы, написанной на одном (исходном) языке и транслировать его в код эквивалентной программы на другом (целевом) языке. Важной ролью компилятора является обнаружение ошибок во время трансляции кода исходной программы и сообщение о них пользователю. Если целевая программа является машиночитаемой (исполняемой компьютером), она может быть вызвана пользователем для обработки входных и получения выходных данных. Этот подход используется в таких языках программирования, как Си, C++, Go и т. д.

Интерпретатор – это другой распространённый вид программ для обработки языков. Вместо создания целевой программы в процессе трансляции интерпретатор непосредственно выполняет операции, указанные в коде исходной программы, с использованием предоставленных пользователем входных данных. Интерпретируемыми языками являются, например, Python, PHP, JavaScript и т. д.

Стоит отметить, что целевая программа, предварительно транслированная с помощью компилятора, выполняется, как правило, быстрее в сравнении с исполнением при помощи интерпретатора. Интерпретатор, тем не менее, обычно может предоставить более подробную диагностику в случае возникновения ошибок, чем это способен сделать компилятор, поскольку интерпретация подразумевает выполнение программы «построчно».

Вдобавок к описанному способу компиляции, называемому AOT-компиляцией (от. англ. ahead-of-time – заранее), существует подход, называемый JIT-компиляцией (от англ. just-in-time – во время). В этом случае компиляция происходит непосредственно перед началом исполнения программы. Технология JIT основывается на компиляции байт-кода и динамической компиляции.

Для разработки компиляторов существуют различные инструменты, облегчающие создание компонентов компилятора, например:

  • генераторы синтаксических анализаторов – для создания синтаксических анализаторов на основе имеющегося описания грамматики языка в некоторой форме (например, GNU Bison, yacc);

  • генераторы лексических анализаторов – для создания лексических анализаторов на основе имеющегося описания лексем (слов) языка в виде набор регулярных выражений (например, flex);

  • генераторы генераторов кода – для создания генераторов кода на основе имеющегося набора правил трансляции каждой операции на некотором промежуточном языке в машинный код, распознаваемый целевой платформой (исполнителем) (например, LLVM);

  • инструменты для анализа графов потоков управления – для упрощения сбора информации о продвижении данных в множестве путей выполнения программы, может использоваться для оптимизации программы во время компиляции (например, aiSee);

  • наборы инструментов для создания компиляторов, предоставляющие вспомогательные средства для реализации различных компонентов (например, LLVM, Coco/R).

Назад