Оз (язык программирования)
Парадигма | мультипарадигмальность : логическая , функциональная , императивная , объектно-ориентированная , ограниченная , распределенная , параллельная. |
---|---|
Разработано | Герт Смолка, его ученики |
Разработчик | Консорциум Моцарта |
Впервые появился | 1991 год |
Стабильная версия | Оз 1.4.0 (финальный), Моцарт 2.0.1 / 5 сентября 2018 г |
Дисциплина набора текста | динамичный |
Лицензия | С X11 [1] |
Веб-сайт | Моцарт |
Основные реализации | |
Система программирования Моцарта | |
Диалекты | |
Оз, Моцарт | |
Под влиянием | |
Эрланг , Лисп , Пролог | |
Под влиянием | |
Алиса , Скала |
Oz — это мультипарадигмальный язык программирования , разработанный в Лаборатории систем программирования Католического университета Лувена для обучения языкам программирования. Имеет канонический учебник: Concepts, Techniques and Models of Computer Programming .
Впервые Oz был разработан Гертом Смолкой и его учениками в 1991 году. В 1996 году разработка Oz продолжилась в сотрудничестве с исследовательской группой Сейфа Хариди и Питера Ван Роя в Шведском институте компьютерных наук . С 1999 года Oz постоянно разрабатывается международной группой Mozart Consortium, которая первоначально состояла из Саарского университета , Шведского института компьютерных наук и Католического университета Лувена . В 2005 году ответственность за управление разработкой Mozart была передана основной группе, Mozart Board, с явной целью открыть разработку Mozart для более широкого сообщества.
Система программирования Моцарта является основной реализацией Оз. Он выпущен под лицензией с открытым исходным кодом Консорциумом Моцарта. Моцарт был портирован на Unix , FreeBSD , Linux , Windows и macOS .
Особенности языка
[ редактировать ]Оз [2] содержит большинство концепций основных парадигм программирования , включая логическое, функциональное (как ленивое, так и активное вычисление ), императивное, объектно-ориентированное, ограничивающее, распределенное и параллельное программирование. Oz имеет как простую формальную семантику (см. главу 13 упомянутой ниже книги), так и эффективную реализацию. [ нужна ссылка ] Oz — язык, ориентированный на параллелизм , поскольку этот термин был введен Джо Армстронгом, главным разработчиком языка Erlang . Язык, ориентированный на параллелизм, делает параллелизм простым в использовании и эффективным. Oz поддерживает канонический язык графического пользовательского интерфейса (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 ноль )))) % в качестве записи. 2 |( 4 |( 6 |( 8 | ноль ))) % с синтаксическим сахаром 2 | 4 | 6 | 8 | ноль % больше синтаксического сахара [ 2 4 6 8 ] % еще больше синтаксического сахара
Эти структуры данных представляют собой значения (постоянные), первого класса и динамически проверяемые типы . Имена переменных в Oz начинаются с заглавной буквы, чтобы отличать их от литералов. [4] которые всегда начинаются со строчной буквы.
Функции
[ редактировать ]Функции [5] являются значениями первого класса, позволяющими функциональное программирование более высокого порядка:
fun { Факт N } если N =< 0 , то 1 else N * { Факт N - 1 } end end
fun { Comb N K } { Fact N } div ({ Fact K } * { Fact N - K }) % целых чисел не может переполниться в Оз (если не осталось памяти) end fun { SumList List } case Список нулей , затем 0 [] Ч | T then H + { SumList T } % сопоставление с шаблоном в списка конце
Функции могут использоваться как со свободными, так и со связанными переменными. Значения свободных переменных находятся с использованием статической лексической области видимости . [6]
Программирование высшего порядка
[ редактировать ]Функции похожи на другие объекты страны Оз. Функция может быть передана как атрибут другим функциям или возвращена в функции.
fun { Square N } % Общая функция N * N end fun { Map F Xs } % F здесь является функцией - случай программирования Xs более высокого порядка : nil then nil [] X | Xr then { F X }|{ Map F Xr } end end %usage { Browse { Map Square [ 1 2 3 ]}} %browses [1 4 9]
Анонимные функции
[ редактировать ]Как и многие другие функциональные языки, Oz поддерживает использование анонимных функций (т. е. функций, не имеющих имени) при программировании более высокого порядка. Для их обозначения используется символ $.
Далее функция Square определяется и передается анонимно, что приводит к [1 4 9]
для просмотра.
{ Обзор { Карта развлечений { $ N } N * N end [ 1 2 3 ]}}
Поскольку анонимные функции не имеют имен, невозможно определить рекурсивные анонимные функции.
Процедуры
[ редактировать ]Предполагается, что функции в Oz возвращают значение в последнем операторе, встретившемся в теле функции во время ее выполнения. В приведенном ниже примере функция Ret возвращает 5, если X > 0, и -5 в противном случае.
объявить fun { Ret X }, если X > 0 , то 5 else ~ 5 end end
Но Oz также предоставляет возможность на случай, если функция не должна возвращать значения. Такие функции называются процедурами. [7] Процедуры определяются с использованием конструкции «proc» следующим образом:
объявить proc { Ret X } if X > 0 then { 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 } end end fun { Sum S Stream } case Stream of nil then S [] H | T then S |{ Sum H + S T } end end local X Y в потоке X = { Ints 0 1000 } end thread Y = { Sum 0 X } end { Browse Y } end
Благодаря тому, как работают переменные потока данных, можно размещать потоки в любом месте программы и гарантировать, что результат будет одинаковым. Это делает параллельное программирование очень простым. Потоки очень дешевы: одновременно можно запустить 100 000 потоков. [8]
Пример: сито пробного деления
[ редактировать ]В этом примере поток простых чисел вычисляется с использованием алгоритма пробного деления путем рекурсивного создания параллельных агентов потока, которые отфильтровывают непростые числа:
fun { Сито Xs } случай Xs nil nil then | ] X [ Xr , затем Ys в потоке Ys = { Filter Xr fun { $ Y } Y mod X \ = 0 end } end X | { Sieve Ys } end end
Лень
[ редактировать ]использует нетерпеливую оценку Оз по умолчанию , но ленивую оценку. [9] возможно. Ниже этот факт вычисляется только тогда, когда значение X необходимо для вычисления значения Y.
fun lazy { Факт N } if N =< 0 then 1 else N * { Факт N - 1 } end end local X Y in X = { Fact 100 } Y = X + 1 end
Ленивые вычисления дают возможность хранить в Oz поистине бесконечные структуры данных. Силу ленивых вычислений можно увидеть из следующего примера кода:
объявить fun lazy { Merge Xs Ys } case Xs # Ys of ( X | Xr ) # ( Y | Yr ) then if X < Y then X | { Merge Xr Ys } else if X > Y then Y | { Merge Xs Yr } else X |{ Объединить Xr Yr } end end end fun lazy { Times N Xs } case Xs of nil then nil [] X | Xr , затем N * X |{ Times N Xr } end end объявляем H H = 1 | { Объединить { Times 2 H } { Объединить { Times 3 H } { Times 5 H }}} { Обзор { Список . возьми H 6 }}
Приведенный выше код элегантно вычисляет все обычные числа. [10] в бесконечном списке. Фактические цифры рассчитываются только тогда, когда они необходимы.
Параллельная передача сообщений
[ редактировать ]Декларативная параллельная модель может быть расширена за счет передачи сообщений посредством простой семантики:
объявить локальный потока порт в Port = { NewPort Stream } { отправки Порт 1 } % Поток теперь равен 1|_ ('_' указывает на несвязанную и безымянную переменную) { отправки Порт 2 } % Поток теперь равен 1|2|_ .. . { отправки Порт n } % Поток теперь равен 1|2| .. |n|_ конец
С помощью порта и потока можно определить асинхронные агенты:
fun { NewAgent Init Fun } Сообщение потоке в { FoldL Msg Fun Init Out } end { NewPort Msg } end
Состояние и объекты
[ редактировать ]Декларативная модель снова может быть расширена для поддержки состояния и объектно-ориентированного программирования с очень простой семантикой. Чтобы создать новую изменяемую структуру данных под названием Cells:
local A X in A = { NewCell 0 } A : = 1 % изменяет значение A на 1 X = @ A % @ используется для доступа к значению A end
С помощью этих простых семантических изменений можно поддерживать всю объектно-ориентированную парадигму. С небольшим синтаксическим сахаром ООП становится хорошо интегрированным в Оз.
class Counter attr val meth init ( Value ) val : = Value end meth Browse { Browse @ val } end meth inc ( Value ) val : = @ val + Value end end local C in C = { New Counter init ( 0 )} { C inc ( 6 )} { C просмотр } конец
Скорость выполнения
[ редактировать ]Скорость выполнения программы, созданной компилятором Моцарта (версия 1.4.0, реализующая Oz 3), очень низкая. В наборе тестов 2012 года он в среднем был примерно в 50 раз медленнее, чем у GNU Compiler Collection (GCC) для языка C. [11]
См. также
[ редактировать ]- Алиса (язык программирования) — язык параллельных функциональных ограничений от Саарского университета.
- Программирование потоков данных
- Функционально-логические языки программирования
- Карри (язык программирования)
- Меркурий (язык программирования)
- Visual Prolog — объектно-ориентированный функциональный логический язык.
Ссылки
[ редактировать ]- Питер Ван Рой и Сейф Хариди (2004). Концепции, методы и модели компьютерного программирования . МТИ Пресс. В Интернете есть вспомогательные материалы для этой книги. В книге, представляющей собой введение в принципы языков программирования, в качестве предпочтительной идиомы для примеров используется Оз.
- ^ «Информация о лицензии Моцарта Оз» . 16 января 2014 года . Проверено 16 января 2014 г.
- ^ Герт Смолка (1995). «Модель программирования из страны Оз» (PDF) . Информатика сегодня . Конспекты лекций по информатике. Том. 1000. С. 324–343. дои : 10.1007/BFb0015252 . ISBN 978-3-540-60105-0 .
- ^ «QTk» . Архивировано из оригинала 20 мая 2013 года . Проверено 6 апреля 2009 г.
- ^ «3 основы» .
- ^ Лейф Грёнквист. «Функции высшего порядка». Продвинутое функциональное программирование в стране Оз . Архивировано из оригинала 3 марта 2016 года . Проверено 3 ноября 2014 г.
- ^ Роберт Джентльмен; Росс Ихака (сентябрь 2000 г.). «Лексическая область действия в статистических вычислениях» (PDF) . Журнал вычислительной и графической статистики . 9 (3, Системы и языки): 491–508. дои : 10.1080/10618600.2000.10474895 .
- ^ «5 основных структур управления» .
- ^ «Архивная копия» . Архивировано из оригинала 24 февраля 2015 года . Проверено 29 ноября 2008 г.
{{cite web}}
: CS1 maint: архивная копия в заголовке ( ссылка ) - ^ Пол Худак (1989). «Концепция, эволюция и применение языков функционального программирования». Обзоры вычислительной техники ACM . 21 (3): 359–411. дои : 10.1145/72551.72554 . S2CID 207637854 .
- ^ Рао, AC и Варада Раджу, D (1991). «Применение метода чисел Хэмминга для обнаружения изоморфизма кинематических цепей и инверсий». Теория механизма и машин . 26 (1): 55–75. дои : 10.1016/0094-114x(91)90022-v .
- ^ Игра с тестами компьютерного языка
Внешние ссылки
[ редактировать ]- Официальный сайт
- Учебник страны Оз
- Исследование языка программирования в UCL : одна из основных разработчиков Mozart/Oz, эта группа проводит исследования, используя Mozart/Oz в качестве средства.
- Мультипарадигмальное программирование в Mozart/Oz: Материалы MOZ 2004 : Конференция, на которой дается обзор работы, выполняемой с Mozart/Oz.
- Программирование в стране Оз
- Основы страны Оз
- Мультипарадигмальные языки программирования
- Функционально-логические языки программирования
- Логические языки программирования
- Динамически типизированные языки программирования
- Языки программирования на основе прототипов
- Параллельные языки программирования
- Образовательные языки программирования
- Языки программирования, созданные в 1991 году.