Генерация кода (компилятор)

редактировать
Обработать по который генератор кода компилятора преобразует некоторое промежуточное представление исходного кода в форму, которая может быть легко выполнена машиной

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

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

Входные данные для генератора кода обычно состоят из дерева синтаксического анализа или абстрактного синтаксического дерева. Дерево преобразуется в линейную последовательность инструкций, обычно на промежуточном языке, таком как трехадресный код. Дальнейшие этапы компиляции могут или не могут называться «генерацией кода», в зависимости от того, включают ли они значительные изменения в представлении программы. (Например, этап оптимизации с помощью глазка вряд ли будет называться «генерацией кода», хотя генератор кода может включать этап оптимизации с помощью глазка.)

Содержание

  • 1 Основные задачи
  • 2 Генерация кода среды выполнения
  • 3 Понятия, связанные с данным
    • 3.1 Отражение
  • 4 См. Также
  • 5 Ссылки

Основные задачи

В дополнение к базовому преобразованию из промежуточного представления в линейную последовательность машинных инструкций типичный генератор кода пытается каким-то образом оптимизировать сгенерированный код.

Задачи, которые обычно являются частью фазы «генерации кода» сложного компилятора, включают:

Выбор инструкций обычно выполняется путем рекурсивного обхода после порядка в абстрактном синтаксическом дереве, сопоставляя конкретные конфигурации дерева по шаблонам; например, дерево W: = ADD (X, MUL (Y, Z))может быть преобразовано в линейную последовательность инструкций путем рекурсивной генерации последовательностей для t1: = Xи t2: = MUL (Y, Z), а затем выдача инструкции ADD W, t1, t2.

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

Генерация кода времени выполнения

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

Понятия, связанные с данной

Фундаментальную задачу ввода ввода на одном языке и вывода вывода на нетривиально другом языке можно понять в терминах основных трансформационных операций формальная теория языка. Следовательно, некоторые методы, которые изначально были разработаны для использования в компиляторах, стали использоваться и другими способами. Например, YACC (еще один компилятор компилятора ) принимает входные данные в форме Бэкуса-Наура и преобразует их в синтаксический анализатор на C. Хотя изначально он был создан для автоматического создания парсера для компилятора, yacc также часто используется для автоматизации написания кода, который необходимо изменять каждый раз при изменении спецификаций.

Многие интегрированные среды разработки (IDE) поддерживают некоторую форму автоматического генерации исходного кода, часто используя алгоритмы, общие с генераторами кода компилятора, хотя обычно менее сложные. (См. Также: Преобразование программы, Преобразование данных.)

Отражение

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

См. Также

Ссылки

Последняя правка сделана 2021-05-15 13:39:39
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте