Компилятор ETH Zonnon для .NET

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

description

Компилятор ETH Zonnon для .NET. Compiler Project. По материалам презентации Е.А. Зуева. Москва, 2003. Язык Zonnon. Авторы Jürg Gutknecht, ETH Zürich Евгений Зуев, ETH Zürich - PowerPoint PPT Presentation

Transcript of Компилятор ETH Zonnon для .NET

Page 1: Компилятор  ETH Zonnon для  .NET

1

Нижегородский государственный университет им. Н.И. Лобачевского

Компилятор ETH Zonnon для .NET

Compiler Project

По материалам презентации Е.А. Зуева. Москва, 2003

Page 2: Компилятор  ETH Zonnon для  .NET

2

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Язык Zonnon

Авторы Jürg Gutknecht, ETH Zürich Евгений Зуев, ETH Zürich

Первый компилятор с языка Zonnon для платформы .NET реализован в Швейцарском федеральном технологическом институте Евгением Зуевым

Page 3: Компилятор  ETH Zonnon для  .NET

3

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

План

Проблемы исследовательских языков и компиляторов

Компилятор ETH Zonnon Технология CCI Интеграция в VS

Page 4: Компилятор  ETH Zonnon для  .NET

21/04/23

Нижегородский государственный университет им. Н.И. Лобачевского

Исследовательские языки на платформе .NET

По материалам презентации Nick Benton, Microsoft Research, Cambridge UK

Page 5: Компилятор  ETH Zonnon для  .NET

5

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Языки программирования

C, C++, Visual Basic, Java, JScript, Perl, Cobol,... подходят для большинства коммерческих и индустриальных проектов

Но содержат в себе только часть существующих разработок в области языков программирования

Page 6: Компилятор  ETH Zonnon для  .NET

6

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Проблема Для разработчиков языков программирования

Большой объем работы, которую нужно выполнить для реализации компилятора для нового язык. Большая часть которой не является специфичной для него как: Сборка мусора Многопоточность Линковка Среда разработки Машинно-зависимые оптимизации

И если вы хотите что-либо делать на новом языке, то вам нужно реализовать богатую стандартную библиотеку

Page 7: Компилятор  ETH Zonnon для  .NET

7

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Проблема Для разработчиков

Библиотеки и межъязыковое взаимодействие в исследовательских компиляторах никогда не бывают достаточно хороши. Склеивание нового кода со старым приводит Созданию автоконвертаторов Общее низкоуровневое представление … В итоге считается что лучше всё писать на C++

Среда разработки также редко бывает сильно продвинутой.

Page 8: Компилятор  ETH Zonnon для  .NET

8

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Решение

.NET Common Language Runtime предоставляет богатый набор сервисов для разработчиков компиляторов Таким образом становится гораздо проще создать

работающую систему с хорошей производительностью

Предоставляет естественную систему типов, менеджер памяти, загрузчик, и т.д. упрощая межъязыковое взаимодействие Вы можете обращаться к широко используемым

библиотекам и компонентам приложений написанным на других языках напрямую

Page 9: Компилятор  ETH Zonnon для  .NET

9

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Исследовательские языки и платформа .NET

Microsoft работает с ведущими исследователями в области языков программирования по всему миру Перенцацеливание их любимых языков

на платформу .NET Демонстрация межъязыкового

взаимодействия

Page 10: Компилятор  ETH Zonnon для  .NET

10

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Haskell

Oz

Caml

Mercury

Standard ML

Component Pascal

Lightning Oberon

Scheme

Eiffel

Lightning Oberon

Page 11: Компилятор  ETH Zonnon для  .NET

11

Нижегородский государственный университет им. Н.И. Лобачевского

Компилятор Zonnon для .NET

По материалам презентации Е.А. Зуева. Москва, 2003

Page 12: Компилятор  ETH Zonnon для  .NET

12

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Задачи проектаETH Zonnon Compiler

• Реализовать базовую версию компиляторадля платформы Microsoft .NET:- подмножество входного языка;- генерация MSIL-кода в полном формате;- режим командной строки.

• Обеспечить полную интеграцию компилятора со средой разработки MS Visual Studio .NET:- текстовый редактор;- фоновая компиляция;- управление проектами;- отладчик etc.

• Выполнить “раскрутку” (bootstrapping) полного компилятора на языке Zonnon.

Page 13: Компилятор  ETH Zonnon для  .NET

13

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Компилятор Zonnon

• Реализован для платформы .NET• Генерирует стандартную сборку (Assembly)• Реализован с использованием пакета CCI• Интегрирован в среду MS Visual Studio .NET• Создан в ETH Zürich, Switzerland

Visual Studio

.NET Platform

CCI Framework

Zonnon CompilerSourceCode

Assembly

Page 14: Компилятор  ETH Zonnon для  .NET

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).

Page 15: Компилятор  ETH Zonnon для  .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

Page 16: Компилятор  ETH Zonnon для  .NET

16

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Модель компиляции Zonnon

IR(AST)

ZonnonAST

CCI’sAST

Scanner&

ParserVisitors

Проекции

Реализуется семантическая специфика Zonnon;

Выполняется сериализация «интерфейсной»части AST для последующей статическойкомплексации в собственных терминах языка

Проекции (mappings): отображение специфических свойств Zonnon на семантически эквивалентные структуры .NET

Page 17: Компилятор  ETH Zonnon для  .NET

17

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Проекции Zonnon -> .NET

DEFINITION абстрактный интерфейс; interface

IMPLEMENTATION реализация интерфейса по умолчанию; единица агрегации; class

OBJECT шаблон (класс), реализующий интерфейс; возможно, «активный» объект; sealed class

MODULE контейнер ресурсов; класс, управляемый системой; class with static members

Page 18: Компилятор  ETH Zonnon для  .NET

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

Page 19: Компилятор  ETH Zonnon для  .NET

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-классомПроекция

с базовым классом

Page 20: Компилятор  ETH Zonnon для  .NET

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

Page 21: Компилятор  ETH Zonnon для  .NET

21

Нижегородский государственный университет им. Н.И. Лобачевского

Технология: пакет CCI.

По материалам презентации Е.А. Зуева. Москва, 2003

Page 22: Компилятор  ETH Zonnon для  .NET

22

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

CCI: Основа Zonnon-компилятора

CCI = Common Compiler Infrastructure.

CCI – набор ресурсов (классов), предоставля-ющих поддержку реализации компиляторов и других языковых инструментов для .NET

Реализация компиляторов; Интеграция компиляторов.

Концептуально, CCI является частью.NET Framework SDK.

Спроектирован и реализован в Microsoft;автор - Herman Venter.

Page 23: Компилятор  ETH Zonnon для  .NET

23

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

CCI: сценарии использования

• Интеграция в VS.NET существующих(“не-CCI”) компиляторов.

• Интеграция в VS.NET компиляторов, полностью реализованных на основе CCI

• Расширение существующих .NET-языков и компиляторов (C#, VB etc.).

• Создание процессоров для посткомпиляционной обработки.

• Учебные компиляторы!

Page 24: Компилятор  ETH Zonnon для  .NET

24

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

CCI: Три проблемы

• (Общая)Разработка компилятора – непростая задача; интеграция компилятора в среду программирования – целый спектр дополнительных проблем.

• (CCI)CCI реализует существенно отличный от традиционного подход к процессу компиляции.

• (Техническая)CCI имеет объемный и нетривиальный интерфейс, набор правил и «контрактов».

Page 25: Компилятор  ETH Zonnon для  .NET

25

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Общие принципы использования CCI

Все сервисы CCI представлены в виде классов. Чтобы воспользоваться этими сервисами, необходимо определить собственные классы, производные от классов CCI.

В производных классах необходимо обеспечить реализацию некоторых абстрактных методов классов-прототипов (они образуют «унифици-рованный интерфейс» с окружением).

Производные классы содержат функциональ-ность, реализующую собственную семантику компилятора.

Page 26: Компилятор  ETH Zonnon для  .NET

26

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Компоненты CCI

Intermediate Representation (IR) –

Развитая иерархия C#-классов, представляющих наиболее общие и типичные понятия современных ЯП

Поддержка интеграции –

Совокупность классов и методов, обеспечивающих интеграцию в среду Visual Studio (дополнительная функцио-нальность для редактирования, отладки, фоновой компиляции etc.)

Преобразователи (“Visitors”) –

Набор классов, реализующих последовательные преобразованияIR MSIL

System.Compiler.dll

System.Compiler.Framework.dll

Page 27: Компилятор  ETH Zonnon для  .NET

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

Page 28: Компилятор  ETH Zonnon для  .NET

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 достаточна для представления широкого спектра языков с традиционной парадигмой.

Page 29: Компилятор  ETH Zonnon для  .NET

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#

Page 30: Компилятор  ETH Zonnon для  .NET

30

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Система трансформаций IR в CCI

…готовя дерево к сериализации (генерации IL+MD).

…разрешая случаи совместного использования (overloading) and вычисляя типы выражений;

…выполняя семантические проверки;

…заменяя узлы Identifier ссылкамина сущности, которые обозначает идентификатор;

StandardVisitor

Normalizer

Resolver

Checker

Looker

Declarer

Каждый Visitor обходит дерево IR…

• Можно модифицировать стандартные Visitor’ы и/или

• Написать собственные

Page 31: Компилятор  ETH Zonnon для  .NET

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-парсера

Вы

зов

ы

Page 32: Компилятор  ETH Zonnon для  .NET

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

Метод-“диспетчер”

Семантическая обработка узла

Page 33: Компилятор  ETH Zonnon для  .NET

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’ов

Page 34: Компилятор  ETH Zonnon для  .NET

34

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Архитектура компилятора:традиционный подход

Compiler Start Up

Compiler End Up

Компилятор

Лексич.

анализ

Синт. &семантич. анализ

Генера-ция кода

Посл-тьлексем

Деревопрогр.

Исход.текст

Объект-ный код

Имя исход. файла

Пар-ры компиляции

Диагностическиесообщения

Файл с объектнымкодом

Окружение

Компиляторкак “черный ящик”

Page 35: Компилятор  ETH Zonnon для  .NET

35

Нижегородский государственный университет им. Н.И. Лобачевского

Интеграция в VS.

По материалам презентации Е.А. Зуева. Москва, 2003

Page 36: Компилятор  ETH Zonnon для  .NET

36

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Что подразумевается под интеграцией?

Компоненты средыVisual Studio

Менеджер проектов

Текстовый редактор

Семантическая поддержка

(“Intellisense”)

Отладчик

• Синтаксическая подсветка

• Автоматическое форматирование; структурн. проход по тексту {}• Синтаксические проверки на фоне ввода текста• «Плавающая» диагностика

• Вывод «содержимого» составного типа для переменной этого типа• Вывод списка совместно-исполь- зуемых методов• Вывод списка параметров

Поведение, которое должен поддерживать компилятор

• Вычисление выражений• Условные точки останова

• Запуск компиляции и сборка проектов

Page 37: Компилятор  ETH Zonnon для  .NET

37

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Что подразумевается под интеграцией?

Пример “Intellisense”

Page 38: Компилятор  ETH Zonnon для  .NET

38

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Архитектура CCI-компилятора

Лексич.

анализ

Синт. &семантич

.анализ

Генера-ция

кода

Окружение

Document

Исходный текст

Контекст

TokenTokenЛексема

Атрибуты

Контекст

Дерево программыОбъектный код

(Assembly)

Редактор ОтладчикМенеджер проектов

“Intellisense”

Ком

пи

лято

ркак н

аб

ор

об

ъекто

в

28

Page 39: Компилятор  ETH Zonnon для  .NET

39

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Архитектура CCI-компилятора

Лексический анализ

Синтаксический &семантический

анализ

Получить лексему

Получить лексемус доп. атрибутами

Компилировать программный

модульКомпилировать

выражение

Компилироватьпосл-ть операторов

. . .

Фаза компляции

Прогр. модули

Page 40: Компилятор  ETH Zonnon для  .NET

40

Нижегородский государственный университет им. Н.И. Лобачевского

Резюме

По материалам NET Crash Course, MSR Cambridge UK, March 2002

Page 41: Компилятор  ETH Zonnon для  .NET

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

Page 42: Компилятор  ETH Zonnon для  .NET

42

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

CCI: текущее состояние и статус

• Реализован почти полностью;не отлажен; не документирован.

• 12 июня 2003 CCI Toolkit был включенв MSDN Academic Alliance.

• Компилятор Zonnon – первый опыт использования CCI за пределами Microsoft.

Page 43: Компилятор  ETH Zonnon для  .NET

43

ННГУ – ИТЛаб – Проект «Исследовательский компилятор»

Анонс

Лабораторная работа«программирование встраиваемых систем»

Compiler ProjectCompiler Project