330 likes | 663 Views
Язык программирования Zonnon. Compiler Project. Язык Zonnon. Авторы Jürg Gutknecht, ETH Zürich Евгений Зуев, ETH Zürich Первый компилятор для платформы .NET реализован в Швейцарском федеральном технологическом институте Евгением Зуевым. Направления работы в ETH. Компиляторы / Языки.
E N D
Язык программирования Zonnon Compiler Project
Язык Zonnon • Авторы • Jürg Gutknecht, ETH Zürich • Евгений Зуев, ETH Zürich • Первый компилятор для платформы .NET реализован в Швейцарском федеральном технологическом институте Евгением Зуевым
Направления работыв ETH Компиляторы/Языки System Software Rotor Oberon (with N. Wirth) Components Aos for Wearables Active Oberon Jaos .NET Sabbatical at MSR Oberon0 Project 7 Aos Gadgets Active Oberon Info 1/4 Oberon System Software Zonnon for .NET Время исполнения/ Компоненты Components Лекции/Семинары
Видение эволюции Programmingin-the-Small Programmingin-the-Large Active Oberon Modula-2 Algol Oberon Zonnon Pascal Algorithms OOP Agents ??? DataStructures Modules
Цели проекта Zonnon • Разработать язык семейства Pascal для платформы .NET • Удобный для обучения алгоритмам и структурам данных без объектно-ориентированных ограничений • Цельный переход из эпохи паскаля к технологиям третьего тысячелетия • Расширить объектную модельсредствами поддержки удаленных объектов и распределенных систем
Простая программа module example526; var m,n,a,i: integer; begin write("Введите 4-х значное число: "); readln(n); m := n; a := 0; for i := 1 to 4 do a := a * 10 + m mod 10; m := m div 10; end; if a = n then writeln("Являетсяперевертышем") else writeln("Не является перевертышем") end; end example526.
Пример LineDrawing module LineDrawing; import System.Math, System.Drawing.Pens as Pens, System.Windows.Forms.PaintEventArgs as PaintEventArgs, System.Windows.Forms.Application as Application, System.Windows.Forms.Form; object GraphicsForm implementsSystem.Windows.Forms.Form; const { public } MAX_POINTS = 1024; var { public } vx : array MAX_POINTS ofinteger; vy : array MAX_POINTS ofinteger; pointsCount : integer; procedure { public } OnPaint(e : PaintEventArgs) implements System.Windows.Forms.Form.OnPaint; var k : integer; g : System.Drawing.Graphics; begin g := e.Graphics; for k := 0 to pointsCount-2 do g.DrawLine(Pens.Black, vx[k], vy[k], vx[k+1], vy[k+1]); end; writeln("OK"); end OnPaint; begin Text := "Drawing Context"; Width := 300; Height := 300; pointsCount := 0; end GraphicsForm;
var { private } form : GraphicsForm; var { public } (* Window size *) width, height : integer; (* Starting position *) Px, Py : integer; procedure { public } clear; begin form.vx[0] := Px; form.vy[0] := Py; form.pointsCount := 1; form.Width := width; form.Height := height; form.Update(); end clear; procedure { public } line(direction, length : integer); begin form.vx[form.pointsCount] := integer(length * System.Math.Cos( real(direction) )); form.vy[form.pointsCount] := integer(length * System.Math.Sin( real(direction) )); inc(form.pointsCount); form.Update(); end line; begin Px := 150; Py := 150; width := 300; height := 300; form := new GraphicsForm(); Application.Run(form); end LineDrawing.
module DrawingTester; import LineDrawing; begin LineDrawing.Px := 200; LineDrawing.Py := 200; LineDrawing.width := 400; LineDrawing.height := 400; (* Draw rectangle *) LineDrawing.line( 90, 100); LineDrawing.line( 0, 100); LineDrawing.line(-90, 100); LineDrawing.line(180, 100); end DrawingTester.
C# - хороший язык, но ... • Что может быть улучшено? • Параллелизм • Компонентность • Расширяемость • Синтаксис
C# - хороший язык, но ... • Что может быть улучшено? • Параллелизм • Компонентность • Расширяемость • Синтаксис
Поддержка потоков • C# • Потоки вбиблиотеке System.Threading • Обычные Lock Objects • Wait/Pulse управляются потоками • Zonnon • Активностивстроенные вОбъекты • Объект контролирующий блокировки • Потоками управляет система (AWAIT) • Контролируемая синтаксисом передача сообщений
Конвейер с активными объектами Буфер Активность Станция Станция Get Put Put Get Активный объект Активный объект Шаблон разработки конвейера
Активные объекты в Zonnon object Station (next: Station);var { private } n, in, out: integer; buf: array N of object; procedure { private } Get (var x: object);begin{ locked } await (n # 0); dec(n); x := buf[out]; out := (out + 1) mod Nend Get; procedure { public } Put (x: object);begin{ locked } await (n # N); inc(b); buf[in] := x; in := (in + 1) mod N end Put; activity; var x: object; beginloop Get(x); (*process x;*) next.Put(x) end end begin n := 0; in := 0; out := 0 end Station; Отдельный поток
C# - хороший язык, но ... • Что может быть улучшено? • Параллелизм • Компонентность • Расширяемость • Синтаксис
Строительные блоки и отношения • C# • Interfaces • Classes • Zonnon • Definitions • Implementations • Object Types • Modules :n extends :n implements :1 inherits :1 refines :1 implements compile :n aggregates run :n imports
Модуль как структурный элемент • Что такое модуль? • Контейнер для логически близких объектов • Статический объект управляемый системой • Загружаемый при необходимости библиотекой времени исполнения • Почему модули важны? • Модули предоставляют простые средства для • Выделение отдельных задач • Статическая декомпозиция системы • Модули сводят к нулю и выделяют явным образом зависимости при помощи IMPORT отношения • Модуль унифицирует систему и уровни приложения
Простая иерархия модулей MyUserInterface Уровень приложения delegate MyBusinessLogic System.Windows import Уровень системы System.Graphics
Абстракции: Что первично? JukeBox: Player or Store?class JukeBox: Player, Store{ ...} Truck: Container or Vehicle?class Truck: Vehicle, Container{ ...} Computer: Calculator or DataBase or Browser? class Computer: Calculator, DataBase, Browser { ... } Base class Interface
Унифицированная концепция абстракций Definition Default Implementation Client Custom Implementation ”Facet” aggregate Client Client Servant Object asComposition of Facets via Aggregation
Пример definition Music.Store; procedure Clear; procedure Add (s: Song); end Store. implementation Music.Store; var rep: Lib.Song; procedure Clear; begin loop := nilend Clear; procedure Add (s: Song); begin s.next := rep; rep := s end Add; begin Clear end Store. Namespace definition Music.Player; var cur: Song; procedure Play (s: Song); procedure Stop; end Player. object Music.JukeBox implementsPlayer, Store; importStore; (* aggregate *) procedure Play (s: Song); implementsPlayer.Play; procedure Stop; implementsPlayer.Stop; end JukeBox.
C# - хороший язык, но ... • Что может быть улучшено? • Параллелизм • Компонентность • Расширяемость • Синтаксис
Настраиваемая расширяемость в C# • Определяемые пользователем методы и операторы • Перегрузка • Атрибуты • Посредник между программистом и средой времени исполнения
Настраиваемая расширяемость в Zonnon • Модификаторы • PUBLIC, PRIVATE, LOCKED, CONCURRENT • BARRIER, WEAK, PERSISTENT, TRANSACTIONAL • Члены • Activity • Channel • Дефиниция • Method Table & State Space • XML Element • SQL Query • Syntax in EBNF
Каналы Связь, контролируемаясинтаксисом Q Канал типа Q Связь, контролируемаясинтаксисом P Активность Другая связь, контролируемаясинтаксисом P Канал типа P
Синтаксические протоколы Стандартизованное кодирование Соответствует типу канала Protocol = { Token { Token } { Token } }. t1 t2 t3 t5 t8 t6 t7 t9 Диалог объектов
Пример: электронный билет TicketingService = ”CheckPrice” Destination [ TicketType ] Price | ”BuyTicket” Destination [ TicketType ] AccountID TicketID.Destination = CharString.TicketType = (”full” | ”reduced”) [”twoway”].Price = Number.AccountID = CharString ”:” CharString ”.” CharString.TicketID = CharString ”.” CharString. TICKETSERVICE CUSTOMER
Пример Fighter definition Fighter; activity(* Syntax of the protocol, in this case it is recursive too *) { fight = { attack ( { defense attack } | RUNAWAY [ ?CHASE] | KO | fight ) }. attack = ATTACK strike. defense = DEFENSE strike. strike = bodypart [ strength ]. bodypart = LEG | NECK | HEAD. strength = integer. } Karate = (RUNAWAY, CHASE, KO, ATTACK, DEFENSE, LEG, NECK, HEAD); end Fighter. object Opponent implements Fighter; activity Karate implements Fighter.Karate; var t: object; procedure fight; begin while t is ATTACK do receive t; while t is DEFENSE doreceive t; strike if t is ATTACK then strike else halt(13) end end; if t is RUNAWAY then if(*not exhausted*)thensend Karate.CHASE end; return(* fight over *) elsif t is KO thenreturn(* fight over *) elsif t is ATTACK then fight (* recursion, continue the fight *) else halt(13) (* protocol error *) end end end fight;
procedure strike; begin if (t is LEG) or (t is NECK) or (t is HEAD) then receive t; if t is integer then(* unusual strength *)receive t end end end strike; begin(* Karate*) receive t; fight end Karate; end Opponent. object Challenger; import Opponent, Fighter; var opp: Opponent; f: Fighter.Karate; opp := new Opponent; (* create opponent *) … f := new opp.Fighter.Karate; (* create dialog *) send Fighter.Karate.ATTACK => f; … (* fight according to the dialog protocol *) … end Challenger.
C# - хороший язык, но ... • Что может быть улучшено? • Параллелизм • Компонентность • Расширяемость • Синтаксис
Синтаксическое наследие и стиль • C# • C & C++ • Эффективный, но шифрованный a = b for (int i = 0, i == 99, i++) { ... } • Допускает множество стилей • Zonnon • Pascal, Modula-2, Oberon • Прозрачныйилаконичный • Фиксированный стиль • Не требующий объяснений a := b repeat ... until i = 100 Важно для обучения, документирования, поддержки
В следующий раз • Компилятор Zonnon для .NET • Технология: пакет CCI • Интеграция в MS Visual Studio