The Zonnon Project: a Language and Compiler Experiment
Total Page:16
File Type:pdf, Size:1020Kb
The Zonnon Project: A Language and Compiler Experiment Евгений Зуев, ETH Zürich Нижегородский гоcударственный университет 27 сентября 2005 План История проекта, предшественники Язык Zonnon Компилятор Zonnon CCI & Модель компиляции Zonnon Интеграция в Visual Studio Zonnon Builder Инфо, Выводы, Участники 2 История проекта 1999, Oberon.NET Projects 7 & 7+, инициированные Microsoft Research 2001, Active Oberon ETH Zürich; понятие active object 2004, Active C# ETH Zürich; механизм взаимодействия процессов, основанный на понятии синтаксически-ориентированных протоколов 3 Особенности языка Zonnon Младший член семейства Pascal,Modula-2, Oberon: компактный, легкий для изучения и использования Поддерживает модульность (импорт прогр. единиц и экспорт членов прогр.единиц) Поддерживает ООП на основе концепции интерфейс/реализация и механизма уточнения (refinement) интерфейсов Поддерживает параллельность на основе понятия активных объектов и синтакси- ческих протоколов 4 Архитектура Zonnon-программ 1 Module Definition System managed object: - encapsulates resources Unified unit of abstraction: - implements definitions - represents abstract interface - aggregates implementations - refines another definition Object Implementation Program managed actor/resource: - def.implementation of a definition - implements definitions - standalone aggregation unit - aggregates implementations - specifies concurrent behaviour 5 Архитектура Zonnon-программ 2 Definition D1 Definition D2 Definition D3 Definition D11 (refines D1) Implementation D3 (default for Def D3) Implementation D11 (default for Def D11) Object B (implements D2, reuses default implem for D3, and aggregates I) Object A (implements D1 & D11 without reusing def implem) Implementation I (standalone resource) 6 Definitions (* Common interface for all kind of vehicles *) definition Vehicle; var { get } Speed : integer; (* read-only *) procedure SpeedUp ( d:integer ); procedure SlowDown ( d:integer ); end Vehicle. definition Truck refines Vehicle; (* Inherits interface from Vehicle *) const SpeedLimit = 90; end Truck. 7 Definition & Implementation (* Common interface for random numbers generators *) definition Random; var { get } Next : integer; (* read-only *) procedure Flush; (* reset *) end Random. (* A default implementation of the generator *) implementation Random; var { private } z : real; procedure { public, get } Next : integer; const a = 16807; m = 2147483647; q = m div a; r = m mod a; var g : integer; begin g := a*(z mod q) – r*(z div q); if g>0 then z := g else z := g+m end; return z*(1.0/m) end Next; procedure Flush; begin z := 3.1459 end Flush; begin Flush end Random. 8 Definitions & Objects (* Common interface for the random numbers generator *) definition Random; var { get } Next : integer; (* read-only *) procedure Flush; (* reset *) end Random. (* A custom implementation of the generator *) object myRandom implements Random; (* Procedure Next is reused from default implementation *) (* Procedure Flush is customized *) procedure Flush implements Random.Flush; begin z := 2.7189 end Flush; begin Flush end myRandom. 9 Modules & Objects module Test; import Random, (* both definition and implem are imported *) myRandom; var x : object { Random }; (* x’s actual type is either Random or any type implementing Random *) object R2 implements Random; (* Another implementation of Random definition *) . end R2; begin x := new Random; . x := new myRandom; . x := new R2; end Test. 10 Taken from a talk of JG, BK, and DL : 1 Пример активности A Pipeline with Active Objects AWAIT Stage Stage Activity Buffer Get Get Put Put AWAIT Active Object Active Object 11 System-wide activity is scheduled by evaluating the set of all AWAIT preconditions Ta ken from o a talk f JG, BK Activity Example: , and DL A Pipeline with Active Objects 2 object Stage (next: Stage); var { private } n, in, out: integer; buf: array N of object; (*used as a circular buffer*) procedure { private } Get (var x: object); Wait whilst begin { locked } (*mutual exclusion*) the buffer await (n # 0); (* precondition to continue*) is empty dec(n); x := buf[out]; out := (out+1) mod N end Get; procedure { public } Put (x: object); begin { locked } await (n # N); (*mutual exclusion*) inc(n); buf[in] := x; in := (in+1) mod N end Put; Wait whilst the buffer activity Processing; var x: OBJECT; is full begin loop Get(x); (*process x;*) next.Put(x) end end Processing; begin (*initialise this new object instance*) each activity n := 0; in := 0; out := 0; new Processing; has a separate end Stage; thread 12 Activities & Protocols definition D; protocol P = (a, b, c); (* declaration of a protocol *) end D. object O; import D; activity A implements D.P; (* declaration of an activity *) begin ... return u, v, w; (* activity returns tokens *) … x, y := await; (* activity receives tokens *) end A; var p: P; (* declaration of an activity variable *) begin p := new A; (* create an activity *) (* Continued dialog between caller and callee *) p(x, y); (* caller sendstokensx, y to activityp*) u, v, w := await p; (* caller receives tokens from p *) if u = P.a then ... end; (* using the token received from p *) r := p(s, t); (* same as a(s, t); r := await p *) await p; (* wait for activity to terminate *) end O. 13 Синтаксические протоколы definition Fighter; (* See full example in the Zonnon Language Report *) (* The protocol is used to create Fighter.Karate activities *) protocol (* syntax of the dialog*) { fight = { attack ( { defense attack } | RUNAWAY [ ?CHASE] | KO | fight ) }. attack = ATTACK strike. defense = DEFENSE strike. strike = bodypart [ strength ]. bodypart = LEG | NECK | HEAD. strength = integer. } (*enumeration of the dialog elements to be exchanged*) Karate = ( RUNAWAY, CHASE, KO, ATTACK, DEFENSE, LEG, NECK, HEAD ); end Fighter. 14 Outline История проекта Язык Zonnon Zonnon-компилятор CCI & Модель компиляции Zonnon Интеграция в Visual Studio Zonnon Builder Инфо, Выводы, Участники 15 Zonnon-компилятор Front-end реализован на C# с использо- ванием традиционных методов (recursive descent parser с полным семантическим контролем) Генерация кода и интеграция: на основе CCI framework Реализованы три варианта компилятора (все используют одно и то же ядро): - компилятор командной строки - компилятор,интегрир. в Visual Studio - компилятор,интегрир в Zonnon Builder 16 Zonnon-компилятор в Visual Studio Демонстрация: Двоичный поиск 17 План История проекта Язык Zonnon Zonnon-компилятор CCI & Модель компиляции Zonnon Интеграция в Visual Studio Zonnon Builder Инфо, Выводы, Участники 18 Common Compiler Infrastructure Универсальный framework разработки компиляторов для .NET и их интеграции в Visual Studio Реализует CLR-ориентиров. сем.анализ, построение дерева программы и его преобразования, разрешение имен, обработку ошибок и генерацию IL+MD; не поддерживает лексич.& синт.анализ Также может использоватиься как более эффективная альтернатива System.Reflection Не требуется COM-программирование: только C# Реализован в Microsoft; используется в компиля- торах Cω & Spec# (а также в нескольких других внутренних проектах Microsoft) 19 Архитектура CCI Compiler Front End Compiler Back End Семантическое Сервис для представле-- генерации ние сборок Сервис для интеграции Visual Studio .NET.NET 20 Основные компоненты CCI Intermediate Representation (IR) – A rich hierarchy of C# classes representing most common and typical notions of modern programming languages. System.Compiler.dll Transformers (“Visitors”) – A set of classes performing consecutive transformations IR MSIL System.Compiler.Framework.dll Integration Service – Variety of classes and methods providing integration to Visual Studio environment (additional functionality required for editing, debugging, background compilation, project management etc.) 21 Использование CCI: Общие принципы All CCI services are represented as classes. In order to make use of them the compiler writer should define classes derived from CCI ones. (The same approach is taken for Scanner, Parser, IR, Transformers, and for Integration Service) Derived classes should implement some abstract or virtual methods declared in the base classes (they compose a “unified interface” with the environment) Derived classes may (and typically do) implement some language-specific functionality. 22 Использование CCI: Синтаксический анализатор using System.Compiler; Prototype parser: abstract class from CCI namespace ZLanguageCompiler { public sealed class ZParser : System.Compiler.Parser { public override ... ParseCompilationUnit(...) { l l . a } C private ... ParseZModule(...) { . } Parser’s “unified interface”: } implementation of the } interface between Z parser’s own logic Z compiler and environment 23 Модель компиляции CCI 1 IL/MD Writer OutputOutput Source MSIL+MD Source IR AssemblyAssembly (AST) IL/MD Scanner Visitors & Reader Parser ImportedImported AssembliesAssemblies Source Language Part: CCI Part: Language specific Common to all languages 24 Модель компиляции CCI 2 CCI IR Hierarchy CCI Base Transformers Visitor 1 Visitor 2 MSIL+MD … Visitor N X Language IR Hierarchy X Language Transformers Visitor 1 Visitor 2 MSIL+MD Visitor 3+ … Visitor M 25 Модель компиляции CCI: пример Extending the IR Hierarchy Ada exit statement: exit when <Condition>; 1 Extend existing Exit node public class If : Statement public class AdaExit : Exit { { Expression condition; Expression condition; } Block falseBlockfalseBlock;; Block trueBlocktrueBlock;; 2 Add new statement to the hierarchy } public class AdaExit : Statement { Expression condition; } 3 Use semantic