Компилятор eth zonnon для .net
DESCRIPTION
Компилятор ETH Zonnon для .NET. Compiler Project. По материалам презентации Е.А. Зуева. Москва, 2003. Язык Zonnon. Авторы Jürg Gutknecht, ETH Zürich Евгений Зуев, ETH Zürich - PowerPoint PPT PresentationTRANSCRIPT
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
21/04/23
Нижегородский государственный университет им. Н.И. Лобачевского
Исследовательские языки на платформе .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 CompilerSourceCode
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
Source
Scanner&
Parser
Visitors
CCI-часть:Общая для всех языков
Imported Assemblie
s
Imported Assemblie
s
MSIL+MDOutput
Assembly
Output Assembl
y
IL/MD Reader
IL/MD Writer
16
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Модель компиляции Zonnon
IR(AST)
ZonnonAST
CCI’sAST
Scanner&
ParserVisitors
Проекции
Реализуется семантическая специфика 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
ZonnonOBJECT 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 } SEND
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 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
NameName
...
Flags
Type
Identifier
IdentifierInt32
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
Исходный текст
Контекст
TokenTokenЛексема
Атрибуты
Контекст
Дерево программыОбъектный код
(Assembly)
Редактор ОтладчикМенеджер проектов
“Intellisense”
Ком
пи
лято
ркак н
аб
ор
об
ъекто
в
28
39
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Архитектура CCI-компилятора
Лексический анализ
Синтаксический &семантический
анализ
Получить лексему
Получить лексемус доп. атрибутами
Компилировать программный
модульКомпилировать
выражение
Компилироватьпосл-ть операторов
. . .
Фаза компляции
Прогр. модули
40
Нижегородский государственный университет им. Н.И. Лобачевского
Резюме
По материалам NET Crash Course, MSR Cambridge UK, March 2002
41
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
• Handling compilerparameters & options supports --
• Source Code Reading supports --• Lexical Analysis --
supports• Syntax Analysis --
supports• Symbol Table partially supports --• Name Look-Up -- --• Program Tree supports --• Semantic Analysis -- --• Code Optimization -- (not necessary) --• Code Generation supports --• Error Handling supports --• Integration into an supports for VS --
Environment
CCI Lex&YACC
42
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
CCI: текущее состояние и статус
• Реализован почти полностью;не отлажен; не документирован.
• 12 июня 2003 CCI Toolkit был включенв MSDN Academic Alliance.
• Компилятор Zonnon – первый опыт использования CCI за пределами Microsoft.
43
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Анонс
Лабораторная работа«программирование встраиваемых систем»
Compiler ProjectCompiler Project