В программировании , реализация языка программирования представляет собой систему для выполнения компьютерных программ . Существует два общих подхода к реализации языка программирования: [1]
Интерпретатор состоит из двух частей: парсера и оценщика . После того, как программа прочитана как входные данные интерпретатором, она обрабатывается парсером. Парсер разбивает программу на языковые компоненты , чтобы сформировать дерево синтаксического анализа . Затем оценщик использует дерево синтаксического анализа для выполнения программы. [3]
Виртуальная машина — это особый тип интерпретатора, который интерпретирует байт-код. [2] Байт-код — это переносимый низкоуровневый код, похожий на машинный код, хотя он обычно выполняется на виртуальной машине, а не на физической. [4] Для повышения эффективности многие языки программирования, такие как Java , [4] Python , [5] и C# [6], компилируются в байт-код перед интерпретацией.
Некоторые виртуальные машины включают в себя компилятор just-in-time (JIT) для повышения эффективности выполнения байт-кода. Если во время выполнения байт-кода виртуальной машиной JIT-компилятор определяет, что часть байт-кода будет использоваться повторно, он компилирует эту конкретную часть в машинный код. Затем JIT-компилятор сохраняет машинный код в памяти , чтобы его могла использовать виртуальная машина. JIT-компиляторы пытаются найти баланс между более длительным временем компиляции и более быстрым временем выполнения. [2]
Компилятор переводит программу, написанную на одном языке, на другой язык. Большинство компиляторов организованы в три этапа: front end , an optimizer и back end . Front end отвечает за понимание программы. Он проверяет, что программа является допустимой, и преобразует ее в промежуточное представление , структуру данных, используемую компилятором для представления программы. Оптимизатор улучшает промежуточное представление, чтобы увеличить скорость или уменьшить размер исполняемого файла , который в конечном итоге создается компилятором. Back end преобразует оптимизированное промежуточное представление в выходной язык компилятора. [7]
Если компилятор данного языка высокого уровня создает другой язык высокого уровня, он называется транспилятором . Транспиляторы могут использоваться для расширения существующих языков или для упрощения разработки компиляторов путем использования переносимых и хорошо оптимизированных реализаций других языков (например, C ). [2]
Возможны многие комбинации интерпретации и компиляции, и многие современные реализации языков программирования включают элементы обоих. Например, язык программирования Smalltalk традиционно реализуется путем компиляции в байт-код , который затем либо интерпретируется, либо компилируется виртуальной машиной . Поскольку байт-код Smalltalk выполняется на виртуальной машине, он переносим на различные аппаратные платформы. [8]
Языки программирования могут иметь несколько реализаций. Различные реализации могут быть написаны на разных языках и могут использовать разные методы для компиляции или интерпретации кода. Например, реализации Python включают: [9]