Oz (programovací jazyk)

Technology
12 hours ago
8
4
2
Avatar
Author
Albert Flores

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. +more 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. +more Mozart byl portován na Unix, FreeBSD, Linux, Windows a macOS.

Vlastnosti jazyka

Oz 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. +more 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 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í. +more 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, rádius atd. +more 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ů, které vždy začínají malým písmenem.

Funkce

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

fun {Fact N} if N = 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.

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

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ů. +more 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. 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 % 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é. +more Vlákna jsou velmi úsporná: je možné mít spuštěných 100 000 vláken najednou.

Příklad: Zkušební dělicí 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 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í

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 =

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 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 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} % 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| . +more |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

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í

Rychlost provádění programu vytvořeného překladačem Mozart (verze 1. 4. +more0 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.

Související články

Alice (programovací jazyk) současný funkční omezující jazyk ze Sárské univerzity * Data Flow Diagram * Funkcionální a logické programování ** Prolog (programovací jazyk) objektově orientovaný, funkční, logický jazyk ** Mercury (programovací jazyk)

Reference

Peter Van Roy and Seif Haridi (2004). Koncepty, techniky a modely počítačového programování. MIT Press. [url=http://www.info.ucl.ac.be/~pvr/book.html]Dostupné online[/url]. (anglicky)

Externí odkazy

Oficiální webové stránky Mozart [url=http://mozart2. org/]Dostupné online[/url] (anglicky) * Výukový program pro Oz [url=https://mozart. +moregithub. io/mozart-v1/doc-1. 4. 0/tutorial/index. html]Dostupné online[/url] (anglicky) * Výzkum programovacích jazyků na Katolické univerzitě v Lovani [url=http://www. info. ucl. ac. be/people/PVR/distribution. html]Dostupné online[/url]: Hlavní skupina vývojářů Mozarta/Oze (anglicky) * Programování v Oz [url=http://people. cis. ksu. edu/~xou/505f10/slides/oz. pdf]Dostupné online[/url] (anglicky) * Základy Oze [url=http://strasheela. sourceforge. net/strasheela/doc/01-Basics. html]Dostupné online[/url] (anglicky).

Kategorie:Multiparadigmatické jazyky Kategorie:Funkcionální programování Kategorie:Logické programování Kategorie:Dynamické programovací jazyky Kategorie:Programovací jazyky

5 min read
Share this post:
Like it 8

Leave a Comment

Please, enter your name.
Please, provide a valid email address.
Please, enter your comment.
Enjoy this post? Join Cesko.wiki
Don’t forget to share it
Top