Zonnon
Zonnon — язык программирования общего назначения, основанный на языкe Modula-2, и поддерживающий активные объекты, появившиеся в Активном Обероне. В языке введена новая парадигма программирования — композиционная модель. Используется сборка мусора, содержатся синтаксические средства объектного программирования, организации параллельных вычислений, переопределения операторов и обработки исключений. Язык разработан Юргом Гуткнехтом. В современной версии компилятора ETH в языке появилась возможность решать задачи линейной алгебры с синтаксисом похожим на matlab[2][3]. Компилятор языка является первым полностью созданным вне Microsoft и полностью интегрированным в Visual Studio совместно с другими языками платформы .NET.[4]
Zonnon | |
---|---|
Класс языка | императивный, структурный, модульный, объектно-ориентированный, многопоточный |
Тип исполнения | компилируемый |
Появился в | 2000 |
Автор | Юрг Гуткнехт[1] |
Расширение файлов |
.znn |
Выпуск | 1.3.0 (9 ноября 2012) |
Система типов | статическая, сильная |
Основные реализации | ETHZ |
Испытал влияние | Активный Оберон |
Лицензия | MS-PL |
Сайт | zonnon.org |
Платформа | .NET |
История
Проект вышел из участия ученых Швейцарского федерального технологического института (ETH), специалистов по Оберону в рамках проекта 7 (Project 7), инициативы, выдвинутой в 1999 году подразделением Microsoft Research с целью изучения языка на совместимость с платформой NET в (1999—2002) годы.[5] Автор языка — Юрг Гуткнехт (Jurg Gutknecht), профессор ETH, коллега Никлауса Вирта и его соавтор по языку Оберон. Проект Zonnon был разработан в начале 2000-х годов в Цюрихе в ETH. Целью проекта было создание языка программирования высокого уровня, общего назначения, с максимально простым и ясным синтаксисом, но при этом обладающим достаточными возможностями для разработки ПО любой сложности.
Проект Zonnon нельзя считать продолжением линейки языков Паскаль — Модула — Оберон — Оберон-2 — Компонентный Паскаль. Это, скорее, параллельная ветвь, отделившаяся от упомянутой линейки где-то на уровне Модулы — Оберона. Непосредственным предком Zonnon является Активный Оберон, разработанный при участии того же Юрга Гуткнехта. Если Никлаус Вирт при создании Оберона максимально упростил Модулу-2, удалив из неё всё, что было сочтено не слишком необходимым, то создатели языка Zonnon пошли по более традиционному пути — они сохранили большинство особенностей Модулы-2 и даже вернули кое-что из Паскаля, а также дополнили язык несколькими новыми понятиями и механизмами.
Zonnon, по мнению приверженцев этого проекта, является более простым и более мощным, чем такие языки, как Ada, Java и C#[6]. Он предназначен для простого и эффективного программирования параллельных систем с использованием новых многоядерных процессоров, которые будут доминировать в отрасли в течение десятилетия.
Особенности
Язык регистро-зависимый — разница в регистре букв в идентификаторах приводит к их различию. Сделан оригинальный ход — ключевые (зарезервированные) слова являются зарезервированными при написании либо всех букв в верхнем, либо всех букв в нижнем регистре. То есть 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 использует композиционные модели наследования на основе агрегирования. Как правило, объект (или модуль) состоит из ряда функциональных компонентов, каждый из них представляет себя клиентам в форме абстрактного определения. Ряд определений, а также собственного интерфейса объекта (то есть совокупность всех общественных элементов объекта) представляет собой интерфейс между объектом и его клиентами. Это позволяет реализовать достоинства модульного и компонентного программирования, а также, что немаловажно получить возможность поддерживать одинарное и множественное наследование (без недостатков реализации последнего в С++), полиморфизм, уточнение и агрегирование, делегирование на уровне сигнатур методов.
Достоинства и недостатки
Однозначно определить те или иные особенности языка как достоинства и недостатки вряд ли возможно — такая оценка сильно зависит от взгляда оценивающего. В связи с этим будет уместным привести сравнение 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-описания по коду проекта.
Ссылки
- Zonnon в MS Visual Studio 2008 (англ.)
- Введение в методы программирования на основе .NET, с использованием Zonnon Архивная копия от 24 января 2012 на Wayback Machine, НГТУ
- Zonnon Compiler for java
- Зоннон — Паскаль будущего для .NET! Интервью с Ниной Гоновой, магистранткой ННГУ, стажировавшейся в ETH в Цюрихе в группе Никлауса Вирта
- Start with mathematics, Нина Гонова
- Примеры программ (англ.)
- Библиотека для разработки численных приложенийи (англ.)
- Официальное сообщение о языке (англ.)
- The Zonnon Project:A .NET Language and Compiler Experiment. Jürg Gutknech, Vladimir Romanov, Eugene Zuef
- Р. О. Митин. Язык программирования Zonnon (основы), учебное пособие
- Е. В. Касьянова. Язык программирования Zonnon для платформы .NET
- Касьянова Е. В. Адаптивные методы и средства поддержки дистанционного обучения программирования
- Руслан Богатырев. От Паскаля к языку Zonnon: реализация новых идей на платформе .NET
Примечания
- Персональная страница Юрга Гуткнехта
- расширение синаксиса сделан Ниной Гоновой: Математическое расширение языка программирования Zonnon. Вестник Нижегородского университета им. Н. И. Лобачевского, 2010, 3-1, ISSN 1993—1778
- Start with mathematics
- , ННГУ
- 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
- Reliability by Design (недоступная ссылка). Дата обращения: 13 февраля 2011. Архивировано 26 сентября 2017 года.