Парадигма | мультипарадигма : логическая , функциональная , императивная , объектно-ориентированная , ограниченная , распределенная , параллельная |
---|---|
Разработано | Герт Смолка, его ученики |
Разработчик | Консорциум Моцарта |
Впервые появился | 1991 |
Стабильный выпуск | Оз 1.4.0 (финал), Моцарт 2.0.1 / 5 сентября 2018 г . |
Печатная дисциплина | динамичный |
Лицензия | MIT X11 [1] |
Веб-сайт | Моцарт |
Основные реализации | |
Система программирования Моцарта | |
Диалекты | |
Оз, Моцарт | |
Под влиянием | |
Эрланг , Лисп , Пролог | |
Под влиянием | |
Алиса , Скала |
Oz - это многопарадигмальный язык программирования , разработанный в Лаборатории систем программирования при Католическом университете Лувена для обучения языку программирования. У него есть канонический учебник: « Концепции, методы и модели компьютерного программирования» .
Oz был впервые разработан Гертом Смолкой и его учениками в 1991 году. В 1996 году разработка Oz продолжилась в сотрудничестве с исследовательской группой Сейфа Хариди и Питера Ван Роя из Шведского института компьютерных наук . С 1999 года Oz постоянно разрабатывается международной группой Mozart Consortium, которая первоначально состояла из Саарландского университета , Шведского института компьютерных наук и Католического университета Лувена . В 2005 году ответственность за управление разработкой Моцарта была передана основной группе, Совету Моцарта, с явной целью открыть развитие Моцарта для более широкого сообщества.
Система программирования Моцарта - это основная реализация Oz. Он выпущен Консорциумом Моцарта с открытым исходным кодом . Моцарт был портирован на Unix , FreeBSD , Linux , Windows и macOS .
Особенности языка [ править ]
Oz [2] содержит большинство концепций основных парадигм программирования , включая логическое, функциональное (как ленивое вычисление, так и активное вычисление ), императивное, объектно-ориентированное, ограниченное, распределенное и параллельное программирование. Oz имеет как простую формальную семантику (см. Главу 13 упомянутой ниже книги), так и эффективную реализацию. [ необходима цитата ] Oz - это язык, ориентированный на параллелизм , поскольку этот термин был введен Джо Армстронгом, главным разработчиком языка Erlang . Язык, ориентированный на параллелизм, делает параллелизм простым и эффективным. Оз поддерживает каноническийязык графического интерфейса пользователя (GUI) QTk. [3]
Помимо многопарадигмального программирования, основные сильные стороны Oz заключаются в программировании с ограничениями и распределенном программировании . Благодаря продуманному дизайну Oz может успешно реализовать прозрачную для сети модель распределенного программирования. Эта модель упрощает программирование открытых отказоустойчивых приложений на языке. Для программирования с ограничениями Оз вводит идею вычислительных пространств , которые позволяют определять пользовательские стратегии поиска и распределения, ортогональные области ограничений.
Обзор языка [ править ]
Структуры данных [ править ]
Oz основан на базовом языке с очень небольшим количеством типов данных, которые можно расширить до более практичных с помощью синтаксического сахара .
Базовые структуры данных:
- Числа: с плавающей запятой или целое число (действительное целое число)
- Записи: для группирования данных:
circle(x:0 y:1 radius:3 color:blue style:dots)
. Здесь термины x, y, радиус и т. Д. Называются элементами, а данные, связанные с элементами (в данном случае 0,1,3 и т. Д.), Являются значениями. - Кортежи: Записи с целочисленными особенностями в порядке возрастания:
circle(1:0 2:1 3:3 4:blue 5:dots)
. - Списки: простая линейная структура
'|' ( 2 '|' ( 4 '|' ( 6 '|' ( 8 nil )))) % как запись. 2 | ( 4 | ( 6 | ( 8 | nil ))) % с некоторым синтаксическим сахаром 2 | 4 | 6 | 8 | ноль % больше синтаксического сахара [ 2 4 6 8 ] % еще больше синтаксического сахара
Эти структуры данных представляют собой значения (константы), первого класса и проверяются динамически . Имена переменных в Oz начинаются с заглавной буквы, чтобы отличать их от литералов [4], которые всегда начинаются со строчной буквы.
Функции [ править ]
Функции [5] являются значениями первого класса, позволяющими функциональное программирование более высокого порядка :
fun { Fact N } if N = < 0 then 1 else N * { Fact N - 1 } конец конец
fun { Comb N K } { Fact N } div ({ Fact K } * { Fact N - K }) % целых чисел не может переполняться в Oz (если не осталось памяти) endfun { SumList List } case Список из нуля, затем 0 [] H | Т , то Н + { SumList Т } % по шаблону в списках конечного конца
Функции могут использоваться как со свободными, так и со связанными переменными. Свободные значения переменных находятся с использованием статической лексической области видимости . [6]
Программирование высшего порядка [ править ]
Функции похожи на другие объекты Oz. Функция может быть передана как атрибут другим функциям или может быть возвращена функцией.
fun { Square N } % Общая функция N * N endfun { Map F Xs } % F здесь функция - случай программирования высшего порядка Xs из nil, затем nil [] X | Xr, затем { F X } | { Map F Xr } конец конец% использования { Browse { Map Square [ 1 2 3 ]}} % просмотров [1 4 9]
Анонимные функции [ править ]
Как и многие другие функциональные языки, Oz поддерживает использование анонимных функций (то есть функций, не имеющих имени) с программированием более высокого порядка. Для их обозначения используется символ $.
Далее функция square определяется анонимно и передается, вызывая [1 4 9]
просмотр.
{ Обзор { Карта весело { $ N } N * N конец [ 1 2 3 ]}}
Поскольку анонимные функции не имеют имен, невозможно определить рекурсивные анонимные функции.
Процедуры [ править ]
Функции в Oz должны возвращать значение в последнем операторе, встречающемся в теле функции во время ее выполнения. В приведенном ниже примере функция Ret возвращает 5, если X> 0, и -5 в противном случае.
объявить веселье { Ret X }, если X > 0, то 5 else ~ 5 end end
Но Oz также предоставляет возможность на случай, если функция не должна возвращать значения. Такие функции называются процедурами. [7] Процедуры определяются с использованием конструкции "proc" следующим образом.
объявить proc { Ret X }, если X > 0, затем { Browse 5 } else { Browse ~ 5 } end end
Приведенный выше пример не возвращает никакого значения, он просто печатает 5 или -5 в браузере Oz в зависимости от знака X.
Переменные потока данных и декларативный параллелизм [ править ]
Когда программа встречает несвязанную переменную, она ждет значения. Например, ниже поток будет ждать, пока X и Y не будут привязаны к значению, прежде чем отобразить значение Z.
резьба Z = X + Y { просмотреть Z } конец резьбы X = 40 конец резьбы Y = 2 конец
Значение переменной потока данных не может быть изменено после привязки:
X = 1 X = 2 % ошибка
Переменные потока данных упрощают создание параллельных потоковых агентов:
fun { Ints N Max } if N == Max then nil else { Delay 1000 } N | { Ints N + 1 Max } конец конецfun { Sum S Stream } case Stream of nil then S [] H | T, затем S | { Sum H + S T } end endlocal X Y в потоке X = { Ints 0 1000 } конец потока Y = { Sum 0 X } end { Browse Y } end
Из-за того, как работают переменные потока данных, можно разместить потоки в любом месте программы и гарантировать тот же результат. Это очень упрощает параллельное программирование. Потоки очень дешевы: за один раз можно запустить 100 000 потоков. [8]
Пример: сито пробного отделения [ править ]
В этом примере вычисляется поток простых чисел с использованием алгоритма пробного деления путем рекурсивного создания параллельных потоковых агентов, которые отфильтровывают непростые числа:
весело { Сито Xs } случае Xs из нуля , то ноль [] X | Xr, затем Ys в потоке Ys = { Filter Xr fun { $ Y } Y mod X \ = 0 end } end X | { Sieve Ys } end end
Лень [ править ]
Оз по умолчанию использует активное вычисление , но возможно и ленивое вычисление [9] . Ниже этот факт вычисляется только тогда, когда значение X необходимо для вычисления значения Y.
весело ленивый { Факт N } if N = < 0 then 1 else N * { Fact N - 1 } end end local X Y in X = { Fact 100 } Y = X + 1 end
Ленивое вычисление дает возможность хранить действительно бесконечные структуры данных в Oz. Мощь ленивого вычисления можно увидеть в следующем примере кода:
объявить забавный ленивый { Merge Xs Ys } case Xs # Ys of ( X | Xr ) # ( Y | Yr ) then if X < Y then X | { Merge Xr Ys } elseif X > Y then Y | { Merge Xs Yr } else X | { Merge Xr Yr } конец конецконецвесело ленивый { Времена N Xs } случае Xs от нуля , то ноль [] X | Xr, затем N * X | { Times N Xr } конец конецобъявить H H = 1 | { Объединить { раз 2 H } { объединить { раз 3 H } { раз 5 H }}} { просмотреть { список . возьмите H 6 }}
Приведенный выше код элегантно вычисляет все регулярные числа [10] в бесконечном списке. Фактические числа вычисляются только тогда, когда они необходимы.
Параллелизм при передаче сообщений [ править ]
Декларативная конкурентная модель может быть расширена за счет передачи сообщений с помощью простой семантики:
объявить локальный порт потока в Port = { NewPort Stream } { Send Port 1 } % Stream теперь равен 1 | _ ('_' указывает на несвязанную и безымянную переменную) { Send Port 2 } % Stream теперь 1 | 2 | _ .. . { Send Port n } % Stream теперь 1 | 2 | .. | n | _ конец
С помощью порта и потока можно определить асинхронные агенты:
fun { NewAgent Init Fun } Msg Out в потоке { FoldL Msg Fun Init Out } end { NewPort Msg } end
Состояние и объекты [ править ]
Снова появилась возможность расширить декларативную модель для поддержки государственного и объектно-ориентированного программирования с очень простой семантикой. Чтобы создать новую изменяемую структуру данных под названием Cells:
local A X в A = { NewCell 0 } A : = 1 % изменяет значение A на 1 X = @ A % @ используется для доступа к значению A end
С помощью этих простых семантических изменений может поддерживаться вся объектно-ориентированная парадигма. С небольшим синтаксическим сахаром ООП становится хорошо интегрированным в Оз.
class Counter attr val meth init ( Value ) val : = Value end meth browse { Обзор @ val } end meth inc ( Value ) val : = @ val + Value end endлокальный C в C = { New Counter init ( 0 )} { C inc ( 6 )} { C browse } end
Скорость выполнения [ править ]
Скорость выполнения программы, созданной компилятором Моцарта (версия 1.4.0, реализующая Oz 3), очень низкая. По набору тестов он в среднем примерно в 50 раз медленнее, чем у GNU Compiler Collection (GCC) для языка C, решая тестовые задачи. [ когда? ] [11] [ неудачная проверка ]
См. Также [ править ]
- Алиса (язык программирования) , язык параллельных функциональных ограничений от Саарландского университета
- Программирование потока данных
- Языки программирования функциональной логики
- Карри (язык программирования)
- Меркурий (язык программирования)
- Visual Prolog , объектно-ориентированный, функциональный, логический язык
Ссылки [ править ]
- Питер Ван Рой и Сейф Хариди (2004). Концепции, методы и модели компьютерного программирования . MIT Press. К этой книге есть вспомогательные онлайн-материалы . В книге, являющейся введением в принципы языков программирования, в качестве примеров предпочтительна идиома Oz.
- ^ "Информация о лицензии Моцарта Оз" . 16 января 2014 . Проверено 16 января 2014 года .
- ↑ Герт Смолка (1995). "Модель программирования страны Оз" (PDF) . Конспект лекций по информатике . 1000 : 324–343. DOI : 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 Surveys . 21 (3): 359–411. DOI : 10.1145 / 72551.72554 . S2CID 207637854 .
- ^ Рао, AC & Varada Раджу, D (1991). «Применение метода числа Хэмминга для обнаружения изоморфизма кинематических цепей и инверсий». Теория механизмов и машин . 26 (1): 55–75. DOI : 10.1016 / 0094-114x (91) 90022-V .
- ^ Игра "Тесты компьютерного языка"
Внешние ссылки [ править ]
- Официальный веб-сайт
- Учебник Оз
- Исследование языка программирования в UCL : одна из основных разработчиков Mozart / Oz, эта группа проводит исследования, используя Mozart / Oz в качестве средства передвижения.
- Мультипарадигмальное программирование в Моцарте / Озе: Материалы МОЗ 2004 : Конференция, которая дает моментальный снимок работы, проделанной с Моцартом / Озом.
- Программирование в Оз
- Оз Основы