Oz | |
Datum první verze | 1995 |
---|---|
Paradigmata | objekt , imperativ , souběžný , funkční , logický , omezený , distribuovaný |
Autoři | Gert Smolka , Christian Schulte , Hugo Sky , Peter Van Roy |
Vývojáři | autoři a další přispěvatelé |
Poslední verze | 1.4.0 (3. července 2008) |
Psaní na stroji | Silný , dynamický |
Ovlivněno | Prolog , CC , AKL , Lisp , Haskell , Erlang |
Ovlivněno | rozšíření pro logické a omezovací programování v PyPy |
Implementace | Mozart |
Napsáno | C ++ |
Operační systém | Cross-platform |
Licence | Typ BSD |
webová stránka | [1] |
Oz je programovací jazyk, který umožňuje používat a kombinovat různá paradigmata programování:
Oz poskytuje logické proměnné ve výchozím nastavení, i když je možné použít proměnlivé proměnné. Podobně je hodnocení ve výchozím nastavení přísné, ale je možné líné hodnocení .
Originalitou tohoto jazyka ve srovnání s ostatními podporujícími logické programování (na jedné straně) nebo souběžné a distribuované programování (na druhé straně, jako je Erlang ), je integrace těchto paradigmat do souvislého celku. Jedinečnou abstrakci poskytuje Oz: Computing Space , který umožňuje zapouzdření výpočtů pro spekulativní účely a umožňuje kombinovat logické / omezení, orientaci a proměnlivost objektu, konkurenční a distribuční aspekty ve stejném jazyce.
Oz má distribuovaný systém sběru odpadu a systém pro správu výjimek .
Oz je implementován systémem Mozart, který poskytuje kompilátor, virtuální stroj a vývojové prostředí využívající EMACS pro editační část, grafický debugger podporující souběžnost a distribuci, nástroj pro hledání stromu pro programování podle omezení atd.
Kniha Koncepty, techniky a modely počítačového programování (MIT Press, 2004) používá Oz jako primární jazyk k ilustraci různých programovacích konceptů. Existují univerzitní kurzy francouzského programování založené na Oz a této knize.
Tento jazyk vyvinuli tři školy:
Poznámka: Původ jména Oz pochází ze slavné dětské pohádky Čaroděj ze země Oz .
Oz je založen na podmnožině jazyka, který se nazývá „jazyk jádra“ a který má několik datových typů, které lze rozšířit na jiné, pohodlnější pomocí syntaktického cukru .
Základní datové struktury:
Tyto datové struktury jsou dynamicky zadávané hodnoty (konstanty). Názvy proměnných v Oz jsou psány prvním velkým písmenem, aby se odlišily od doslovných konstant (atomy začínající malými písmeny).
Funkce jsou hodnotami první třídy, což umožňuje 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}) % Pas de dépassement d'entier en Oz (tant qu'il reste de la mémoire) end fun {SumList List} case List of nil then 0 [] H|T then H+{SumList T} % Détection de forme sur liste end endFunkce mohou používat volné i propojené proměnné. Volné proměnné se nacházejí podle lexikálního rozsahu .
Programování vyšších řádůFunkce jsou jako ostatní prvky Oz. Funkce může být předána jako atribut jiné funkci nebo jí může být vrácena.
fun {Square N} % Une simple fonction N*N end fun {Map F Xs} % F est une fonction ici (utilisation de la programmation d'ordre supérieur) case Xs of nil then nil [] X|Xr then {F X}|{Map F Xr} end end %Utilisation {Browse {Map Square [1 2 3]}} %Affiche [1 4 9] Anonymní funkceStejně jako mnoho jiných funkčních jazyků podporuje Oz i použití anonymních funkcí (které nemají jména) s programováním vyššího řádu. Pro tento účel se používá symbol $.
% La fonction élevée au carré est passée comme argument anonymement {Browse {Map fun {$ N} N*N end [1 2 3]}} % Affiche [1 4 9]Protože anonymní funkce nemají název, není možné rekurzivně definovat anonymní funkce.
PostupyFunkce v Oz musí během provádění vrátit hodnotu jako poslední instrukci funkce. V následujícím příkladu funkce Ret vrací 5, pokud X> 0 a jinak -5.
declare fun {Ret X} if X > 0 then 5 else ~5 end endAle Oz také poskytuje funkce v případě, že nechceme vrátit hodnotu. Takovým funkcím se říká procedury. Postupy jsou definovány pomocí klíčového slova proc, a to následovně:
declare proc {Ret X} if X > 0 then {Browse 5} else {Browse ~5} end endVýše uvedený příklad nevrací žádnou hodnotu, pouze zobrazuje 5 nebo -5 v rozhraní Oz v závislosti na znaménku X.
Když program narazí na nevázanou proměnnou, očekává hodnotu:
thread Z = X+Y % Va attendre jusqu'à ce que X et Y soient liés à une valeur {Browse Z} % Affiche la valeur de Z end thread X = 40 end thread Y = 2 endNení možné změnit hodnotu proměnné toku dat, jakmile je jednou přiřazena (jedno přiřazení)
X = 1 X = 2 % ErreurProměnné toku dat usnadňují vytváření souběžných agentů:
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 % Creation d'un agent qui génère un flux thread Y = {Sum 0 X} end % Création d'un agent qui traîte le flux {Browse Y} endVzhledem k tomu, jak fungují proměnné toku dat, je možné umístit vlákna kamkoli v programu a bude zaručeno, že si zachová stejný výsledek. Díky tomu je souběžné programování opravdu snadné. Vlákna jsou poměrně lehká: je možné provozovat tisíce vláken najednou
Tento příklad vypočítá tok prvočísel pomocí algoritmu postupného dělení vytvořením agentů, které 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 endOz používá přísné hodnocení, ale pokud možno i líné hodnocení :
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 % On a besoin de la valeur de X et Fact est calculée endLíné vyhodnocování poskytuje možnost ukládat téměř nekonečné datové struktury v Oz. Síla líného vyhodnocení je vidět na následujícím fragmentu 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ě vypočítá všechny běžné prvočísla v nekonečném seznamu. Reálná čísla se počítají, pouze pokud jsou použita.
Souběžný deklarativní model lze rozšířit odesláním zprávy pomocí jednoduché sémantiky:
declare local Stream Port in Port = {NewPort Stream} {Send Port 1} % Stream is now 1|_ ('_' indique une variable non liée) {Send Port 2} % Stream is now 1|2|_ ... {Send Port n} % Stream is now 1|2| .. |n|_ endProstřednictvím portu a vlákna může programátor definovat asynchronní agenty:
fun {NewAgent Init Fun} Msg Out in thread {FoldL Msg Fun Init Out} end {NewPort Msg} endStále je možné rozšířit deklarativní model o podporu stavového a objektově orientovaného programování s velmi jednoduchou sémantikou; vytvoříme novou proměnlivou strukturu, buňky (buňky).
local A X in A = {NewCell 0} A := 1 % Changes la valeur de A à 1 X = @A % @ Est utilisé pour accéder à la valeur de A endS touto velmi jednoduchou sémantikou může Oz podporovat celé objektově orientované paradigma. Trochu syntaktického cukru usnadňuje integraci OOP následujícím způsobem:
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