Zonnon — язык программирования общего назначения, основанный на языкe Modula-2, и поддерживающий активные объекты, появившиеся в Активном Обероне. В языке введена новая парадигма программирования — композиционная модель. Используется сборка мусора, содержатся синтаксические средства объектного программирования, организации параллельных вычислений, переопределения операторов и обработки исключений. Язык разработан Юргом Гуткнехтом. В современной версии компилятора ETH в языке появилась возможность решать задачи линейной алгебры с синтаксисом похожим на matlab[2][3]. Компилятор языка является первым полностью созданным вне Microsoft и полностью интегрированным в Visual Studio совместно с другими языками платформы .NET.[4]
История
Проект вышел из участия ученых Швейцарского федерального технологического института (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 использует композиционные модели наследования на основе агрегирования. Как правило, объект (или модуль) состоит из ряда функциональных компонентов, каждый из них представляет себя клиентам в форме абстрактного определения. Ряд определений, а также собственного интерфейса объекта (то есть совокупность всех общественных элементов объекта) представляет собой интерфейс между объектом и его клиентами. Это позволяет реализовать достоинства модульного и компонентного программирования, а также, что немаловажно получить возможность поддерживать одинарное и множественное наследование (без недостатков реализации последнего в C++), полиморфизм, уточнение и агрегирование, делегирование на уровне сигнатур методов.
Достоинства и недостатки
Однозначно определить те или иные особенности языка как достоинства и недостатки вряд ли возможно — такая оценка сильно зависит от взгляда оценивающего. В связи с этим будет уместным привести сравнение Zonnon с близкими ему языками.
По сравнению с Паскалем и Модулой-2 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. Вестник Нижегородского университета им. Н. И. Лобачевского, 2010, 3-1, ISSN 19931778
- ↑ Start with mathematics (неопр.). Дата обращения: 13 февраля 2011. Архивировано 30 марта 2018 года.
- ↑ [1] Архивная копия от 9 ноября 2011 на Wayback Machine, ННГУ
- ↑ 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 года.