Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

LLVM

Глава 11 из книги "Архитектура приложений с открытым исходным кодом", том 1.

Оригинал: LLVM
Автор: Chris Lattner
Дата публикации: 7 Июля 2012 г.
Перевод: А.Панин
Дата перевода: 14 Марта 2013 г.

11.1 Краткое описание классической архитектуры компиляторов

Наиболее популярной архитектурой традиционных статических компиляторов (большинства компиляторов языка C) является архитектура трех фаз, главными элементами которой являются система предварительной обработки, оптимизатор и система генерации кода (Рисунок 11.1). Система предварительной обработки производит разбор исходного кода, проверяет его на наличие ошибок, и строит специфическое для языка дерево абстрактного синтаксического анализа (Abstract Syntax Tree - AST) с целью представления исходного кода. В некоторых случаях дерево абстрактного синтаксического анализа конвертируется в новое представление для оптимизации, после чего оптимизатор и система генерации кода работают с кодом.

Три основных компонента компилятора на основе архитектуры трех фаз
Рисунок 11.1: Три основных компонента компилятора на основе архитектуры трех фаз

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

Эта модель также отлично подходит к интерпретаторам и JIT-компиляторам. Виртуальная машина Java (JVM) также реализует данную модель, используя байткод при взаимодействии системы предварительной обработки и оптимизатора.

11.1.1 Последствия использования данной архитектуры

Наиболее важное достоинство данной архитектуры проявляется в том случае, когда от компилятора требуется поддержка нескольких языков программирования или нескольких целевых архитектур. Если компилятор использует стандартное представление кода при работе с оптимизатором, может быть разработана система предварительной обработки кода для любого языка программирования, для которого возможно преобразование кода в это представление, а также может быть разработана система генерации кода для любой целевой архитектуры, для которой может быть сгенерирован код на основе этого представления, как показано на Рисунке 11.2.

Многоцелевой компилятор
Рисунок 11.2: Многоцелевой компилятор

При использовании этой архитектуры доработка компилятора для поддержки нового языка (такого, как Algol или BASIC) требует реализации новой систем предварительной обработки кода, а оптимизатор и система генерации кода могут использоваться повторно. Если бы эти части не были разделены, реализация поддержки нового языка потребовала бы разработки нового компилятора, поэтому для поддержки N целевых архитектур и M языков программирования потребовалось бы M*N компиляторов.

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

Заключительным важным достоинством архитектуры трех фаз является то обстоятельство, что навыки, требуемые для разработки системы предварительной обработки кода отличаются от навыков, требуемых для разработки оптимизатора и системы генерации кода. Разделение этих систем упрощает работу участника, поддерживающего одну из систем предварительной обработки кода. Хотя это больше относится к социальным условиям, нежели к техническим, на самом деле это очень важно в особенности для проектов с открытым исходным кодом, разработчики которых хотят снизить барьер для вхождения новых разработчиков в проект настолько, насколько это возможно.


Далее: 11.2. Существующие реализации языков программирования