Создание компилятора языка для .NET Framework - Высокоуровневая архитектура

ОГЛАВЛЕНИЕ

Высокоуровневая архитектура

Задачей компилятора является превращение высокоуровневых задач, созданных программистом, в задачи, которые процессор компьютера может понять и выполнить. Другими словами, он берет программу, написанную на языке Good for Nothing и преобразует ее в нечто, что может быть выполнено .NET CLR. Компилятор достигает это через серию этапов перевода, разбивая язык на имеющие значение части и выкидывая прочее. Компиляторы следуют распространенным принципам разработки программного обеспечения – слабо связанные компоненты, именуемые фазами, подключенные друг другу для выполнения этапов перевода. рис. 2 демонстрирует компоненты, выполняющие фазы компиляции: сканер, анализатор и генератор кода. В каждой фазе, язык последовательно разбивается на компоненты и эта информация о намерениях программы передается следующей фазе.

Рис. 2 Фазы компилятора.

Компиляторщики часто используют абстрактное разделение фаз на фазы предварительной обработки и конечные фазы. Первые включают в себя сканирование и анализ, тогда как вторые обычно состоят из создания кода. Задачей фазы предварительной обработки является обнаружение синтаксической структуры программы и перевод ее из текста в высокоуровневое представление в памяти, именуемое деревом абстрактного синтаксиса (Abstract Syntax Tree – AST), о котором я расскажу подробнее чуть ниже. Задачей конечных фаз является взятие AST и преобразование его в нечто, пригодное для исполнения компьютером.

Три фазы обычно разделяются на фазы предварительной обработки и конечные, поскольку сканеры и анализаторы часто соединены, тогда как генератор кода обычно тесно привязан к целевой платформе. Такая схема позволяет разработчику менять генератор года в зависимости от платформы, если язык должен быть межплатформенным.
Я сделал код для компилятора Good for Nothing доступным в сопровождающем эту статью загружаемом файле. Читатели могут проследить мое продвижение по компонентам каждой фазы и исследовать подробности реализации.