Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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.
  1. ^ "Информация о лицензии Моцарта Оз" . 16 января 2014 . Проверено 16 января 2014 года .
  2. Герт Смолка (1995). "Модель программирования страны Оз" (PDF) . Конспект лекций по информатике . 1000 : 324–343. DOI : 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 Surveys . 21 (3): 359–411. DOI : 10.1145 / 72551.72554 . S2CID 207637854 . 
  10. ^ Рао, AC & Varada Раджу, D (1991). «Применение метода числа Хэмминга для обнаружения изоморфизма кинематических цепей и инверсий». Теория механизмов и машин . 26 (1): 55–75. DOI : 10.1016 / 0094-114x (91) 90022-V .
  11. ^ Игра "Тесты компьютерного языка"

Внешние ссылки [ править ]

  • Официальный веб-сайт
  • Учебник Оз
  • Исследование языка программирования в UCL : одна из основных разработчиков Mozart / Oz, эта группа проводит исследования, используя Mozart / Oz в качестве средства передвижения.
  • Мультипарадигмальное программирование в Моцарте / Озе: Материалы МОЗ 2004 : Конференция, которая дает моментальный снимок работы, проделанной с Моцартом / Озом.
  • Программирование в Оз
  • Оз Основы