Проект Zonnon не можна вважати продовженням лінійки мов Паскаль — Модула — Оберон — Оберон-2[en] — Компонентний Паскаль[en]. Це, швидше, паралельна гілка, яка відокремилася від згаданої лінійки десь на рівні Модули — Оберона. Безпосереднім предком Zonnon є Active Oberon, розроблений за участі того ж Юрга Гуткнехта. Якщо Ніклаус Вірт при створенні Оберону максимально спростив Модулу-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 з'явилася можливість описувати мовними засобами активні об'єкти і порядок їх взаємодії, що дозволяє при необхідності формувати програму у вигляді набору активних об'єктів, які незалежно працюють і взаємодіють.
Приклад програми
moduleExample;(*Це - коментар*)varx,y,sum:integer;beginwrite("ВведітьX:");readln(x);write("ВведітьY:");readln(y);sum:=x+y;(*Обчислюємо суму двох чисел*)writeln("X+Y=",sum);endExample.
За цією програмою обчислюється сума двох чисел, введених з клавіатури.
Zonnon використовує композиційні моделі успадкування на основі агрегування. Як правило, об'єкт (або модуль) складається з кількох функціональних компонентів, кожен з них надає себе клієнтам у формі абстрактного визначення. Ряд визначень, а також власний інтерфейс об'єкта (тобто сукупність всіх усуспільнених елементів об'єкта), являють собою інтерфейс між об'єктом і його клієнтами. Це дозволяє реалізувати переваги модульного і компонентного програмування, а також, що важливо, отримати можливість підтримувати одинарне і множинне успадкування (без недоліків реалізації останнього в С++), поліморфізм, уточнення й агрегування, делегування[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 році було також створено комплекс, що інтегрує до середовища розробки MS Visual Studio .NET, компілятор і CASE-систему, яка підтримує проектування Zonnon-програм шляхом побудови діаграм UML 2.0. Отриманий засіб підтримує стандартний для MS Visual Studio .NET цикл розробки мовою Zonnon з використанням UML, зокрема зворотну побудову UML-опису за кодом проекту.