Оз (язык программирования) - Oz (programming language)
Парадигма | мультипарадигма: логика, функциональный, императив, объектно-ориентированный, ограничение, распределен, одновременный |
---|---|
Разработано | Герт Смолка, его ученики |
Разработчик | Консорциум Моцарта |
Впервые появился | 1991 |
Стабильный выпуск | Оз 1.4.0 (финал), Моцарт 2.0.1 / 5 сентября 2018 г. |
Печатная дисциплина | динамичный |
Лицензия | MIT X11[1] |
Интернет сайт | Моцарт |
Основной реализации | |
Система программирования Моцарта | |
Диалекты | |
Оз, Моцарт | |
Под влиянием | |
Erlang, Лисп, Пролог | |
Под влиянием | |
Алиса, Scala |
Унция это многопарадигмальный язык программирования, разработанная в Лаборатории систем программирования Католический университет Лувена, для обучения языку программирования. Есть канонический учебник: Концепции, методы и модели компьютерного программирования.
Впервые Oz был разработан Гертом Смолкой и его учениками в 1991 году. В 1996 году разработка Oz продолжилась в сотрудничестве с исследовательской группой Сейфа Хариди и Питера Ван Роя в Шведский институт компьютерных наук. С 1999 года Oz постоянно разрабатывается международной группой Mozart Consortium, которая первоначально состояла из Саарский университет, то Шведский институт компьютерных наук, а Католический университет Лувена. В 2005 году ответственность за управление развитием Моцарта была передана основной группе, Совету Моцарта, с явной целью открыть развитие Моцарта для более широкого сообщества.
Система программирования Моцарта - это основная реализация Oz. Он выпущен с лицензия с открытым исходным кодом Консорциумом Моцарта. Моцарт был перенесен на Unix, FreeBSD, Linux, Windows, и macOS.
Особенности языка
Унция[2] содержит большинство концепций основных парадигмы программирования, в том числе логические, функциональные (как ленивая оценка и жадная оценка ), императивное, объектно-ориентированное, ограниченное, распределенное и параллельное программирование. Оз имеет как простую формальную семантику (см. Главу 13 упомянутой ниже книги), так и эффективная реализация.[нужна цитата ] Оз - это параллелизм -ориентированный язык, как этот термин был введен Джо Армстронгом, главным разработчиком Язык Эрланг. Язык, ориентированный на параллелизм, делает параллелизм простым и эффективным. Оз поддерживает канонический графический интерфейс пользователя (GUI) язык QTk.[3]
Помимо многопарадигмального программирования, основные сильные стороны Oz заключаются в программирование в ограничениях и распределенное программирование. Благодаря продуманному дизайну Oz может успешно реализовать прозрачную для сети модель распределенного программирования. Эта модель позволяет легко программировать открытые, отказоустойчивой приложения на языке. Для программирования с ограничениями Оз вводит идею вычислительные пространства, которые позволяют определять стратегии поиска и распространения ортогональный в область ограничений.
Обзор языка
Структуры данных
Oz основан на базовом языке с очень небольшим количеством типов данных, которые можно расширить до более практичных с помощью синтаксический сахар.
Базовые структуры данных:
- Числа: с плавающей запятой или целое число (действительное целое число)
- Записи: для группировки данных:
круг (x: 0 y: 1 радиус: 3 цвет: синий стиль: точки)
. Здесь термины x, y, радиус и т. Д. Называются элементами, а данные, связанные с элементами (в данном случае 0,1,3 и т. Д.), Являются значениями. - Кортежи: записи с целыми числами в порядке возрастания:
круг (1: 0 2: 1 3: 3 4: синий 5: точки)
. - Списки: простая линейная структура
'|'(2 '|'(4 '|'(6 '|'(8 ноль)))) % как рекорд.2|(4|(6|(8|ноль))) % с некоторым синтаксическим сахаром2|4|6|8|ноль % больше синтаксического сахара[2 4 6 8] % еще больше синтаксического сахара
Эти структуры данных являются значениями (постоянными), первый класс и тип проверяется динамически. Имена переменных в Oz начинаются с заглавной буквы, чтобы отличить их от литералы[4] которые всегда начинаются со строчной буквы.
Функции
Функции[5] являются первоклассными ценностями, позволяющими функционал высшего порядка программирование:
весело {Факт N} если N =< 0 тогда 1 еще N*{Факт N-1} конецконец
весело {Гребень N K} {Факт N} div ({Факт K} * {Факт N-K}) % целых чисел не может переполняться в унциях (если не осталось памяти)конецвесело {SumList Список} дело Список из ноль тогда 0 [] ЧАС|Т тогда ЧАС+{SumList Т} % сопоставления с образцом в списках конецконец
Функции могут использоваться как со свободными, так и со связанными переменными. Свободные значения переменных находятся с помощью статических лексическая область видимости.[6]
Программирование высшего порядка
Функции похожи на другие объекты Oz. Функция может быть передана как атрибут другим функциям или может быть возвращена в функции.
весело {Квадрат N} % Общая функция N*Nконецвесело {карта F Хз} % F здесь функция - программирование высшего порядка дело Хз из ноль тогда ноль [] Икс|Xr тогда {F Икс}|{карта F Xr} конецконец%использование{Просматривать {карта Квадрат [1 2 3]}} % просматривает [1 4 9]
Анонимные функции
Как и многие другие функциональные языки, Oz поддерживает использование анонимных функций (то есть функций, не имеющих имени) с программированием более высокого порядка. Для их обозначения используется символ $.
Далее квадратная функция определяется анонимно и передается, вызывая [1 4 9]
для просмотра.
{Просматривать {карта весело {$ N} N*N конец [1 2 3]}}
Поскольку у анонимных функций нет имен, невозможно определить рекурсивные анонимные функции.
Процедуры
Предполагается, что функции в Oz возвращают значение в последнем операторе, встречающемся в теле функции во время ее выполнения. В приведенном ниже примере функция Ret возвращает 5, если X> 0, и -5 в противном случае.
объявитьвесело {Ret Икс} если Икс > 0 тогда 5 еще ~5 конецконец
Но Oz также предоставляет возможность на случай, если функция не должна возвращать значения. Такие функции называются процедурами.[7] Процедуры определяются с помощью конструкции "proc" следующим образом.
объявитьproc {Ret Икс} если Икс > 0 тогда {Просматривать 5} еще {Просматривать ~5} конецконец
Приведенный выше пример не возвращает никакого значения, он просто выводит 5 или -5 в браузере Oz в зависимости от знака X.
Переменные потока данных и декларативный параллелизм
Когда программа встречает несвязанную переменную, она ждет значения. Например, ниже, поток будет ждать, пока X и Y не будут привязаны к значению, прежде чем отобразить значение Z.
нить Z = Икс+Y {Просматривать Z}конецнить Икс = 40 конецнить Y = 2 конец
Значение переменной потока данных не может быть изменено после привязки:
Икс = 1Икс = 2 % ошибка
Переменные потока данных упрощают создание параллельных потоковых агентов:
весело {Ints N Максимум} если N == Максимум тогда ноль еще {Задерживать 1000} N|{Ints N+1 Максимум} конецконецвесело {Сумма S Транслировать} дело Транслировать из ноль тогда S [] ЧАС|Т тогда S|{Сумма ЧАС+S Т} конецконецместный Икс Y в нить Икс = {Ints 0 1000} конец нить Y = {Сумма 0 Икс} конец {Просматривать Y}конец
Из-за того, как работают переменные потока данных, можно разместить потоки в любом месте программы и гарантировать тот же результат. Это очень упрощает параллельное программирование. Потоки очень дешевые: за один раз можно запустить 100 000 потоков.[8]
Пример: сито пробного деления
В этом примере вычисляется поток простых чисел с использованием судебное отделение алгоритм путем рекурсивного создания параллельных потоковых агентов, которые отфильтровывают непростые числа:
весело {Сито Хз} дело Хз из ноль тогда ноль [] Икс|Xr тогда Ys в нить Ys = {Фильтр Xr весело {$ Y} Y мод Икс \= 0 конец} конец Икс|{Сито Ys} конецконец
Лень
Оз использует жадная оценка по умолчанию, но ленивая оценка[9] возможно. Ниже этот факт вычисляется только тогда, когда значение X необходимо для вычисления значения Y.
весело ленивый {Факт N} если N =< 0 тогда 1 еще N*{Факт N-1} конецконецместный Икс Y в Икс = {Факт 100} Y = Икс + 1конец
ленивая оценка дает возможность хранить действительно бесконечное количество структур данных в Oz. Мощь ленивых вычислений можно увидеть в следующем примере кода:
объявитьвесело ленивый {Объединить Хз Ys} дело Хз#Ys из (Икс|Xr)#(Y|Год) тогда если Икс < Y тогда Икс|{Объединить Xr Ys} elseif Икс>Y тогда Y|{Объединить Хз Год} еще Икс|{Объединить Xr Год} конец конецконецвесело ленивый {Раз N Хз} дело Хз из ноль тогда ноль [] Икс|Xr тогда N*Икс|{Раз N Xr} конецконецобъявить ЧАСЧАС = 1 | {Объединить {Раз 2 ЧАС} {Объединить {Раз 3 ЧАС} {Раз 5 ЧАС}}}{Просматривать {Список.брать ЧАС 6}}
Приведенный выше код элегантно вычисляет все Обычные числа[10] в бесконечном списке. Фактические числа вычисляются только тогда, когда они необходимы.
Параллелизм при передаче сообщений
Декларативная конкурентная модель может быть расширена передачей сообщений с помощью простой семантики:
объявитьместный Транслировать Порт в Порт = {NewPort Транслировать} {послать Порт 1} % Stream теперь равен 1 | _ ('_' указывает на несвязанную и безымянную переменную) {послать Порт 2} % Stream теперь 1 | 2 | _ ... {послать Порт п} % Stream теперь 1 | 2 | .. | п | _конец
С помощью порта и потока можно определить асинхронные агенты:
весело {NewAgent В этом Весело} Msg Из в нить {СложитьL Msg Весело В этом Из} конец {NewPort Msg}конец
Состояние и объекты
Опять же, декларативную модель можно расширить для поддержки государственного и объектно-ориентированного программирования с очень простой семантикой. Чтобы создать новую изменяемую структуру данных под названием Cells:
местный А Икс в А = {NewCell 0} А := 1 % изменяет значение A на 1 Икс = @А % @ используется для доступа к значению Aконец
С помощью этих простых семантических изменений может поддерживаться вся объектно-ориентированная парадигма. С небольшим синтаксическим сахаром ООП становится хорошо интегрированным в Оз.
учебный класс Прилавок attr вал мет в этом(Ценить) вал:=Ценить конец мет просматривать {Просматривать @вал} конец мет inc(Ценить) вал :=@вал+Ценить конецконецместный C в C = {Новый Прилавок в этом(0)} {C inc(6)} {C просматривать}конец
Скорость исполнения
Скорость выполнения программы, созданной компилятором Моцарта (версия 1.4.0, реализующая Oz 3), очень низкая. На набор тестов в среднем он примерно в 50 раз медленнее, чем Коллекция компиляторов GNU (GCC) для языка C, решение тестовых задач.[когда? ][11][неудачная проверка ]
Смотрите также
- Алиса (язык программирования), язык одновременных функциональных ограничений от Саарландского университета
- Программирование потока данных
- Языки программирования функциональной логики
- Карри (язык программирования)
- Меркурий (язык программирования)
- Визуальный пролог, объектно-ориентированный, функциональный, логический язык
Рекомендации
- Питер Ван Рой и Сейф Хариди (2004). Концепции, методы и модели компьютерного программирования. MIT Press. Есть вспомогательные онлайн-материалы для этой книги. В книге, являющейся введением в принципы языков программирования, в качестве примеров предпочтительна идиома Oz.
- ^ "Информация о лицензии Моцарта Оз". 16 января 2014 г.. Получено 16 января 2014.
- ^ Герт Смолка (1995). "Модель программирования страны Оз" (PDF). Конспект лекций по информатике. 1000: 324–343. Дои:10.1007 / BFb0015252. ISBN 978-3-540-60105-0.
- ^ «QTk». Архивировано из оригинал 20 мая 2013 г.. Получено 6 апреля 2009.
- ^ https://mozart.github.io/mozart-v1/doc-1.4.0/tutorial/node3.html#label18
- ^ Лейф Грёнквист. «Функции высшего порядка». Расширенное функциональное программирование в Унции. Архивировано из оригинал 3 марта 2016 г.. Получено 3 ноября 2014.
- ^ Роберт Джентльмен; Росс Ихака (сентябрь 2000 г.). «Лексический объем в статистических вычислениях» (PDF). Журнал вычислительной и графической статистики. 9 (3, Системы и языки): 491–508.
- ^ https://mozart.github.io/mozart-v1/doc-1.4.0/tutorial/node5.html#control.procedure
- ^ «Архивная копия». Архивировано из оригинал 24 февраля 2015 г.. Получено 29 ноябрь 2008.CS1 maint: заархивированная копия как заголовок (связь)
- ^ Пол Худак (1989). «Концепция, эволюция и применение языков функционального программирования». Опросы ACM Computing. 21 (3): 359–411. Дои:10.1145/72551.72554.
- ^ Рао, А.С. и Варада Раджу, Д. (1991). «Применение метода числа Хэмминга для обнаружения изоморфизма кинематических цепей и инверсий». Механизм и теория машин. 26 (1): 55–75. Дои:10.1016 / 0094-114x (91) 90022-в.
- ^ Игра "Тесты компьютерного языка"
внешняя ссылка
- Официальный веб-сайт
- Учебник Оз
- Исследование языков программирования в UCL: Один из основных разработчиков Mozart / Oz, эта группа проводит исследования, используя Mozart / Oz в качестве средства передвижения.
- Мультипарадигмальное программирование в Моцарте / Озе: Материалы МОЗ 2004 г.: Конференция, которая дает представление о работе, проделанной с Моцартом / Озом.
- Программирование в Оз
- Основы страны Оз