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