Оз (язык программирования) - Oz (programming language)

Унция
Парадигмамультипарадигма: логика, функциональный, императив, объектно-ориентированный, ограничение, распределен, одновременный
РазработаноГерт Смолка, его ученики
РазработчикКонсорциум Моцарта
Впервые появился1991; 29 лет назад (1991)
Стабильный выпуск
Оз 1.4.0 (финал), Моцарт 2.0.1 / 5 сентября 2018 г.; 2 года назад (2018-09-05)
Печатная дисциплинадинамичный
ЛицензияMIT X11[1]
Интернет сайтМоцарт.github.io
Основной реализации
Система программирования Моцарта
Диалекты
Оз, Моцарт
Под влиянием
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][неудачная проверка ]

Смотрите также

Рекомендации

  1. ^ "Информация о лицензии Моцарта Оз". 16 января 2014 г.. Получено 16 января 2014.
  2. ^ Герт Смолка (1995). "Модель программирования страны Оз" (PDF). Конспект лекций по информатике. 1000: 324–343. Дои:10.1007 / BFb0015252. ISBN  978-3-540-60105-0.
  3. ^ «QTk». Архивировано из оригинал 20 мая 2013 г.. Получено 6 апреля 2009.
  4. ^ https://mozart.github.io/mozart-v1/doc-1.4.0/tutorial/node3.html#label18
  5. ^ Лейф Грёнквист. «Функции высшего порядка». Расширенное функциональное программирование в Унции. Архивировано из оригинал 3 марта 2016 г.. Получено 3 ноября 2014.
  6. ^ Роберт Джентльмен; Росс Ихака (сентябрь 2000 г.). «Лексический объем в статистических вычислениях» (PDF). Журнал вычислительной и графической статистики. 9 (3, Системы и языки): 491–508.
  7. ^ https://mozart.github.io/mozart-v1/doc-1.4.0/tutorial/node5.html#control.procedure
  8. ^ «Архивная копия». Архивировано из оригинал 24 февраля 2015 г.. Получено 29 ноябрь 2008.CS1 maint: заархивированная копия как заголовок (связь)
  9. ^ Пол Худак (1989). «Концепция, эволюция и применение языков функционального программирования». Опросы ACM Computing. 21 (3): 359–411. Дои:10.1145/72551.72554.
  10. ^ Рао, А.С. и Варада Раджу, Д. (1991). «Применение метода числа Хэмминга для обнаружения изоморфизма кинематических цепей и инверсий». Механизм и теория машин. 26 (1): 55–75. Дои:10.1016 / 0094-114x (91) 90022-в.
  11. ^ Игра "Тесты компьютерного языка"

внешняя ссылка