Нижегородский государственный университет им. Н.И. Лобачевского 1 Компилятор ETH Zonnon для.NET Compiler Project По материалам презентации Е.А. Зуева.

Презентация:



Advertisements
Похожие презентации
Компилятор языка Zonnon: архитектура, интеграция, технология Научно-практическая конференция по программированию Москва, июня 2003 Евгений Зуев,
Advertisements

Учебный курс Объектно-ориентированный анализ и программирование Лекция 4 Трансформация логической модели в программный код Лекции читает кандидат технических.
ФИЛОСОФИЯ.NET Любому современному программисту, который желает идти в ногу с последними веяниями, каждые несколько лет приходится переучиваться.
Лекция 3 Раздел 3,1 Windows Phone Темы раздела 3.
Тема 5. Введение в среду визуального программирования Borland Delphi 7.0.
1 Диаграммы реализации (implementation diagrams).
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
Платформа Microsoft.NET Кафедра системного программирования С.-Петербургского государственного университета Андрей А.Терехов,
Школьная форма Презентация для родительского собрания.
Ребусы Свириденковой Лизы Ученицы 6 класса «А». 10.
Типовые расчёты Растворы
Проектирование архитектуры ИСО 1. UML 2 Структура определения языка 4.
Michael Jackson
Лекция 1 Раздел 1 Windows Phone Темы раздела 3 Windows Phone Устройство на платформе Windows Phone 4.
Лекция 2 Раздел 2.1 Windows Phone Темы раздела 3.
Урок повторения по теме: «Сила». Задание 1 Задание 2.
Веб-технологии и современные средства разработки УЦ ВГТУ & SoftLine Academy.
К.т.н. Мерзлякова Екатерина Юрьевна, доцент кафедры ПМиК.
Help: настройка Visual Studio.Net для создания консоль-приложения на основе Intel C++ с применением OpenMP. Инструменты «Практическое параллельное программирование.
Введение в теорию компиляции Основные принципы построения трансляторов.
Транксрипт:

Нижегородский государственный университет им. Н.И. Лобачевского 1 Компилятор ETH Zonnon для.NET Compiler Project По материалам презентации Е.А. Зуева. Москва, 2003

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 2 Язык Zonnon Авторы Jürg Gutknecht, ETH Zürich Евгений Зуев, ETH Zürich Первый компилятор с языка Zonnon для платформы.NET реализован в Швейцарском федеральном технологическом институте Евгением Зуевым

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 3 План Проблемы исследовательских языков и компиляторов Компилятор ETH Zonnon Технология CCI Интеграция в VS

Нижегородский государственный университет им. Н.И. Лобачевского Исследовательские языки на платформе.NET По материалам презентации Nick Benton, Microsoft Research, Cambridge UK

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 5 Языки программирования C, C++, Visual Basic, Java, JScript, Perl, Cobol,... подходят для большинства коммерческих и индустриальных проектов Но содержат в себе только часть существующих разработок в области языков программирования

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 6 Проблема Для разработчиков языков программирования Большой объем работы, которую нужно выполнить для реализации компилятора для нового язык. Большая часть которой не является специфичной для него как: Сборка мусора Многопоточность Линковка Среда разработки Машинно-зависимые оптимизации И если вы хотите что-либо делать на новом языке, то вам нужно реализовать богатую стандартную библиотеку

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 7 Проблема Для разработчиков Библиотеки и межъязыковое взаимодействие в исследовательских компиляторах никогда не бывают достаточно хороши. Склеивание нового кода со старым приводит Созданию автоконвертаторов Общее низкоуровневое представление … В итоге считается что лучше всё писать на C++ Среда разработки также редко бывает сильно продвинутой.

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 8 Решение.NET Common Language Runtime предоставляет богатый набор сервисов для разработчиков компиляторов Таким образом становится гораздо проще создать работающую систему с хорошей производительностью Предоставляет естественную систему типов, менеджер памяти, загрузчик, и т.д. упрощая межъязыковое взаимодействие Вы можете обращаться к широко используемым библиотекам и компонентам приложений написанным на других языках напрямую

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 9 Исследовательские языки и платформа.NET Microsoft работает с ведущими исследователями в области языков программирования по всему миру Перенцацеливание их любимых языков на платформу.NET Демонстрация межъязыкового взаимодействия

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 10 Haskell Oz Caml Mercury Standard ML Component Pascal Lightning Oberon Scheme Eiffel Lightning Oberon

Нижегородский государственный университет им. Н.И. Лобачевского 11 Компилятор Zonnon для.NET По материалам презентации Е.А. Зуева. Москва, 2003

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 12 Задачи проекта ETH Zonnon Compiler Реализовать базовую версию компилятора для платформы Microsoft.NET: - подмножество входного языка; - генерация MSIL-кода в полном формате; - режим командной строки. Обеспечить полную интеграцию компилятора со средой разработки MS Visual Studio.NET: - текстовый редактор; - фоновая компиляция; - управление проектами; - отладчик etc. Выполнить раскрутку (bootstrapping) полного компилятора на языке Zonnon.

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 13 Компилятор Zonnon Реализован для платформы.NET Генерирует стандартную сборку (Assembly) Реализован с использованием пакета CCI Интегрирован в среду MS Visual Studio.NET Создан в ETH Zürich, Switzerland Visual Studio.NET Platform CCI Framework Zonnon Compiler Source Code Assembly

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 14 Компиляторы для.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).

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 15 Модель компиляции Zonnon Zonnon-часть: Cпецифична для языка IR (AST) Source Scanner & Parser Visitors CCI-часть: Общая для всех языков Imported Assemblies MSIL+MD Output Assembly IL/MD Reader IL/MD Writer

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 16 Модель компиляции Zonnon IR (AST) Zonnon AST CCIs AST Scanner & Parser Visitors Проекции Реализуется семантическая специфика Zonnon; Выполняется сериализация «интерфейсной» части AST для последующей статической комплексации в собственных терминах языка Проекции (mappings): отображение специфических свойств Zonnon на семантически эквивалентные структуры.NET

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 17 Проекции Zonnon ->.NET DEFINITION абстрактный интерфейс; interface IMPLEMENTATION реализация интерфейса по умолчанию; единица агрегации; class OBJECT шаблон (класс), реализующий интерфейс; возможно, «активный» объект; sealed class MODULE контейнер ресурсов; класс, управляемый системой; class with static members

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 18 DEFINITION D; TYPE e = (a, b); VAR x: T; PROCEDURE f (t:T); PROCEDURE g ():T; END D; interface D_i { T x { get; set; } void f(T t); T g (); }; C# IMPLEMENTATION D; VAR y: T; PROCEDURE f (t: T); BEGIN x := t; y := t END f; END D; public class D_c: D_b { T y; void f(T t) { x_b = t; y = t; } }; 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 =... }}}; Проекции Zonnon->.NET: Definitions & Implementations Zonnon

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 19 C# Проекции 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 END g; END X; public sealed class X: D_I { D_c d; T y; public override T g() { 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 }} Проекция с отдельным helper-классом Проекция с базовым классом

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 20 Исходная конструкцияПроекция на 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); C# Проекции Zonnon->.NET: Active Objects Zonnon

Нижегородский государственный университет им. Н.И. Лобачевского 21 Технология: пакет CCI. По материалам презентации Е.А. Зуева. Москва, 2003

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 22 CCI: Основа Zonnon-компилятора CCI = Common Compiler Infrastructure. CCI – набор ресурсов (классов), предоставля- ющих поддержку реализации компиляторов и других языковых инструментов для.NET Реализация компиляторов; Интеграция компиляторов. Концептуально, CCI является частью.NET Framework SDK. Спроектирован и реализован в Microsoft; автор - Herman Venter.

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 23 CCI: сценарии использования Интеграция в VS.NET существующих (не-CCI) компиляторов. Интеграция в VS.NET компиляторов, полностью реализованных на основе CCI Расширение существующих.NET-языков и компиляторов (C#, VB etc.). Создание процессоров для посткомпиляционной обработки. Учебные компиляторы!

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 24 CCI: Три проблемы (Общая) Разработка компилятора – непростая задача; интеграция компилятора в среду программирования – целый спектр дополнительных проблем. (CCI) CCI реализует существенно отличный от традиционного подход к процессу компиляции. (Техническая) CCI имеет объемный и нетривиальный интерфейс, набор правил и «контрактов».

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 25 Общие принципы использования CCI Все сервисы CCI представлены в виде классов. Чтобы воспользоваться этими сервисами, необходимо определить собственные классы, производные от классов CCI. В производных классах необходимо обеспечить реализацию некоторых абстрактных методов классов-прототипов (они образуют «унифици-рованный интерфейс» с окружением). Производные классы содержат функциональ-ность, реализующую собственную семантику компилятора.

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 26 Компоненты CCI Intermediate Representation (IR) – Развитая иерархия C#-классов, представляющих наиболее общие и типичные понятия современных ЯП Поддержка интеграции – Совокупность классов и методов, обеспечивающих интеграцию в среду Visual Studio (дополнительная функцио-нальность для редактирования, отладки, фоновой компиляции etc.) Преобразователи ( Visitors ) – Набор классов, реализующих последовательные преобразования IR MSIL System.Compiler.dll System.Compiler.Framework.dll

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 27 IR: промежуточное представление Node Expression Member UnaryExpression TypeNode BinaryExpression Class NaryExpression DelegateNode MethodCall EnumNode Indexer Interface AssignmentExpression... Literal TypeParameter Parameter Pointer This Reference Statement Event AssignmentStatement Method If InstanceInitializer For StaticInitializer ForEach Field Continue Property ExpressionStatement Namespace VariableDeclaration CompilationUnit Часть дерева наследования IR

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 28 IR: промежуточное представление public class If : Statement { Expression condition; Block falseBlock; Block trueBlock;... } public class Block : Statement { bool hasLocals; StatementList statements;... } Пример: Характеристики IR: Весьма прямолинейный подход. IR почти полностью повторяет иерархию понятий языка C#. Включает поддержку некоторых языковых черт, отсутствующих в C#. Поддерживает некоторые будущие свойства C# (напр., generics). Вывод: архитектура IR достаточна для представления широкого спектра языков с традиционной парадигмой.

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 29 IR: промежуточное представление public class C { public int m1; public void f ( ) { m1 = 0; } } Class Members Field Method Name... Flags Type Identifier Int32 Name Flags Type Body Identifier Void Block... Statements Assignment- Statement … …... Пример : класс C#

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 30 Система трансформаций IR в CCI …готовя дерево к сериализации (генерации IL+MD). …разрешая случаи совместного использования (overloading) and вычисляя типы выражений; …выполняя семантические проверки; …заменяя узлы Identifier ссылками на сущности, которые обозначает идентификатор; StandardVisitor Normalizer Resolver Checker Looker Declarer Каждый Visitor обходит дерево IR… Можно модифицировать стандартные Visitorы и/или Написать собственные

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 31 Организация синтаксического анализа using System.Compiler; namespace ZLanguageCompiler { public sealed class ZParser : System.Compiler.Parser { public … ParseCompilationUnit(...) public … ParseExpression(...) public … ParseStatements(...)... private … ParseZModule(...) private … ParseZStatements(...)... } Прототип анализатора: абстрактный класс CCI Унифицированный интерфейс парсера: реализует интерфейс между компилятором и окружением Собственная логика Z-парсера Вызовы

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 32 Работа с IR: расширение Visitorов using System.Compiler; 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-узел */ } } Пример расширения Lookerа Visitor-прототип: абстрактный класс CCI Метод-диспетчер Семантическая обработка узла

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 33 Обработка IR: Активация Visitorов public class ZCompiler : System.Compiler.Compiler,... {... protected override void Compile ( CompilationUnit cu, Class globalScope, ErrorNodeList errors ) { // Разрешение имен (new ZLooker(globalScope)).VisitCompilationUnit(cu); // Разрешение совм.использования и вычисление типов (new ZResolver()).VisitCompilationUnit(cu); // Семантические проверки; «исправление» дерева (new ZChecker(errors)).VisitCompilationUnit(cu); // Редукция дерева до узлов с предопред.отображением в MD+IL (new Normalizer().VisitCompilationUnit(cu); }... } Общая схема работы с IR Прототип компилятора: абстрактный класс CCI Типы узлов IR Запуск Visitorов

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 34 Архитектура компилятора: традиционный подход Compiler Start Up Compiler End Up Компилятор Лексич. анализ Синт. & семантич. анализ Генера- ция кода Посл-ть лексем Дерево прогр. Исход. текст Объект- ный код Имя исход. файла Пар-ры компиляции Диагностические сообщения Файл с объектным кодом Окружение Компилятор как черный ящик

Нижегородский государственный университет им. Н.И. Лобачевского 35 Интеграция в VS. По материалам презентации Е.А. Зуева. Москва, 2003

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 36 Что подразумевается под интеграцией? Компоненты среды Visual Studio Менеджер проектов Текстовый редактор Семантическая поддержка (Intellisense) Отладчик Синтаксическая подсветка Автоматическое форматирование; структурн. проход по тексту { } Синтаксические проверки на фоне ввода текста «Плавающая» диагностика Вывод «содержимого» составного типа для переменной этого типа Вывод списка совместно-исполь- зуемых методов Вывод списка параметров Поведение, которое должен поддерживать компилятор Вычисление выражений Условные точки останова Запуск компиляции и сборка проектов

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 37 Что подразумевается под интеграцией? Пример Intellisense

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 38 Архитектура CCI-компилятора Лексич. анализ Синт. & семантич. анализ Генера- ция кода Окружение Document Исходный текст Контекст Token Лексема Атрибуты Контекст Дерево программы Объектный код (Assembly) Редактор Отладчик Менеджер проектов Intellisense Компилятор как набор объектов 28

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 39 Архитектура CCI-компилятора Лексический анализ Синтаксический & семантический анализ Получить лексему Получить лексему с доп. атрибутами Компилировать программный модуль Компилировать выражение Компилировать посл-ть операторов... Фаза компляции Прогр. модули

Нижегородский государственный университет им. Н.И. Лобачевского 40 Резюме По материалам NET Crash Course, MSR Cambridge UK, March 2002

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 41 Handling compiler parameters & optionssupports-- Source Code Readingsupports-- Lexical Analysis--supports Syntax Analysis-- supports Symbol Tablepartially supports-- Name Look-Up---- Program Treesupports-- Semantic Analysis---- Code Optimization-- (not necessary)-- Code Generationsupports-- Error Handlingsupports-- Integration into ansupports for VS-- Environment CCI Lex&YACC

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 42 CCI: текущее состояние и статус Реализован почти полностью; не отлажен; не документирован. 12 июня 2003 CCI Toolkit был включен в MSDN Academic Alliance. Компилятор Zonnon – первый опыт использования CCI за пределами Microsoft.

ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 43 Анонс Лабораторная работа «программирование встраиваемых систем» Compiler Project