1
Нижегородский государственный университет им. Н.И. Лобачевского
Язык программирования Zonnon
Compiler Project
2
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Язык Zonnon
Авторы Jürg Gutknecht, ETH Zürich Евгений Зуев, ETH Zürich
Первый компилятор для платформы .NET реализован в Швейцарском федеральном технологическом институте Евгением Зуевым
3
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Направления работы в ETH
Rotor
Лекции/Семинары
Время исполнения/Компоненты
Компиляторы/Языки
Oberon(with N. Wirth)
Active Oberon
Oberon0
Active Oberon
Zonnonfor .NET
OberonGadgets
Aos
Jaos
System Software
Components
Info 1/4
System Software
Components
Sabbatical at MSRProject 7
.NET
Aos for Wearables
4
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Видение эволюции
Algorithms
DataStructures
Modules
OOP Agents???
Algol
Pascal
Modula-2
Oberon
ActiveOberon
Zonnon
Programmingin-the-Large
Programmingin-the-Small
5
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Цели проекта Zonnon
Разработать язык семейства Pascal для платформы .NET Удобный для обучения алгоритмам и
структурам данных без объектно-ориентированных ограничений
Цельный переход из эпохи паскаля к технологиям третьего тысячелетия
Расширить объектную модель средствами поддержки удаленных объектов и распределенных систем
6
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Простая программа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.
7
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Пример LineDrawingmodule 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 } 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;begin
Text := "Drawing Context"; Width := 300;Height := 300;pointsCount := 0;
end GraphicsForm;
8
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
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.
9
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
module DrawingTester;
import LineDrawing;
beginLineDrawing.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.
10
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
C# - хороший язык, но ...
Что может быть улучшено? Параллелизм Компонентность Расширяемость Синтаксис
11
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
C# - хороший язык, но ...
Что может быть улучшено? Параллелизм Компонентность Расширяемость Синтаксис
12
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Поддержка потоков
C# Потоки в библиотеке System.Threading Обычные Lock Objects Wait/Pulse управляются потоками
Zonnon Активности встроенные в Объекты Объект контролирующий блокировки Потоками управляет система (AWAIT) Контролируемая синтаксисом передача
сообщений
13
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Конвейер с активными объектами
Get
Put
Буфер
Активный объект Активный объект
Активность
Шаблон разработки конвейера
GetPut
Станция Станция
14
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Активные объекты в Zonnonobject 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 endbegin n := 0; in := 0; out := 0end Station;
Отдельный поток
15
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
C# - хороший язык, но ...
Что может быть улучшено? Параллелизм Компонентность Расширяемость Синтаксис
16
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Строительные блоки и отношения
C# Interfaces Classes
Zonnon Definitions Implementations Object Types Modules
extends
implementsinherits
implements
aggregates
imports
refines
:n
:n:1
:1
:1
:n
:nrun
com
pile
17
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Модуль как структурный элемент Что такое модуль?
Контейнер для логически близких объектов Статический объект управляемый системой
Загружаемый при необходимости библиотекой времени исполнения
Почему модули важны? Модули предоставляют простые средства для
Выделение отдельных задач Статическая декомпозиция системы
Модули сводят к нулю и выделяют явным образом зависимости при помощи IMPORT отношения
Модуль унифицирует систему и уровни приложения
18
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Простая иерархия модулей
MyUserInterface
System.Windows
System.Graphics
MyBusinessLogic
Уровень системы
Уровень приложения
import
delegate
19
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Абстракции: Что первично?
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
20
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Client
Client
Client
Унифицированная концепция абстракций
Servant Object asComposition of Facets
via Aggregation
DefinitionDefault ImplementationCustom Implementation
”Facet”aggregate
21
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Пример
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 Clearend Store.
definition Music.Player; var cur: Song; procedure Play (s: Song); procedure Stop;end Player.
object Music.JukeBox implements Player, Store; import Store; (* aggregate *) procedure Play (s: Song); implements Player.Play; procedure Stop; implements Player.Stop;end JukeBox.
Namespace
22
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
C# - хороший язык, но ...
Что может быть улучшено? Параллелизм Компонентность Расширяемость Синтаксис
23
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Настраиваемая расширяемость в C#
Определяемые пользователем методы и операторы Перегрузка
Атрибуты Посредник между программистом и средой
времени исполнения
24
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Настраиваемая расширяемость в Zonnon
Модификаторы PUBLIC, PRIVATE, LOCKED, CONCURRENT BARRIER, WEAK, PERSISTENT, TRANSACTIONAL
Члены Activity Channel
Дефиниция Method Table & State Space XML Element SQL Query Syntax in EBNF
25
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Каналы
Связь, контролируемая
синтаксисом P
Другая связь,
контролируемая
синтаксисом P
Канал типа P
Канал типа Q
Связь, контролируем
ая
синтаксисом Q
Активность
26
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
t1 t2 t3 t5 t8
t6 t7 t9
Protocol = { Token { Token } { Token } }.
Синтаксические протоколы
Соответствует типу канала
Диалог объектов
Стандартизованное
кодирование
27
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Пример: электронный билет
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
28
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Пример Fighterdefinition 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 doreceive t;while t is DEFENSE do receive t; strike
if t is ATTACK then strike else halt(13) endend;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
endend fight;
29
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
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
endend 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.
30
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
C# - хороший язык, но ...
Что может быть улучшено? Параллелизм Компонентность Расширяемость Синтаксис
31
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Синтаксическое наследие и стиль
C# C & C++ Эффективный, но шифрованный
a = bfor (int i = 0, i == 99, i++) { ... }
Допускает множество стилей Zonnon
Pascal, Modula-2, Oberon Прозрачный и лаконичный Фиксированный стиль Не требующий объяснений
a := brepeat ... until i = 100
Важно для обучения,
документирования, поддержки
32
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
В следующий раз
Компилятор Zonnon для .NET Технология: пакет CCI Интеграция в MS Visual Studio
Top Related