Jump to content

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

(Перенаправлено с языка программирования Оз )

Оз
Парадигма мультипарадигмальность : логическая , функциональная , императивная , объектно-ориентированная , ограниченная , распределенная , параллельная.
Разработано Герт Смолка, его ученики
Разработчик Консорциум Моцарта
Впервые появился 1991 год ; 33 года назад ( 1991 )
Стабильная версия
Оз 1.4.0 (финальный), Моцарт 2.0.1 / 5 сентября 2018 г .; 5 лет назад ( 05.09.2018 )
Дисциплина набора текста динамичный
Лицензия С X11 [1]
Веб-сайт Моцарт .github .что
Основные реализации
Система программирования Моцарта
Диалекты
Оз, Моцарт
Под влиянием
Эрланг , Лисп , Пролог
Под влиянием
Алиса , Скала

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]

См. также

[ редактировать ]
  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. ^ «3 основы» .
  5. ^ Лейф Грёнквист. «Функции высшего порядка». Продвинутое функциональное программирование в стране Оз . Архивировано из оригинала 3 марта 2016 года . Проверено 3 ноября 2014 г.
  6. ^ Роберт Джентльмен; Росс Ихака (сентябрь 2000 г.). «Лексическая область действия в статистических вычислениях» (PDF) . Журнал вычислительной и графической статистики . 9 (3, Системы и языки): 491–508. дои : 10.1080/10618600.2000.10474895 .
  7. ^ «5 основных структур управления» .
  8. ^ «Архивная копия» . Архивировано из оригинала 24 февраля 2015 года . Проверено 29 ноября 2008 г. {{cite web}}: CS1 maint: архивная копия в заголовке ( ссылка )
  9. ^ Пол Худак (1989). «Концепция, эволюция и применение языков функционального программирования». Обзоры вычислительной техники ACM . 21 (3): 359–411. дои : 10.1145/72551.72554 . S2CID   207637854 .
  10. ^ Рао, AC и Варада Раджу, D (1991). «Применение метода чисел Хэмминга для обнаружения изоморфизма кинематических цепей и инверсий». Теория механизма и машин . 26 (1): 55–75. дои : 10.1016/0094-114x(91)90022-v .
  11. ^ Игра с тестами компьютерного языка
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 4145161810ccf1f52f99bfbc9ad55930__1715604660
URL1:https://arc.ask3.ru/arc/aa/41/30/4145161810ccf1f52f99bfbc9ad55930.html
Заголовок, (Title) документа по адресу, URL1:
Oz (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)