Оз (язык программирования)
Парадигма | мультипарадигмальность : логическая , функциональная , императивная , объектно-ориентированная , ограниченная , распределенная , параллельная. |
---|---|
Разработано | Герт Смолка, его ученики |
Разработчик | Консорциум Моцарта |
Впервые появился | 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 nil)))) % as a record.
2|(4|(6|(8|nil))) % with some syntactic sugar
2|4|6|8|nil % more syntactic sugar
[2 4 6 8] % even more syntactic sugar
Эти структуры данных представляют собой значения (постоянные), первого класса и динамически проверяемые типы . Имена переменных в Oz начинаются с заглавной буквы, чтобы отличать их от литералов. [4] которые всегда начинаются со строчной буквы.
Функции
[ редактировать ]Функции [5] являются значениями первого класса, позволяющими функциональное программирование более высокого порядка:
fun {Fact N}
if N =< 0 then 1 else N*{Fact N-1} end
end
fun {Comb N K}
{Fact N} div ({Fact K} * {Fact N-K}) % integers can't overflow in Oz (unless no memory is left)
end
fun {SumList List}
case List of nil then 0
[] H|T then H+{SumList T} % pattern matching on lists
end
end
Функции можно использовать как со свободными, так и со связанными переменными. Значения свободных переменных находятся с использованием статической лексической области видимости . [6]
Программирование высшего порядка
[ редактировать ]Функции похожи на другие объекты страны Оз. Функция может быть передана как атрибут другим функциям или возвращена в функции.
fun {Square N} % A general function
N*N
end
fun {Map F Xs} % F is a function here - higher order programming
case Xs
of 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]
для просмотра.
{Browse {Map fun {$ N} N*N end [1 2 3]}}
Поскольку анонимные функции не имеют имен, невозможно определить рекурсивные анонимные функции.
Процедуры
[ редактировать ]Предполагается, что функции в Oz возвращают значение в последнем операторе, встретившемся в теле функции во время ее выполнения. В приведенном ниже примере функция Ret возвращает 5, если X > 0, и -5 в противном случае.
declare
fun {Ret X}
if X > 0 then 5 else ~5 end
end
Но Oz также предоставляет возможность на случай, если функция не должна возвращать значения. Такие функции называются процедурами. [7] Процедуры определяются с использованием конструкции «proc» следующим образом:
declare
proc {Ret X}
if X > 0 then {Browse 5} else {Browse ~5} end
end
Приведенный выше пример не возвращает никакого значения, он просто печатает 5 или -5 в браузере Oz в зависимости от знака X.
Переменные потока данных и декларативный параллелизм
[ редактировать ]Когда программа встречает несвязанную переменную, она ожидает значения. Например, ниже поток будет ждать, пока X и Y не будут привязаны к значению, прежде чем показывать значение Z.
thread
Z = X+Y
{Browse Z}
end
thread X = 40 end
thread Y = 2 end
Значение переменной потока данных не может быть изменено после ее привязки:
X = 1
X = 2 % error
Переменные потока данных упрощают создание агентов одновременного потока:
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 in
thread X = {Ints 0 1000} end
thread Y = {Sum 0 X} end
{Browse Y}
end
Благодаря тому, как работают переменные потока данных, можно размещать потоки в любом месте программы и гарантировать, что результат будет одинаковым. Это делает параллельное программирование очень простым. Потоки очень дешевы: одновременно можно запустить 100 000 потоков. [8]
Пример: сито пробного деления
[ редактировать ]В этом примере поток простых чисел вычисляется с использованием алгоритма пробного деления путем рекурсивного создания параллельных агентов потока, которые отфильтровывают непростые числа:
fun {Sieve Xs}
case Xs of nil then nil
[] X|Xr then Ys in
thread Ys = {Filter Xr fun {$ Y} Y mod X \= 0 end} end
X|{Sieve Ys}
end
end
Лень
[ редактировать ]использует нетерпеливую оценку Оз по умолчанию , но ленивую оценку. [9] возможно. Ниже этот факт вычисляется только тогда, когда значение X необходимо для вычисления значения Y.
fun lazy {Fact 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 поистине бесконечные структуры данных. Силу ленивых вычислений можно увидеть в следующем примере кода:
declare
fun lazy {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}
end
end
end
fun lazy {Times N Xs}
case Xs
of nil then nil
[] X|Xr then N*X|{Times N Xr}
end
end
declare H
H = 1 | {Merge {Times 2 H} {Merge {Times 3 H} {Times 5 H}}}
{Browse {List.take H 6}}
Приведенный выше код элегантно вычисляет все обычные числа. [10] в бесконечном списке. Фактические цифры рассчитываются только тогда, когда они необходимы.
Параллельная передача сообщений
[ редактировать ]Декларативная параллельная модель может быть расширена за счет передачи сообщений посредством простой семантики:
declare
local Stream Port in
Port = {NewPort Stream}
{Send Port 1} % Stream is now 1|_ ('_' indicates an unbound and unnamed variable)
{Send Port 2} % Stream is now 1|2|_
...
{Send Port n} % Stream is now 1|2| .. |n|_
end
С помощью порта и потока можно определить асинхронные агенты:
fun {NewAgent Init Fun}
Msg Out in
thread {FoldL Msg Fun Init Out} end
{NewPort Msg}
end
Состояние и объекты
[ редактировать ]Декларативная модель снова может быть расширена для поддержки состояния и объектно-ориентированного программирования с очень простой семантикой. Чтобы создать новую изменяемую структуру данных под названием Cells:
local A X in
A = {NewCell 0}
A := 1 % changes the value of A to 1
X = @A % @ is used to access the value of 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 browse}
end
Скорость выполнения
[ редактировать ]Скорость выполнения программы, созданной компилятором Моцарта (версия 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 году.