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

Oz (язык программирования)
Oz
Семантика:

функциональный, процедурный, декларативный, объектно-ориентированный, вычисления с ограничениями, Н-модели, параллельные вычисления

Тип исполнения:

компилируемый

Появился в:

1991

Автор(ы):

Gert Smolka & his students

Релиз:

1.4.0 (July 3 2008)

Основные реализации:

Mozart

Испытал влияние:

Пролог

Повлиял на:

Alice

Сайт:

www.mozart-oz.org

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), состоящей из трёх университетов: Университет земли Саар (Saarland University), Шведский институт информатики (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 

покажет все решения данного ребуса в виде таблицы.

См. также

Примечания

Ссылки



Wikimedia Foundation. 2010.

Игры ⚽ Поможем написать курсовую

Полезное


Смотреть что такое "Oz (язык программирования)" в других словарях:

  • Язык программирования C++ — Эта статья о книге; о языке программирования см.: C++. Язык программирования C++ The C++ Programming Language Автор: Бьёрн Страуструп Язык оригинала: английский Оригинал издан: 1986 Издательство: Addison–Wesley …   Википедия

  • Язык программирования Java — разработанный корпорацией Sun Microsistems межплатформенный, интерпретируемый, объектно ориентированный язык программирования, используемый для создания приложений, работающих в под управлением веб браузера и характеризующихся высоким уровнем… …   Финансовый словарь

  • Язык программирования Паскаль — процедурно ориентированный язык программирования высокого уровня, предназначенный для широкого класса задач. Язык Паскаль считается языком структурного программирования. По английски: Pascal language См. также: Процедурно ориентированные языки… …   Финансовый словарь

  • Язык программирования — искусственный (формальный) язык, предназначенный для записи алгоритмов. Язык программирования задается своим описанием и реализуется в виде специальной программы: компилятора или интерпретатора. По английски: Programming language Синонимы:… …   Финансовый словарь

  • Язык программирования COBOL — язык программирования, предназначенный для решения экономических задач и задач обработки коммерческой информации. Язык COBOL отличается развитыми средствами работы с файлами и формой записи, приближенной к английскому языку. По английски: COBOL… …   Финансовый словарь

  • Язык программирования Лисп — универсальный язык программирования высокого уровня. Язык Лисп: относится к декларативным языкам функционального типа; предназначен для обработки символьных данных, представленных в виде списков. Основой языка являются функции и рекурсивные… …   Финансовый словарь

  • Язык программирования Ада — универсальный язык программирования: предназначенный для создания сложных систем; характеризующийся высокой степенью независимости от операционных систем; обеспечивающий поддержку средств параллельной обработки данных в реальном времени. По… …   Финансовый словарь

  • Язык программирования Алгол — язык программирования, предназначенный для решения численных задач. Программа на языке ALGOL имеет блочную структуру, позволяющую эффективно реализовывать механизмы динамического распределения памяти. По английски: ALGOL language См. также:… …   Финансовый словарь

  • Язык программирования Модула — алгоритмический язык, предназначенный для составления программ, работающих в реальном времени. В языке Модула используются: понятия модуля и процесса; средства программирования низкого уровня. Программа на языке Модула формируется из независимых… …   Финансовый словарь

  • Язык программирования Пролог — язык логического программирования, программа на котором состоит: из логических утверждений, образующих базу данных; и из правила вывода новых утверждений из известных. По английски: PROLOG language См. также: Декларативные языки программирования… …   Финансовый словарь

  • Язык программирования Форт — процедурно ориентированный язык программирования, предназначенный для эффективной работы с персональными системами. Форт близок к языку ассемблера. См. также: Процедурно ориентированные языки программирования Финансовый словарь Финам …   Финансовый словарь


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»