Oz (язык программирования)
Oz | |
---|---|
Семантика | функциональный, процедурный, декларативный, объектно-ориентированный, вычисления с ограничениями, Н-модели, параллельные вычисления |
Класс языка | язык программирования, язык программирования в ограничениях[вд] и мультипарадигмальный |
Тип исполнения | компилируемый |
Появился в | 1991 |
Автор | Gert Smolka & his students |
Выпуск |
Oz 1.4.0 Mozart 2.0.1 (5 сентября 2018 ) |
Основные реализации | Mozart |
Испытал влияние | Пролог |
Повлиял на | Alice |
Лицензия | лицензия MIT |
Сайт | mozart.github.io |
Oz — учебный язык программирования высокого уровня, в котором совмещены функциональная, процедурная, декларативная семантики.
История разработки
[править | править код]Разработку языка программирования Oz начал в 1991 году профессор Gert Smolka со своими студентами из лаборатории систем программирования Лувенского католического университета в Бельгии. В 1996 году к процессу разработки подключились Seif Haridi и Peter Van Roy из Шведского института информатики (Swedish Institute of Computer Science), которые использовали этот язык в своём классическом учебнике Concepts, Techniques, and Models of Computer Programming[1]. С 1999 до 2005 года язык развивался под руководством международной научно-исследовательской группы (Mozart Consortium), состоящей из трёх университетов: Саарский университет, Шведский институт информатики (Swedish Institute of Computer Science) и Лувенский католический университет.
Высококачественная открытая реализация языка Oz — Mozart включает IDE на основе расширения редактора Emacs, компилятор, отладчик, профайлер и другие утилиты.
Управление разработкой системы программирования Mozart в 2005 году было передано группе разработчиков (Mozart Board) с целью привлечения более широкого круга исследователей. Эта система выпущена группой Mozart Consortium под свободной лицензией и впоследствии перенесена (портирована) на большинство популярных операционных систем, в том числе Unix, FreeBSD, Linux, Microsoft Windows и Mac OS X.
Особенности языка
[править | править код]Язык программирования Oz включает в себя большинство концепций популярных парадигм программирования, в том числе логического, функционального (причём как «ленивые», так и «энергичные» вычисления), императивного, объектно-ориентированного, программирования с ограничениями, распределённого и параллельного программирования. С одной стороны, Oz обладает простой формальной семантикой, а с другой — для него создана эффективная программная реализация.
К основным преимуществам этого языка относится поддержка мультипарадигменного программирования, программирования в ограничениях, а также распределённое программирование. Так, на уровне языковых конструкций поддерживается простое и естественное распараллеливание и распределение вычислений по сети, что позволяет легко создавать отказоустойчивые приложения. Для реализации программирования в ограничениях в языке Oz вводится концепция вычислительных пространств (computation spaces), в которой происходит поиск решения. Это позволяет решать задачи математического программирования, и, в частности, задачи дискретной оптимизации.
Обзор языка
[править | править код]Структуры данных
[править | править код]Ядро языка образовано несколькими основными структурами данных, но может быть расширено с помощью так называемого синтаксического сахара.
Основные структуры данных:
- Числа (целые или с плавающей запятой)
- Записи (для группировки элементов данных):
circle(x:0 y:1 radius:3 color:blue style:dots)
- Списки (простые линейные структуры):
'|'(2 '|'(4 '|'(6 '|'(8 nil)))) 2|(4|(6|(8|nil))) % синтаксический сахар 2|4|6|8|nil % ещё более краткая запись [2 4 6 8] % эффективное применение синтаксического сахара для реализации лаконичного синтаксиса
Эти значения являются константными сущностями первого рода (first class), типизация при этом динамическая.
Функции
[править | править код]Функции являются сущностями первого рода, что позволяет применять парадигму функционального программирования:
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}) % целые числа могут иметь сколь угодно большое значение end fun {SumList List} % сумма элементов списка case List of nil then 0 [] H|T then H+{SumList T} % сопоставление с образцом для списка end end
Потоковые переменные и декларативный параллелизм
[править | править код]Если программа обнаруживает несвязанную переменную, она ожидает до тех пор, пока переменной будет присвоено значение:
thread Z = X+Y % ожидает до тех пор, пока переменные X и Y не получат значения {Browse Z} % отображает значение 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 потоков[2].
Примеры программ на языке Oz
[править | править код]В данном примере вычисляется поток простых чисел с использованием алгоритма решето Эратосфена. Для этого рекурсивно создаются параллельные потоки, которые отсеивают составные числа:
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
Ленивые вычисления
[править | править код]По умолчанию, Oz использует модель энергичных вычислений, но также поддерживает и так называемые ленивые вычисления:
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 % поскольку требуется значение X, оно вычисляется именно в этот момент end
Передача сообщений
[править | править код]Модель декларативного параллелизма может быть расширена с использованием механизма передачи сообщений:
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
Пример программы на языке Oz, решающей ребус
[править | править код]Условие:
ФУТ +БОЛ --- ИГРА Где И=0 и все различные буквы означают различные цифры.
Решение:
local Fut Res in proc {Fut C} F#U#T#B#O#L#G#R#A = C in C ::: 0#9 {FD.distinct C} F \=: 0 B \=: 0 100 * F + 10* U + T + 100*B + 10*O + L =: 100*G + 10*R + A {FD.distribute ff C} end {SearchAll Fut Res} {Browse Res} end
покажет все решения данного ребуса в виде таблицы.
См. также
[править | править код]Примечания
[править | править код]- ↑ Concepts, Techniques, and Models of Computer Programming . Дата обращения: 30 ноября 2010. Архивировано 26 августа 2014 года.
- ↑ Mozart-oz.org Concurrency . Дата обращения: 30 ноября 2010. Архивировано из оригинала 24 февраля 2015 года.
Ссылки
[править | править код]- The Mozart Programming System
- Strasheela — «Электронный композитор», написанный на Oz / Mozart
- Tutorial of Oz (Учебник языка Oz)
- Языки программирования по алфавиту
- Языки программирования, появившиеся в 1991 году
- Функциональные языки программирования
- Объектно-ориентированные языки программирования
- Языки параллельного программирования
- Языки программирования для образования
- Языки логического программирования
- Прототипно-ориентированные языки программирования