Zonnon

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
Zonnon
Парадигма: композиційна модель
Дата появи: 2000
Творці: Юрг Гуткнехт
Під впливом від: Паскаль, Modula-2, Active Oberon

Zonnonмова програмування загального призначення, створена на основі мови Modula-2, яка підтримує активні об'єкти, що з'явилися в Active Oberon. У мові введено нову парадигму програмування — композиційну модель. Використовується збирання сміття, є синтаксичні засоби об'єктного програмування, організації паралельних обчислень, перевизначення операторів та обробки виняткових ситуацій. Мову розроблено Юргом Гуткнехтом (Jurg Gutknecht). У сучасній версії компілятора ETH надається можливість розв'язувати задачі лінійної алгебри з синтаксисом, подібним до Matlab. Компілятор мови є першим повністю створеним поза Microsoft і повністю інтегрованим у Visual Studio разом з іншими мовами платформи .NET.

Історія[ред.ред. код]

Проект виник завдяки участі вчених Швейцарського федерального технологічного інституту (ETH), фахівців з Оберону, в рамках Проекту 7 (Project 7), ініціативи, висунутої в 1999 році підрозділом Microsoft Research з метою вивчення мови на сумісність з платформою .NET (1999-2002) роки.[1] Автор мови — Юрг Гуткнехт (Jurg Gutknecht), професор ETH, колега Ніклауса Вірта і його співавтор з мови Оберон. Проект Zonnon було розроблено на початку 2000-х років в Цюріху в ETH. Метою проекту було створення мови програмування високого рівня загального призначення з максимально простим і зрозумілим синтаксисом, але яка при цьому мала б достатні можливості для розробки програмного забезпечення будь-якої складності.

Проект Zonnon не можна вважати продовженням лінійки мов ПаскальМодула[en]ОберонОберон-2[en]Компонентний Паскаль[en]. Це, швидше, паралельна гілка, яка відокремилася від згаданої лінійки десь на рівні Модули — Оберона. Безпосереднім предком Zonnon є Активний Оберон[en], розроблений за участі того ж Юрга Гуткнехта. Якщо Ніклаус Вірт при створенні Оберона максимально спростив Модулу-2, вилучивши з неї все, що було визнано не надто необхідним, то творці мови Zonnon пішли більш традиційним шляхом — вони зберегли більшість особливостей Модули-2 і навіть повернули дещо з Паскаля, а також доповнили мову декількома новими поняттями й механізмами.

Zonnon, на думку прихильників цього проекту, є простішим і потужнішим, ніж такі мови, як Ada, Java і C#[2]. Він призначений для простого і ефективного програмування паралельних систем з використанням нових багатоядерних процесорів, які мали домінувати в галузі протягом десятиліття.

Особливості[ред.ред. код]

Мова регістро-залежна — різниця в регістрі літер в ідентифікаторах призводить до їх відмінності. Зроблено оригінальний хід — слова вважаються ключовими (зарезервованими) при написанні всіх літер або у верхньому, або в нижньому регістрі. Тобто accept і ACCEPT — ключові слова, а ось AcCePt — просто припустимий ідентифікатор.

У мові 51 ключове слово (записуються або тільки в нижньому або тільки у верхньому регістрі): accept | activity | array | as | await | begin | by | case | const | definition | div | do | else | elsif | end | exception | exit | false | for | if | implementation | implements | import | in | is | launch | loop | mod | module | new | nil | object | of | on | operator | or | procedure | receive | record | refines | repeat | return | self | send | then | to | true | type | until | var | while

З особливостей можна відзначити використання знака # як символу операції «не дорівнює» (як у Модулі-2), а також наявність операції ** — «піднесення до степеня», — повернутої після багаторічного забуття мови Фортран.

Мова має набір примітивних типів — кілька числових, зокрема беззнакове ціле, кілька дійсних, рядковий тип (стандартні мовні засоби розглядають рядки як незмінювані), символьний, логічний. Від типів-діапазонів відмовилися, але зліченні типи збережено і вони активно застосовуються. Тип-множина (SET) зберігся, але став менш універсальним — множини тепер можуть складатися тільки з цілих чисел у діапазоні від нуля до деякої верхньої межі, визначеної реалізацією. Примітивні типи й множини можуть використовуватися у програмі з модифікаторами розміру — якщо в описі предмета або об'єкта після назви типу зазначено число у фігурних дужках, воно сприймається як кількість бітів, яку необхідно відвести під значення. Втім, ця можливість (точніше, конкретні значення розміру, допустимі для кожного з типів) є системно-залежною, так що в програмах, які претендують на переносимість, її застосування не рекомендовано.

Масиви описуються так само, як в Обероні — тип-масив може мати необмежений розмір за будь-якого набору розмірностей, при створенні реального масиву його розміри вказуються явно. Індекси масиву можуть бути цілими числами (нижня межа — завжди нуль) або зліченного типу.

Загальна структура програми, модулів, розділення модуля на визначення і реалізацію, правила запису синтаксичних конструкцій запозичено з Модули-2 практично без змін. Підтримується «довга» конструкція умовного оператора IF-THEN-ELSIF-ELSE-END, усі типи циклів, наявні у Модулі: REPEAT-UNTIL, WHILE, FOR, LOOP, конструкція вибору CASE. З Паскаля повернуто в мову стандартні примітивні операції вводу-виводу Write, WriteLn, Read, ReadLn (які в Модулі-2 було винесено в стандартну бібліотеку).

Додатково до мови внесено:

  • Засоби ООП: оголошення класів (використовується ключове слово object), методи (описуються цілком всередині опису класу), специфікатори видимості полів і методів private і public, окремий опис ООП-інтерфейсів і можливість явної вказівки реалізації інтерфейсів класом.
  • Властивості — псевдополя класів з повністю контрольованим доступом.
  • Індексатори — можливість опису класів, примірники яких зовні поводяться як масиви.
  • Засоби опрацювання винятків.
  • Перевизначення операторів і оголошення нових.
  • Засоби паралельного програмування: засобами мови можна створити паралельно виконувані фрагменти програми, взаємодія яких відбувається через протоколи — специфічний тип даних, створюваний за допомогою модифікованого РБНФ-опису формат повідомлення, яке буде передаватися.

Основним концептуальним нововведенням Zonnon, порівняно з Модулою й Обероном, стало введення активних об'єктів. У більшості мов програмування об'єкт — це просто набір даних, методів обробки, який використовується програмою в міру необхідності. Активні об'єкти, крім цього, мають власну поведінку, тобто з кожним активним об'єктом пов'язано свій, незалежний потік виконання, який взаємодіє з іншими потоками через мовні засоби обміну, за описаними для них протоколами. У Zonnon з'явилася можливість описувати мовними засобами активні об'єкти і порядок їх взаємодії, що дозволяє при необхідності формувати програму у вигляді набору активних об'єктів, які незалежно працюють і взаємодіють.

Приклад програми[ред.ред. код]

 module Example; (*Це - коментар*)
 var
   x, y, sum: integer;
begin
   write("Введіть X: ");
   readln(x);
   write("Введіть Y: ");
   readln(y);
   sum := x + y; (*Обчислюємо суму двох чисел*)
   writeln("X + Y = ", sum);
end Example.

За цією програмою обчислюється сума двох чисел, введених з клавіатури.

Композиційна модель[ред.ред. код]

Zonnon використовує композиційні моделі успадкування на основі агрегування[ru]. Як правило, об'єкт (або модуль) складається з кількох функціональних компонентів, кожен з них надає себе клієнтам у формі абстрактного визначення. Ряд визначень, а також власний інтерфейс об'єкта (тобто сукупність всіх усуспільнених елементів об'єкта), являють собою інтерфейс між об'єктом і його клієнтами. Це дозволяє реалізувати переваги модульного і компонентного програмування, а також, що важливо, отримати можливість підтримувати одинарне і множинне успадкування (без недоліків реалізації останнього в С++), поліморфізм, уточнення й агрегування, делегування[en] на рівні сигнатур методів.

Переваги і недоліки[ред.ред. код]

Переваги і недоліки мови Zonnon розглянемо шляхом порівняння з близькими їй мовами.

Порівняно з Паскалем і Модулою-2, Zonnon став значно потужнішим, але при цьому і об'ємнішим і складнішим. Збільшення потужності досягнуто за рахунок включення нових синтаксичних конструкцій. Засоби паралельної обробки (у разі Zonnon — це не тільки синтаксичні конструкції, і загальний принцип конструювання програм наборів активних об'єктів) дозволяють перекласти на компілятор типові операції. Збереження модульного принципу програмування дозволяє писати програми відразу, не використовуючи ООП, що важливо в освітніх цілях. Введено нову композиційну модель, але прихильники ООП можуть використовувати і об'єкти. Введено засоби опрацювання винятків. Порівняльна оцінка мов буде залежати від того, наскільки істотними вважати ці дві переваги.

З приводу засобів паралельної обробки є різні думки: частина теоретиків і практиків вважає, що засоби паралельного програмування взагалі не слід вносити в мову, і для них цілком достатньо підтримки системними бібліотеками, інші вказують на те, що такі бібліотеки повинні бути абсолютно стандартними, тобто все одно ставати частиною мови, в іншому випадку програми, що їх використовують, втратять переносимість (з іншого боку, переносимість насправді потрібна не так вже й часто). В будь-якому випадку, для програміста цінність механізмів паралельної обробки Zonnon багато в чому визначається тим, якою мірою він готовий прийняти пропоновану мовою модель активних об'єктів як основний елемент програми.

З приводу механізму обробки винятків єдиної думки немає. Ніклаус Вірт відмовився вносити такий механізм в Оберон, вважаючи його непотрібним, оскільки Оберон-система, для якої розроблена і ця мова, в ньому не має потреби. Взагалі ж існує думка, що більшість проблем з реакцією програм на можливі помилки цілком вирішується і без обробки винятків, а механізм цей не безкоштовний - за можливість перехопити будь-яку помилку, як правило, доводиться платити продуктивністю програми. З іншого боку, обробка винятків зручна і в даний час стала загальноприйнятою, а втрати продуктивності не настільки великі (або вимоги до швидкості не настільки критичні), щоб відмовлятися від зручності розробки.

Решта нововведень Zonnon, зокрема, більш розвинений ООП-синтаксис, інтерфейси, індексатори, властивості, перевизначення операторів, навряд чи слід вважати принциповими. З одного боку, вони ускладнюють мову, а все, що дозволяють робити вони, може бути практично так само легко зроблено і без них. З іншого, не можна не відзначити, що в даному випадку ці засоби реалізовано досить економно. Адже, якщо порівняти Zonnon з Object Pascal, що розвивався приблизно за тією ж схемою — доповнюючи початкову мову новими модними механізмами, можна бачити, що за обсягом можливостей Zonnon перебуває з Object Pascal на одному рівні, обходячи його в засобах паралельної обробки, але все ще залишаючись простішим.

Реалізації[ред.ред. код]

Реалізація мови з самого початку пішла не шляхом створення власного інтегрованого середовища розробки і середовища підтримки, як у випадку з мовою Оберон, а шляхом інтеграції з платформою .NET, випущеною і підтримуваною Microsoft. Такий підхід забезпечив підвищення швидкості реалізації за рахунок відмови від розробки власного середовища та системи бібліотек, а також автоматично дав програмам доступ до прикладних і системних бібліотек середовища .NET. До недоліків цього варіанту реалізації можна віднести залежність розробки від зовнішнього ПЗ, яке знаходиться поза контролем реалізатора мови.

Проте, в межах тієї ж реалізації під .NET, існує варіант кросплатформного середовища розробки, інтегрованого в Eclipse, яке використовує вільну реалізацію Mono середовища .NET, яка може функціювати під Linux.

Для Windows є також найпростіше власне середовище розробки ETH Zonnon Builder, що включає текстовий редактор з підсвічуванням синтаксису, засоби побудови проекту, найпростіші засоби контролю версій.

Перший компілятор створено в ETH для платформи Microsoft .NET Євгеном Зуєвим. У 2005 році було створено також комплекс, що інтегрує компілятор і CASE-систему, що підтримує проектування Zonnon-програм шляхом побудови діаграм UML 2.0, в середовище розробки Microsoft Visual Studio .NET. Отриманий засіб підтримує стандартний для MS Visual Studio .NET цикл розробки мовою Zonnon з використанням UML, зокрема зворотну побудову UML-опису за кодом проекту.

Посилання[ред.ред. код]

Примітки[ред.ред. код]

  1. László Böszörményi, Peter Schojer: Modular Programming Languages, Joint Modular Languages Conference, JMLC 2003, Klagenfurt, Austria, August 25-27, 2003, Proceedings Springer 2003, p.132
  2. Reliability by Design