Нижегородский государственный университет им. Н.И. Лобачевского Язык программирования Zonnon Compiler Project 1 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Язык Zonnon Авторы Jürg Gutknecht, ETH Zürich Евгений Зуев, ETH Zürich Первый компилятор для платформы .NET реализован в Швейцарском федеральном технологическом институте Евгением Зуевым 2 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Направления работы в ETH Компиляторы/Языки Oberon (with N. Wirth) Active Oberon Sabbatical at MSR System Software Rotor Components .NET Aos for Wearables Jaos Oberon0 Aos Project 7 Gadgets Active Oberon Info 1/4 Oberon System Software Zonnon Время исполнения/ Components Компоненты 3 Лекции/Семинары ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Видение эволюции Programming Programming in-the-Small in-the-Large Algol Pascal Algorithms Data Structures Active Modula-2 Oberon Oberon Zonnon OOP Agents Modules ??? 4 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Цели проекта Zonnon Разработать язык семейства Pascal для платформы .NET Удобный для обучения алгоритмам и структурам данных без объектноориентированных ограничений Цельный переход из эпохи паскаля к технологиям третьего тысячелетия Расширить объектную модель средствами поддержки удаленных объектов и распределенных систем 5 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Простая программа 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. 6 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Пример 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 implements System.Windows.Forms.Form; const { public } MAX_POINTS = 1024; var { public } begin vx : array MAX_POINTS of integer; vy : array MAX_POINTS of integer; 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; Text := "Drawing Context"; Width := 300; Height := 300; pointsCount := 0; end GraphicsForm; 7 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 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. 8 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 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. 9 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» C# - хороший язык, но ... Что может быть улучшено? Параллелизм Компонентность Расширяемость Синтаксис 10 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» C# - хороший язык, но ... Что может быть улучшено? Параллелизм Компонентность Расширяемость Синтаксис 11 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Поддержка потоков C# Потоки в библиотеке System.Threading Обычные Lock Objects Wait/Pulse управляются потоками Zonnon Активности встроенные в Объекты Объект контролирующий блокировки Потоками управляет система (AWAIT) Контролируемая синтаксисом передача сообщений 12 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Конвейер с активными объектами Буфер Станция Активност ь Станция Get Put Put Активный объект Get Активный объект Шаблон разработки конвейера 13 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Активные объекты в 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 N end 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; begin loop Get(x); (*process x;*) next.Put(x) end end begin n := 0; in := 0; out := 0 Отдельный 14 end Station; поток ННГУ – ИТЛаб – Проект «Исследовательский компилятор» C# - хороший язык, но ... Что может быть улучшено? Параллелизм Компонентность Расширяемость Синтаксис 15 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Строительные блоки и отношения C# Interfaces Classes run compile Zonnon Definitions Implementations Object Types Modules extends :n implements inherits :n :1 refines :1 implements :1 aggregates :n imports :n 16 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Модуль как структурный элемент Что такое модуль? Контейнер для логически близких объектов Статический объект управляемый системой Загружаемый при необходимости библиотекой времени исполнения Почему модули важны? Модули предоставляют простые средства для Выделение отдельных задач Статическая декомпозиция системы Модули сводят к нулю и выделяют явным образом зависимости при помощи IMPORT отношения Модуль унифицирует систему и уровни приложения 17 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Простая иерархия модулей MyUserInterface Уровень приложения delegate MyBusinessLogic System.Windows import Уровень системы System.Graphics 18 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Абстракции: Что первично? 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 } 19 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Унифицированная концепция абстракций Definition Default Implementation Custom Implementation aggregate Client ”Facet” Client Client Servant Object as Composition of Facets via Aggregation 20 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Пример Namespace definition Music.Player; var cur: Song; procedure Play (s: Song); procedure Stop; end Player. definition Music.Store; procedure Clear; procedure Add (s: Song); end Store. implementation Music.Store; var rep: Lib.Song; procedure Clear; begin loop := nil end Clear; procedure Add (s: Song); begin s.next := rep; rep := s end Add; begin Clear end Store. object Music.JukeBox implements Player, Store; import Store; (* aggregate *) procedure Play (s: Song); implements Player.Play; procedure Stop; implements Player.Stop; end JukeBox. 21 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» C# - хороший язык, но ... Что может быть улучшено? Параллелизм Компонентность Расширяемость Синтаксис 22 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Настраиваемая расширяемость в C# Определяемые пользователем методы и операторы Перегрузка Атрибуты Посредник между программистом и средой времени исполнения 23 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Настраиваемая расширяемость в Zonnon Модификаторы PUBLIC, PRIVATE, LOCKED, CONCURRENT BARRIER, WEAK, PERSISTENT, TRANSACTIONAL Члены Activity Channel Дефиниция Method Table & State Space XML Element SQL Query Syntax in EBNF 24 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Каналы Канал типа Q Активност ь Канал типа P 25 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Синтаксические протоколы Стандартизованно е кодирование Соответствует типу канала Protocol = { Token { Token } { Token } }. t1 t2 t3 t5 t8 t6 t7 t9 Диалог объектов 26 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Пример: электронный билет 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. CUSTOMER TICKET SERVICE 27 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Пример 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 do receive t; strike if t is ATTACK then strike else halt(13) end end; if t is RUNAWAY then if (*not exhausted*) then send Karate.CHASE end; return (* fight over *) elsif t is KO then return (* fight over *) elsif t is ATTACK then fight (* recursion, continue the fight *) else halt(13) (* protocol error *) end end end fight; 28 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» 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. 29 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» C# - хороший язык, но ... Что может быть улучшено? Параллелизм Компонентность Расширяемость Синтаксис 30 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» Синтаксическое наследие и стиль C# C & C++ Эффективный, но шифрованный Важно для обучения, a=b документирования, for (int i = 0, i == 99, i++) { ... } Допускает множество стилейподдержки Zonnon Pascal, Modula-2, Oberon Прозрачный и лаконичный Фиксированный стиль Не требующий объяснений a := b repeat ... until i = 100 31 ННГУ – ИТЛаб – Проект «Исследовательский компилятор» В следующий раз Компилятор Zonnon для .NET Технология: пакет CCI Интеграция в MS Visual Studio 32