Zonnon

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Zonnon
Класс языка императивный, структурный, модульный, объектно-ориентированный, многопоточный
Тип исполнения компилируемый
Появился в 2000
Автор Юрг Гуткнехт[1]
Расширение файлов .znn
Выпуск 1.3.0 (9 ноября 2012)
Система типов статическая, сильная
Основные реализации ETHZ
Испытал влияние Активный Оберон
Лицензия MS-PL
Сайт zonnon.org
Платформа .NET

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-описания по коду проекта.

Примечания

[править | править код]
  1. Персональная страница Юрга Гуткнехта
  2. расширение синаксиса сделан Ниной Гоновой: Математическое расширение языка программирования Zonnon. Вестник Нижегородского университета им. Н. И. Лобачевского, 2010, 3-1, ISSN 19931778
  3. Start with mathematics. Дата обращения: 13 февраля 2011. Архивировано 30 марта 2018 года.
  4. [1] Архивная копия от 9 ноября 2011 на Wayback Machine, ННГУ
  5. 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
  6. Reliability by Design. Дата обращения: 13 февраля 2011. Архивировано из оригинала 26 сентября 2017 года.