Oz (programovací jazyk): Porovnání verzí
nová stránka: „{{Překlad|en|Oz (programming language)|1024438984}} '''Oz''' je multiparadigmatický programovací jazyk vyvinutý v Programming Systems Lab na Université catholique de Louvain 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 po…“ značky: první editace editace z Vizuálního editoru |
(Žádný rozdíl)
|
Verze z 26. 7. 2021, 14:14
V tomto článku byl použit překlad textu z článku Oz (programming language) na anglické Wikipedii.
Oz je multiparadigmatický programovací jazyk vyvinutý v Programming Systems Lab na Université catholique de Louvain 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 Université catholique de Louvain. 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 Mozartového konsorcia. Mozart byl portován na Unix, FreeBSD, Linux, Windows a macOS.
Vlastnosti jazyka
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
Datové struktury
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, radius 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)))) % 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
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
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}) % 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
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ů
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} % 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]
Anonymní funkce
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
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
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 % error
Proměnné toku dat usnadňují vytváření souběžných agentů 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ělící síto
Tento příklad počítá proud prvočísel pomocí algoritmu zkušebního dělení rekurzivním vytvářením souběžných agentů 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í
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
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} % 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
S portem a vláknem lze definovat asynchronní agenty:
fun {NewAgent Init Fun}
Msg Out in
thread {FoldL Msg Fun Init Out} end
{NewPort Msg}
end
Stav a objekty
Je opět možné rozšířit deklarativní model o podporu stavového a objektově orientovaného programování 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 % changes the value of A to 1
X = @A % @ is used to access the value of 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í
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
- Alice (programovací jazyk) současný funkční omezující jazyk ze Sárské univerzity
- Dataflow programming
- Functional logic programming languages
- Curry (programming language)
- Mercury (programovací jazyk)
- Visual Prolog objektově orientovaný, funkční, logický jazyk
References
- Peter Van Roy and Seif Haridi (2004). Concepts, Techniques, and Models of Computer Programming. MIT Press. There is online supporting material for this book. The book, an introduction to the principles of programming languages, uses Oz as its preferred idiom for examples.
- ↑ 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.
- ↑ QTk [online]. [cit. 2009-04-06]. Dostupné v archivu pořízeném z originálu dne 20 May 2013.
- ↑ https://mozart.github.io/mozart-v1/doc-1.4.0/tutorial/node3.html#label18
- ↑ Leif Grönqvist. Advanced Functional Programming in Oz. [s.l.]: [s.n.] Dostupné v archivu pořízeném z originálu dne 3 March 2016. Kapitola Higher Order Functions.
- ↑ Robert Gentleman; ROSS IHAKA. Lexical Scope in Statistical Computing. Journal of Computational and Graphical Statistics. Sep 2000, s. 491–508. Dostupné online.
- ↑ https://mozart.github.io/mozart-v1/doc-1.4.0/tutorial/node5.html#control.procedure
- ↑ Archived copy [online]. [cit. 2008-11-29]. Dostupné v archivu pořízeném z originálu dne 24 February 2015.
- ↑ 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.
- ↑ The Computer Language Benchmarks Game
Externí odkazy
- Oficiální webové stránky [1]
- Výukový program pro Oz
- Programming Language Research at UCL: One of the core developers of Mozart/Oz, this group does research using Mozart/Oz as the vehicle
- Multiparadigm Programming in Mozart/Oz: Proceedings of MOZ 2004: Conference which gives a snapshot of the work being done with Mozart/Oz
- Programování v Oz
- Oz Základy