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   ноль  ))))   % в качестве записи.  2  |(  4  |(  6  |(  8  |  ноль  )))   % с синтаксическим сахаром  2  |  4  |  6  |  8  |  ноль   % больше синтаксического сахара  [  2   4   6   8  ]   % еще больше синтаксического сахара 

Эти структуры данных представляют собой значения (постоянные), первого класса и динамически проверяемые типы . Имена переменных в Oz начинаются с заглавной буквы, чтобы отличать их от литералов. [4] которые всегда начинаются со строчной буквы.

Функции [5] являются значениями первого класса, позволяющими функциональное программирование более высокого порядка:

fun   {  Факт   N  }     если   N   =<   0   , то   1   else   N  *  {  Факт   N  -  1  }   end  end 
fun   {  Comb   N   K  }     {  Fact   N  }   div   ({  Fact   K  }   *   {  Fact   N  -  K  })   % целых чисел не может переполниться в Оз (если не осталось памяти)  end  fun   {  SumList   List  }     case   Список   нулей   ,   затем   0     []   Ч  |  T   then   H  +  {  SumList   T  }   % сопоставление с шаблоном в     списка  конце 

Функции могут использоваться как со свободными, так и со связанными переменными. Значения свободных переменных находятся с использованием статической лексической области видимости . [6]

Программирование высшего порядка

[ редактировать ]

Функции похожи на другие объекты страны Оз. Функция может быть передана как атрибут другим функциям или возвращена в функции.

fun   {  Square   N  }    % Общая функция     N  *  N  end  fun   {  Map   F   Xs  }    % F здесь является функцией -     случай   программирования Xs        более высокого порядка :   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] для просмотра.

{  Обзор   {  Карта   развлечений   {  $  N  }   N  *  N   end   [  1   2   3  ]}} 

Поскольку анонимные функции не имеют имен, невозможно определить рекурсивные анонимные функции.

Процедуры

[ редактировать ]

Предполагается, что функции в Oz возвращают значение в последнем операторе, встретившемся в теле функции во время ее выполнения. В приведенном ниже примере функция Ret возвращает 5, если X > 0, и -5 в противном случае.

объявить  fun   {  Ret   X  },     если   X   >   0   , то   5   else   ~  5   end  end 

Но Oz также предоставляет возможность на случай, если функция не должна возвращать значения. Такие функции называются процедурами. [7] Процедуры определяются с использованием конструкции «proc» следующим образом:

объявить  proc   {  Ret   X  }     if   X   >   0   then   {  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  }     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   в     потоке   X   =   {  Ints   0   1000  }   end     thread   Y   =   {  Sum   0   X  }   end     {  Browse   Y  }  end 

Благодаря тому, как работают переменные потока данных, можно размещать потоки в любом месте программы и гарантировать, что результат будет одинаковым. Это делает параллельное программирование очень простым. Потоки очень дешевы: одновременно можно запустить 100 000 потоков. [8]

Пример: сито пробного деления

[ редактировать ]

В этом примере поток простых чисел вычисляется с использованием алгоритма пробного деления путем рекурсивного создания параллельных агентов потока, которые отфильтровывают непростые числа:

fun   {  Сито   Xs  }     случай   Xs   nil   nil   then   |     ]   X  [  Xr   , затем   Ys   в        потоке   Ys   =   {  Filter   Xr   fun   {  $  Y  }   Y   mod   X   \  =   0   end  }   end        X  | {  Sieve   Ys  }     end  end 

использует нетерпеливую оценку Оз по умолчанию , но ленивую оценку. [9] возможно. Ниже этот факт вычисляется только тогда, когда значение X необходимо для вычисления значения Y.

fun   lazy   {  Факт   N  }     if   N   =<   0   then   1   else   N  *  {  Факт   N  -  1  }   end  end  local   X   Y   in    X   =   {  Fact   100  }     Y   =   X   +   1  end 

Ленивые вычисления дают возможность хранить в Oz поистине бесконечные структуры данных. Силу ленивых вычислений можно увидеть из следующего примера кода:

объявить  fun   lazy   {  Merge   Xs   Ys  }     case   Xs  #  Ys     of   (  X  |  Xr  )  #  (  Y  |  Yr  )   then        if   X   <   Y   then   X  | {  Merge   Xr   Ys  }        else if   X  >  Y   then   Y  | {  Merge   Xs   Yr  }        else   X  |{  Объединить   Xr   Yr  }        end     end  end  fun   lazy   {  Times   N   Xs  }     case   Xs     of   nil   then   nil     []   X  |  Xr   , затем   N  *  X  |{  Times   N   Xr  }     end  end  объявляем   H  H   =   1   |   {  Объединить   {  Times   2   H  }   {  Объединить   {  Times   3   H  }   {  Times   5   H  }}}  {  Обзор   {  Список  .  возьми   H   6  }} 

Приведенный выше код элегантно вычисляет все обычные числа. [10] в бесконечном списке. Фактические цифры рассчитываются только тогда, когда они необходимы.

Параллельная передача сообщений

[ редактировать ]

Декларативная параллельная модель может быть расширена за счет передачи сообщений посредством простой семантики:

объявить  локальный   потока   порт   в     Port   =   {  NewPort   Stream  }     {  отправки   Порт   1  }   % Поток теперь равен 1|_ ('_' указывает на несвязанную и безымянную переменную)     {  отправки   Порт   2  }   % Поток теперь равен 1|2|_     .. .     {  отправки   Порт   n  }   % Поток теперь равен 1|2| .. |n|_  конец 

С помощью порта и потока можно определить асинхронные агенты:

fun   {  NewAgent   Init   Fun  }     Сообщение   потоке   в      {  FoldL   Msg   Fun   Init   Out  }   end     {  NewPort   Msg  }  end 

Состояние и объекты

[ редактировать ]

Декларативная модель снова может быть расширена для поддержки состояния и объектно-ориентированного программирования с очень простой семантикой. Чтобы создать новую изменяемую структуру данных под названием Cells:

local   A   X   in     A   =   {  NewCell   0  }     A   :  =   1    % изменяет значение A на 1     X   =   @  A    % @ используется для доступа к значению 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   просмотр  }  конец 

Скорость выполнения

[ редактировать ]

Скорость выполнения программы, созданной компилятором Моцарта (версия 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 дней с момента нарушения.)