Компилятор eth zonnon для .net

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

Upload: dannon

Post on 09-Jan-2016

63 views

Category:

Documents


0 download

DESCRIPTION

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

TRANSCRIPT

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