Zonnon Language

advertisement
Нижегородский государственный университет им. Н.И. Лобачевского
Язык программирования
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
Download