Oz (programovací jazyk)

Z Wikipedie, otevřené encyklopedie

Oz je multiparadigmatický programovací jazyk vyvinutý v laboratoři programovacích systémů na Katolické univerzitě v Lovani pro výuku programovacích jazyků. Má vlastní kanonickou učebnici: Koncepty, techniky a modely počítačového programování.

Oz poprvé vyvinul Gert Smolka spolu se svými studenty v roce 1991. Na dalším vývoji se v roce 1996 podíleli Seif Haridi a Peter Van Roy ve Švédském institutu informatiky. Od roku 1999 byl Oz v nepřetržitém vývoji mezinárodní skupiny Mozartovo konsorcium, které se skládalo ze Sárské univerzity, Švédského institutu informatiky a Katolické univerzity v Lovani. V roce 2005 byla odpovědnost za řízení vývoje Mozarta převedena na základní skupinu Mozart Board s výslovným cílem otevřít vývoj větší komunitě.

Mozartův programovací systém je primární implementací Oze. Je vydán s open-source licencí od Mozartova konsorcia. Mozart byl portován na Unix, FreeBSD, Linux, Windows a macOS.

Vlastnosti jazyka[editovat | editovat zdroj]

Oz[1] obsahuje většinu konceptů hlavních programovacích paradigmat včetně logického, funkcionálního, imperativního, objektově orientovaného, omezeného, distribuovaného a souběžného programování. Oz má jak jednoduchou formální sémantiku tak efektivní implementaci. Je souběžně orientovaný jazyk, jak ho představil Joe Armstrong, hlavní vývojář jazyka Erlang (programovací jazyk). Díky Tomu je jeho použití efektivní. Oz podporuje kanonický jazyk QTk[2] v grafickém uživatelském rozhraní (GUI).

Kromě programování s více paradigmaty jsou jeho hlavní silnou stránkou omezené programování a distribuované programování. Díky svému zapracovanému designu je Oz schopen úspěšně implementovat síťové transparentní modely distribuovaného programování. Tento model usnadňuje programování otevřených aplikací v systému odolném proti selhání v daném jazyce. Pro omezené programování představil Oz myšlenku výpočetních prostorů, které umožňují uživatelem definované strategie vyhledávání a distribuce ortogonálně k doméně omezení.

Přehled[editovat | editovat zdroj]

Datové struktury[editovat | editovat zdroj]

Oz je založen na základním jazyce s velmi malým počtem datových typů, které lze ale rozšířit pomocí syntaktického cukru.

Základní datové struktury:

  • Čísla: reálná nebo celá čísla
  • Záznamy: pro seskupování údajů: circle(x:0 y:1 radius:3 color:blue style:dots). Zde se prvky x,y, rádius atd. nazývají prvky a data s nimi spojená (v tomto případě 0, 1, 3 atd. jsou hodnoty).
  • N-tice: Záznam celého čísla je k dispozici ve vzestupném pořadí: circle(1:0 2:1 3:3 4:blue 5:dots) .
  • Seznamy: jednoduchá lineární struktura
'|'(2 '|'(4 '|'(6 '|'(8 nil)))) % prostý záznam
2|(4|(6|(8|nil))) % s trochou syntaktického cukru
2|4|6|8|nil % více syntaktického cukru
[2 4 6 8] % ještě více syntaktického cukru

Těmito datovými strukturami jsou hodnoty (konstantní), kontrola první třídy a dynamického typu. Názvy proměnných začínají velkým písmenem, aby se odlišily od literálů,[3] které vždy začínají malým písmenem.

Funkce[editovat | editovat zdroj]

Funkce[4] jsou hodnoty první třídy, které umožňují funkční programování vyššího řádu:

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}) % celá čísla nemohou přetékat (nezbyla by žádná paměť)
end

fun {SumList List}
   case List of nil then 0
   [] H|T then H+{SumList T} % párování vzorů v seznamech
   end
end

Funkce lze použít s volnými i vázanými proměnnými. Hodnoty volných proměnných jsou nalezeny pomocí statického lexikálního rozsahu.[5]

Programování vyšších řádů[editovat | editovat zdroj]

Funkce jsou jako ostatní objekty. Mohou být předány jako atribut jiným funkcím nebo mohou být vráceny ve funkci.

fun {Square N}  % obecná funkce
   N*N
end

fun {Map F Xs}  % F je zde funkce - programování vyššího řádu
   case Xs
      of nil then nil
      [] X|Xr then {F X}|{Map F Xr}
   end
end

% použití
{Browse {Map Square [1 2 3]}}  % procházení [1 4 9]

Anonymní funkce[editovat | editovat zdroj]

Stejně jako mnoho jiných funkcionálních jazyků podporuje i Oz použití anonymních funkcí (tj. funkcí, které nemají název) při programování vyšších řádů. K jejich označení se používá symbol $.

Níže je funkce čtverce definována anonymně a předána, což způsobí [1 4 9] procházení.

{Browse {Map fun {$ N} N*N end [1 2 3]}}

Protože anonymní funkce nemají jména, není možné definovat rekurzivní anonymní funkce.

Procedury[editovat | editovat zdroj]

Funkce mají vrátit hodnotu při posledním příkazu nalezeném v těle funkce během jejího provádění. V níže uvedeném příkladu funkce Ret vrátí 5, pokud X>0 a jinak -5.

declare
fun {Ret X}
   if X > 0 then 5 else ~5 end
end

Dále je Oz ošetřen pro případ, že funkce nesmí vracet hodnoty. Takovým funkcím se říká procedury.[6] Procedury jsou definovány pomocí konstruktu "proc" následovně:

declare
proc {Ret X}
   if X > 0 then {Browse 5} else {Browse ~5} end
end

Výše uvedený příklad nevrací žádnou hodnotu, pouze vytiskne 5 nebo -5 v prohlížeči Oz v závislosti na znaménku X.

Proměnné v toku dat a deklarativní souběžnost[editovat | editovat zdroj]

Když program narazí na nevázanou proměnnou, čeká na hodnotu. Například níže bude vlákno čekat, dokud nebudou X a Y vázány s hodnotou, než se zobrazí hodnota Z.

thread 
   Z = X+Y
   {Browse Z}
end
thread X = 40 end
thread Y = 2 end

Hodnotu proměnné toku dat nelze měnit, pokud je proměnná vázána:

X = 1
X = 2 % chyba

Proměnné toku dat usnadňují vytváření souběžných původců proudu:

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

Z důvodu fungování toku proměnných je možné umístit vlákna komkoli v programu a zaručit, že bude mít stejný výsledek. Díky tomu je souběžné programování velmi snadné. Vlákna jsou velmi úsporná: je možné mít spuštěných 100 000 vláken najednou.[7]

Příklad: Zkušební dělicí síto[editovat | editovat zdroj]

Tento příklad počítá proud prvočísel pomocí algoritmu zkušebního dělení rekurzivním vytvářením souběžných původců proudu, kteří odfiltrují jiná než prvočísla:

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

Odložené vyhodnocování[editovat | editovat zdroj]

Oz používá ve výchozím nastavení okamžité vyhodnocování, ale odložené vyhodnocování je možné také. Níže je skutečnost vypočítána pouze tehdy, když je pro výpočet hodnoty Y potřeba hodnota X.

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

Odložené vyhodnocování dává možnost ukládání skutečně nekonečných datových struktur. Síla odloženého vyhodnocování je patrná z následující ukázky kódu:

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}}

Výše uvedený kód elegantně spočítá všechna regulární čísla[8] v nekonečném seznamu. Skutečná čísla se počítají pouze, když jsou potřeba.

Souběžnost předávání zpráv[editovat | editovat zdroj]

Deklarativní souběžný model lze rozšířit o předávání zpráv pomocí jednoduché sémantiky:

declare
local Stream Port in
   Port = {NewPort Stream}
   {Send Port 1} % proud je nyní 1|_ ('_' označeno nevázanou a nepojmenovanou proměnnou)
   {Send Port 2} % proud je nyní 1|2|_ 
   ...
   {Send Port n} % proud je nyní 1|2| .. |n|_
end

S portem a vláknem lze definovat asynchronní původce:

fun {NewAgent Init Fun}
   Msg Out in
   thread {FoldL Msg Fun Init Out} end
   {NewPort Msg}
end

Stav a objekty[editovat | editovat zdroj]

Je opět možné rozšířit deklarativní model o podporu stavového a objektově orientovaného programování (zkratka OOP) s velmi jednoduchou sémantikou. Vytvoření nové proměnlivé datové struktury s názvem buňky:

local A X in
   A = {NewCell 0}
   A := 1  % změní hodnotu A na 1
   X = @A  % @ použito k přístupu k hodnotě A
end

Pomocí těchto jednoduchých sémantických změn lze podpořit celé objektově orientované paradigma. S trochou syntaktického cukru se OOP dobře integruje.

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

Rychlost provedení[editovat | editovat zdroj]

Rychlost provádění programu vytvořeného překladačem Mozart (verze 1.4.0 implementující Oz 3) je velmi pomalá. Na sadě benchmarků je v průměru asi 50krát pomalejší než GNU Compiler Collection (GCC) pro jazyk C, přičemž řeší benchmarky - úkoly.[9]

Související články[editovat | editovat zdroj]

Reference[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku Oz (programming language) na anglické Wikipedii.

  • Peter Van Roy and Seif Haridi (2004). Koncepty, techniky a modely počítačového programování. MIT Press. Dostupné online. (anglicky)
  1. Gert Smolka. The Oz Programming Model. Lecture Notes in Computer Science. 1995, s. 324–343. Dostupné online. ISBN 978-3-540-60105-0. DOI 10.1007/BFb0015252. 
  2. QTk [online]. [cit. 2021-07-26]. Dostupné v archivu pořízeném dne 20 May 2013. 
  3. https://mozart.github.io/mozart-v1/doc-1.4.0/tutorial/node3.html#label18
  4. Leif Grönqvist. Advanced Functional Programming in Oz. [s.l.]: [s.n.] Dostupné v archivu pořízeném dne 3 March 2016. Kapitola Higher Order Functions. 
  5. Robert Gentleman; ROSS IHAKA. Lexical Scope in Statistical Computing. Journal of Computational and Graphical Statistics. Sep 2000, s. 491–508. Dostupné online. 
  6. https://mozart.github.io/mozart-v1/doc-1.4.0/tutorial/node5.html#control.procedure
  7. Archived copy [online]. [cit. 2008-11-29]. Dostupné v archivu pořízeném z originálu dne 24 February 2015. 
  8. Rao, AC; VARADA RAJU, D. Application of the Hamming number technique to detect isomorphism among kinematic chains and inversions. Mechanism and Machine Theory. 1991, s. 55–75. DOI 10.1016/0094-114x(91)90022-v. 
  9. The Computer Language Benchmarks Game

Externí odkazy[editovat | editovat zdroj]