Нижегородский государственный университет им. Н.И. Лобачевского Компилятор ETH Zonnon для .NET Compiler Project По материалам презентации Е.А. Зуева. Москва, 2003 1 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Язык Zonnon Авторы Jürg Gutknecht, ETH Zürich Евгений Зуев, ETH Zürich Первый компилятор с языка Zonnon для платформы .NET реализован в Швейцарском федеральном технологическом институте Евгением Зуевым 2 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» План Проблемы исследовательских языков и компиляторов Компилятор ETH Zonnon Технология CCI Интеграция в VS 3 Нижегородский государственный университет им. Н.И. Лобачевского Исследовательские языки на платформе .NET По материалам презентации Nick Benton, Microsoft Research, Cambridge UK ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Языки программирования C, C++, Visual Basic, Java, JScript, Perl, Cobol,... подходят для большинства коммерческих и индустриальных проектов Но содержат в себе только часть существующих разработок в области языков программирования 5 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Проблема Для разработчиков языков программирования Большой объем работы, которую нужно выполнить для реализации компилятора для нового язык. Большая часть которой не является специфичной для него как: Сборка мусора Многопоточность Линковка Среда разработки Машинно-зависимые оптимизации И если вы хотите что-либо делать на новом языке, то вам нужно реализовать богатую стандартную библиотеку 6 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Проблема Для разработчиков Библиотеки и межъязыковое взаимодействие в исследовательских компиляторах никогда не бывают достаточно хороши. Склеивание нового кода со старым приводит Созданию автоконвертаторов Общее низкоуровневое представление … В итоге считается что лучше всё писать на C++ Среда разработки также редко бывает сильно продвинутой. 7 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Решение .NET Common Language Runtime предоставляет богатый набор сервисов для разработчиков компиляторов Таким образом становится гораздо проще создать работающую систему с хорошей производительностью Предоставляет естественную систему типов, менеджер памяти, загрузчик, и т.д. упрощая межъязыковое взаимодействие Вы можете обращаться к широко используемым библиотекам и компонентам приложений написанным на других языках напрямую 8 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Исследовательские языки и платформа .NET Microsoft работает с ведущими исследователями в области языков программирования по всему миру Перенцацеливание их любимых языков на платформу .NET Демонстрация межъязыкового взаимодействия 9 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Haskell Oz Caml Mercury Standard ML Component Pascal Lightning Oberon Scheme Eiffel 10 Нижегородский государственный университет им. Н.И. Лобачевского Компилятор Zonnon для .NET По материалам презентации Е.А. Зуева. Москва, 2003 11 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Задачи проекта ETH Zonnon Compiler • Реализовать базовую версию компилятора для платформы Microsoft .NET: - подмножество входного языка; - генерация MSIL-кода в полном формате; - режим командной строки. • Обеспечить полную интеграцию компилятора со средой разработки MS Visual Studio .NET: - текстовый редактор; - фоновая компиляция; - управление проектами; - отладчик etc. • Выполнить “раскрутку” (bootstrapping) полного компилятора на языке Zonnon. 12 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Компилятор Zonnon • • • • • Реализован для платформы .NET Генерирует стандартную сборку (Assembly) Реализован с использованием пакета CCI Интегрирован в среду MS Visual Studio .NET Создан в ETH Zürich, Switzerland Source Code Zonnon Compiler Assembly CCI Framework .NET Platform Visual Studio 13 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Компиляторы для .NET: возможные подходы • Непосредственная («ручная») компиляция в MSIL/Metadata (нет примеров) или в язык ассемблера MSIL («toy compilers»). • Использование «родного» для .NET языка (напр. C#) в качестве промежуточного (Eiffel) • Генерация MSIL-кода средствами низкого уровня из пространств имен System.Reflection и System.Reflection.Emit (Component Pascal, авт. John Gough; Oberon.NET) • Высокоуровневая поддержка - CCI: построение дерева программы с (полу)автоматической генерацией IL+MD (ASML, Zonnon for .NET). 14 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Модель компиляции Zonnon IL/MD Writer Source IR (AST) Scanner & Parser MSIL+MD Output Assembly IL/MD Reader Visitors Imported Assemblies Zonnon-часть: Cпецифична для языка CCI-часть: Общая для всех языков 15 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Модель компиляции Zonnon Scanner & Parser Visitors IR (AST) Проекции Zonnon AST Реализуется семантическая специфика Zonnon; Выполняется сериализация «интерфейсной» части AST для последующей статической комплексации в собственных терминах языка CCI’s AST Проекции (mappings): отображение специфических свойств Zonnon на семантически эквивалентные 16 структуры .NET ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Проекции Zonnon -> .NET DEFINITION абстрактный интерфейс; interface IMPLEMENTATION реализация интерфейса по умолчанию; единица агрегации; class OBJECT шаблон (класс), реализующий интерфейс; возможно, «активный» объект; sealed class MODULE контейнер ресурсов; класс, управляемый системой; class with static members 17 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Проекции Zonnon->.NET: Definitions & Implementations Zonnon DEFINITION D; TYPE e = (a, b); VAR x: T; PROCEDURE f (t:T); PROCEDURE g ():T; END D; IMPLEMENTATION D; VAR y: T; PROCEDURE f (t: T); BEGIN x := t; y := t END f; END D; C# interface D_i { T x { get; set; } void f(T t); T g (); }; internal class D_b: D_i { private T x_b; public enum e = (a, b); public T x { get { return x_b }; set { x_b = ... }}}; public class D_c: D_b { T y; void f(T t) { x_b = t; y = t; } }; 18 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Проекции Zonnon->.NET: Objects Zonnon OBJECT X IMPLEMENTS D; IMPORT D; VAR y : T; PROCEDURE g (): T IMPLEMENTS D.g; BEGIN y := D.x; RETURN D.y C# END g; public sealed class X: D_I END X; { D_c d; T y; Проекция с отдельным public override T g() { helper-классом y = d.x; return d.y; } } Проекция с базовым классом public sealed class X: D_i, D_c d; { T y; public override T g() { y = x_b; return y_b }} 19 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Проекции Zonnon->.NET: Active Objects Zonnon C# Исходная конструкция Проекция на C# ACTIVITY S END Метод: void body() { S }; Поле: Thread thread; Создание активного объекта (неявный запуск «активности») x.thread = new Thread( new ThreadStart(body)) x.thread.Start() AWAIT cond; while ( !cond ) { Monitor.Wait(this); } BEGIN { LOCKED } S END Monitor.Enter(this); S; Monitor.PulseAll(this); Monitor.Exit(this); 20 Нижегородский государственный университет им. Н.И. Лобачевского Технология: пакет CCI. По материалам презентации Е.А. Зуева. Москва, 2003 21 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» CCI: Основа Zonnon-компилятора CCI = Common Compiler Infrastructure. CCI – набор ресурсов (классов), предоставляющих поддержку реализации компиляторов и других языковых инструментов для .NET Реализация компиляторов; Интеграция компиляторов. Концептуально, CCI является частью .NET Framework SDK. Спроектирован и реализован в Microsoft; автор - Herman Venter. 22 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» CCI: сценарии использования • Интеграция в VS.NET существующих (“не-CCI”) компиляторов. • Интеграция в VS.NET компиляторов, полностью реализованных на основе CCI • Расширение существующих .NET-языков и компиляторов (C#, VB etc.). • Создание процессоров для посткомпиляционной обработки. • Учебные компиляторы! 23 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» CCI: Три проблемы • (Общая) Разработка компилятора – непростая задача; интеграция компилятора в среду программирования – целый спектр дополнительных проблем. • (CCI) CCI реализует существенно отличный от традиционного подход к процессу компиляции. • (Техническая) CCI имеет объемный и нетривиальный интерфейс, набор правил и «контрактов». 24 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Общие принципы использования CCI Все сервисы CCI представлены в виде классов. Чтобы воспользоваться этими сервисами, необходимо определить собственные классы, производные от классов CCI. В производных классах необходимо обеспечить реализацию некоторых абстрактных методов классов-прототипов (они образуют «унифици-рованный интерфейс» с окружением). Производные классы содержат функциональ-ность, реализующую собственную семантику компилятора. 25 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Компоненты CCI Intermediate Representation (IR) – Развитая иерархия C#-классов, представляющих наиболее общие и типичные понятия System.Compiler.dll современных ЯП Преобразователи (“Visitors”) – Набор классов, реализующих последовательные преобразования System.Compiler.Framework.dll IR MSIL Поддержка интеграции – Совокупность классов и методов, обеспечивающих интеграцию в среду Visual Studio (дополнительная функцио-нальность для редактирования, отладки, фоновой компиляции etc.) 26 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» IR: промежуточное представление Node Expression UnaryExpression BinaryExpression NaryExpression MethodCall Indexer AssignmentExpression Literal Parameter This Statement AssignmentStatement If For ForEach Continue ExpressionStatement VariableDeclaration Часть дерева наследования IR Node Member TypeNode Class DelegateNode EnumNode Interface . . . TypeParameter Pointer Reference Event Method InstanceInitializer StaticInitializer Field Property Namespace CompilationUnit 27 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» IR: промежуточное представление Пример: public class If : Statement { Expression condition; Block falseBlock; Block trueBlock; . . . } Характеристики IR: Весьма прямолинейный подход. IR почти полностью повторяет иерархию понятий языка C#. Включает поддержку некоторых языковых черт, отсутствующих в C#. public class Block : Statement { bool hasLocals; StatementList statements; . . . } Поддерживает некоторые будущие свойства C# (напр., generics). Вывод: архитектура IR достаточна для представления широкого спектра языков с традиционной парадигмой. 28 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» IR: промежуточное представление Пример: класс C# public class C { public int m1; public void f ( ) { m1 = 0; } } Class Identifier Name Members ... Field Name Flags Type Identifier Int32 AssignmentStatement Block … … Method Identifier Void Name Flags Type Statements ... ... Body ... 29 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Система трансформаций IR в CCI StandardVisitor Looker Declarer Resolver Checker Normalizer • • Каждый Visitor обходит дерево IR… …заменяя узлы Identifier ссылками на сущности, которые обозначает идентификатор; …разрешая случаи совместного использования (overloading) and вычисляя типы выражений; …выполняя семантические проверки; …готовя дерево к сериализации (генерации IL+MD). Можно модифицировать стандартные Visitor’ы и/или Написать собственные 30 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Организация синтаксического анализа Прототип анализатора: абстрактный класс CCI using System.Compiler; namespace ZLanguageCompiler { public sealed class ZParser : System.Compiler.Parser { public … ParseCompilationUnit(...) public … ParseExpression(...) public … ParseStatements(...) . . . private … ParseZModule(...) private … ParseZStatements(...) . . . } } Собственная логика Z-парсера “Унифицированный интерфейс” парсера: реализует интерфейс между компилятором и 31 окружением ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Работа с IR: расширение Visitor’ов Пример расширения Looker’а using System.Compiler; Visitor-прототип: абстрактный класс CCI namespace ZLanguageCompiler { public sealed class ZLooker : System.Compiler.Looker { public override Node Visit ( Node node ) { Метод-“диспетчер” switch ( node.NodeType ) { case ZNodeType.NewStmt: return this.VisitNewStmt((NewStmt)node); default: return base.Visit(node); Семантическая } обработка узла } public Node VisitNewStmt ( NewStmt node ) { /* Преобразование NewStmt в некоторый CCI-узел */ } } } 32 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Обработка IR: Активация Visitor’ов Общая схема работы с IR Прототип компилятора: абстрактный класс CCI public class ZCompiler : System.Compiler.Compiler, ... { . . . protected override void Compile ( CompilationUnit cu, Class globalScope, ErrorNodeList errors ) { Типы узлов IR // Разрешение имен (new ZLooker(globalScope)).VisitCompilationUnit(cu); // Разрешение совм.использования и вычисление типов (new ZResolver()).VisitCompilationUnit(cu); // Семантические проверки; «исправление» дерева (new ZChecker(errors)).VisitCompilationUnit(cu); // Редукция дерева до узлов с предопред.отображением в MD+IL (new Normalizer().VisitCompilationUnit(cu); } . . . } 33 Запуск Visitor’ов ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Архитектура компилятора: традиционный подход Имя исход. файла Пар-ры компиляции Compiler Start Up Исход. текст Лексич. анализ Посл-ть лексем Синт. & семантич. анализ Дерево прогр. Окружение Компилятор Генерация кода Объектный код Compiler End Up Компилятор как “черный ящик” Файл с объектным кодом Диагностические сообщения 34 Нижегородский государственный университет им. Н.И. Лобачевского Интеграция в VS. По материалам презентации Е.А. Зуева. Москва, 2003 35 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Что подразумевается под интеграцией? Поведение, которое должен Компоненты среды Visual Studio Менеджер проектов Текстовый редактор Семантическая поддержка (“Intellisense”) Отладчик поддерживать компилятор • Запуск компиляции и сборка проектов • Синтаксическая подсветка • Автоматическое форматирование; структурн. проход по тексту {} • Синтаксические проверки на фоне ввода текста • «Плавающая» диагностика • Вывод «содержимого» составного типа для переменной этого типа • Вывод списка совместно-используемых методов • Вывод списка параметров • Вычисление выражений • Условные точки останова 36 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Что подразумевается под интеграцией? Пример “Intellisense” 37 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Архитектура CCI-компилятора Исходный текст Атрибуты Контекст Контекст Компилятор как набор объектов Document Token Token Лексема Лексич. анализ Дерево программы Синт. & семантич. анализ Объектный код (Assembly) Генерация кода Окружение Редактор Менеджер проектов “Intellisense” Отладчик 38 28 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Архитектура CCI-компилятора Фаза компляции Прогр. модули Получить лексему Лексический анализ Получить лексему с доп. атрибутами Компилировать программный модуль Синтаксический & семантический анализ Компилировать выражение Компилировать посл-ть операторов ... 39 Нижегородский государственный университет им. Н.И. Лобачевского Резюме 40 По материалам NET Crash Course, MSR Cambridge UK, March 2002 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» CCI • • • • • • • • • • • • Handling compiler parameters & options Source Code Reading Lexical Analysis Syntax Analysis Symbol Table Name Look-Up Program Tree Semantic Analysis Code Optimization Code Generation Error Handling Integration into an Environment supports supports --partially supports -supports --- (not necessary) supports supports supports for VS Lex&YACC --supports supports --------41 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» CCI: текущее состояние и статус • Реализован почти полностью; не отлажен; не документирован. • 12 июня 2003 CCI Toolkit был включен в MSDN Academic Alliance. • Компилятор Zonnon – первый опыт использования CCI за пределами Microsoft. 42 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Анонс Лабораторная работа «программирование встраиваемых систем» Compiler Project 43