Oz (jazyk)

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 .

Jazykové funkce

Datové struktury

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:

'|'(2 '|'(4 '|'(6 '|'(8 nil)))) % Comme un enregistrement 2|(4|(6|(8|nil))) % Avec un peu de sucre syntaxique 2|4|6|8|nil % Avec plus de sucre syntaxique [2 4 6 8] % Et avec encore plus

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

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 end

Funkce 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í funkce

Stejně 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.

Postupy

Funkce 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 end

Ale 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 end

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

Proměnná toku dat a deklarativní souběžnost

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 end

Není možné změnit hodnotu proměnné toku dat, jakmile je jednou přiřazena (jedno přiřazení)

X = 1 X = 2 % Erreur

Promě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} end

Vzhledem 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

Příklad: Postupné dělení

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 end

Lenost

Oz 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 end

Lí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.

Soutěž zasíláním zpráv

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|_ end

Prostř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} end

Stav a objekty

Stá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 end

S 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

Poznámky a odkazy

  1. https://mozart.github.io/mozart-v1/doc-1.4.0/tutorial/node3.html#label18
  2. Leif Grönqvist, „Funkce vyšších řádů“ , Pokročilé funkční programování v Oz ( číst online )
  3. Robert Gentleman a Ross Ihaka, Lexical Scope in Statistical Computing“, v Journal of Computational and Graphical Statistics , sv.  9, Září 2000( číst online ) , kap.  3, Systémy a jazyky, s.  491–508
  4. https://mozart.github.io/mozart-v1/doc-1.4.0/tutorial/node5.html#control.procedure
  5. http://www.mozart-oz.org/documentation/tutorial/node8.html#chapter.concurrency
  6. Paul Hudak , „Design, evoluce a aplikace funkčních programovacích jazyků“ , v ACM Computing Surveys (CSUR) , sv.  21, s.  359–411
  7. Rao, AC a Varada Raju, D, „Aplikace techniky Hammingova čísla k detekci izomorfismu mezi kinematickými řetězci a inverzemi“ , v Mechanism and Machine theory , sv.  26, 1991, str.  55–75

externí odkazy