Oz | |
---|---|
Semantică | calcul funcțional, procedural, declarativ, orientat pe obiecte, constrâns, modele H, calcul paralel |
Clasa de limba | limbaj de programare , limbaj de programare cu constrângeri [d] și limbaj de programare cu mai multe paradigme |
Tipul de execuție | compilate |
Aparut in | 1991 |
Autor | Gert Smolka și studenții săi |
Eliberare |
Oz 1.4.0 Mozart 2.0.1 (5 septembrie 2018 ) |
Implementări majore | Mozart |
A fost influențat | Prolog |
influențat | Alice |
Licență | Licență MIT |
Site-ul web | mozart.github.io |
Oz este un limbaj de programare educațional de nivel înalt care combină semantica funcțională , procedurală și declarativă .
Dezvoltarea limbajului de programare Oz a fost începută în 1991 de profesorul Gert Smolka împreună cu studenții săi de la Laboratorul de sisteme de programare al Universității Catolice din Louvain din Belgia. În 1996, Seif Haridi și Peter Van Roy de la Institutul Suedez de Științe Calculatoare s-au alăturat procesului de dezvoltare și au folosit limbajul în manualul lor clasic Concepte, tehnici și modele de programare computerizată [1] . Din 1999 până în 2005, limba a fost dezvoltată sub îndrumarea unui grup internațional de cercetare (Consorțiul Mozart), format din trei universități: Universitatea Saarland , Institutul Suedez de Informatică (Institutul Suedez de Informatică) și Universitatea Catolică din Louvain .
O implementare open source de înaltă calitate a limbajului Oz, Mozart include un IDE bazat pe extensia editorului Emacs , un compilator , un depanator , un profiler și alte utilitare.
Managementul dezvoltării sistemului de programare Mozart în 2005 a fost transferat unui grup de dezvoltare (Consiliul Mozart) pentru a atrage o gamă mai largă de cercetători. Acest sistem a fost lansat de Consorțiul Mozart sub o licență gratuită și ulterior portat (portat) pe cele mai populare sisteme de operare , inclusiv Unix , FreeBSD , Linux , Microsoft Windows și Mac OS X.
Limbajul de programare Oz include cele mai multe dintre conceptele paradigmelor de programare populare , inclusiv logic, funcțional (atât calcul leneș , cât și viguros), imperativ, orientat pe obiecte, programare cu constrângeri, programare distribuită și paralelă. Pe de o parte, Oz are o semantică formală simplă, iar pe de altă parte, a fost creată o implementare software eficientă.
Principalele avantaje ale acestui limbaj includ suportul pentru programarea multi-paradigma, programarea cu constrângeri și programarea distribuită. Astfel, la nivelul constructelor de limbaj, este suportată paralelizarea și distribuția simplă și naturală a calculelor în rețea, ceea ce facilitează crearea de aplicații tolerante la erori. Pentru a implementa programarea cu constrângeri în limbajul Oz, este introdus conceptul de spații de calcul, în care se caută o soluție. Aceasta permite rezolvarea problemelor de programare matematică și, în special, a problemelor de optimizare discretă.
Miezul limbajului este format din câteva structuri de date de bază, dar poate fi extins cu ceea ce este cunoscut sub numele de zahăr sintactic .
Structuri de date de bază:
Aceste valori sunt entități constante de primul fel (prima clasă), în timp ce tastarea este dinamică.
Funcțiile sunt entități de primul fel , ceea ce ne permite să aplicăm paradigma de programare funcțională:
distracție {Fact N} % factorial dacă N =< 0 atunci 1 altfel N*{Fact N-1} sfârşit Sfârşit distracție {Comb NK} % numărul de combinații {Fact N} div ({Fact K} * {Fact NK}) % numere întregi pot fi arbitrar mari Sfârşit distractiv {SumList List} % suma elementelor listei case Lista de zero apoi 0 [] H|T apoi H+{SumList T} % potrivire de model pentru listă Sfârşit SfârşitDacă programul întâlnește o variabilă nelegată, așteaptă până când variabilei i se atribuie o valoare:
fir Z = X+Y % așteaptă până când variabilele X și Y primesc valori {Browse Z} % afișează valoarea Z Sfârşit fir X = 40 capăt fir Y = 2 capătNu este posibilă modificarea valorii unei variabile de flux care are o valoare asociată cu aceasta:
X=1 X = eroare de 2%.Variabilele thread-ului facilitează crearea de agenți care rulează în fire paralele:
distracție {Ints N Max} dacă N == Max atunci nul altfel {Întârziere 1000} N|{Int N+1 Max} Sfârşit Sfârşit distractiv {Sum S Stream} caz Flux de zero apoi S [] H|T apoi S|{Suma H+ST} sfârşit Sfârşit local XY în fir X = {Ints 0 1000} sfârşit fir Y = {Suma 0 X} sfârşit {Răsfoiește Y} SfârşitDatorită modului în care funcționează variabilele de flux, puteți utiliza fire de execuție oriunde în programul dvs., care sunt garantate să returneze același rezultat, facilitând programarea paralelă. În același timp, firele de execuție consumă foarte puține resurse de sistem: ca și în Erlang, 100.000 de fire de execuție pot rula simultan [2] .
Acest exemplu calculează un flux de numere prime folosind algoritmul sită a lui Eratosthenes. Pentru a face acest lucru, creați recursiv fluxuri paralele care filtrează numerele compuse:
distractiv {Sieve Xs} cazul X de zero, apoi zero [] X|Xr apoi Ys in fir Ys = {Filtru Xr distracție {$Y} Y mod X \= 0 final} final X|{Sie Ys} Sfârşit SfârşitImplicit, Oz folosește modelul de evaluare dornic, dar suportă și așa-numita evaluare leneșă:
distracție leneș {Fact N} dacă N =< 0 atunci 1 altfel N*{Fact N-1} sfârşit Sfârşit local XY în X = {Fapt 100} Y = X + 1% deoarece valoarea lui X este necesară, se calculează în acest moment SfârşitModelul declarativ de concurență poate fi extins folosind mecanismul de transmitere a mesajelor:
declara portul de flux local în Port = {NewPort Stream} {Send Port 1} % Stream este acum 1|_ („_” indică o variabilă nelegată și fără nume) {Send Port 2} % Stream este acum 1|2|_ ... {Send Port n} % Stream este acum 1|2| .. |n|_ SfârşitCrearea agenților asincroni este implementată folosind fire și porturi:
distracție {NewAgent Init Fun} Msg Out in firul {FoldL Msg Fun Init Out} se încheie {NewPort Msg} SfârşitModelul declarativ de concurență poate fi extins pentru a susține conceptul de programare de stat și orientată pe obiecte; pentru a face acest lucru, trebuie să creați o structură de date Cells, a cărei valoare poate fi modificată:
local AX in A = {NewCell 0} A := 1% schimbă valoarea lui A la 1 X = @A % @ este folosit pentru a accesa valoarea lui A SfârşitCu această ușoară extensie a semanticii, puteți folosi întreaga putere a programării orientate pe obiecte:
Contor de clasă attr-val meth init(Valoare) val:=valoare Sfârşit Răsfoiește metanfetamina {Răsfoiți @val} Sfârşit meth inc(Valoare) val :=@val+Valoare Sfârşit Sfârşit local C in C = {New Counter init(0)} {C inc(6)} {C răsfoire} SfârşitCondiție:
PICIOR +BOL --- JOCUL Unde I=0 și toate literele diferite reprezintă numere diferite.Soluţie:
local Foot Res in proc {Fut C} F#U#T#B#O#L#G#R#A = C în C ::: 0#9 {FD.distinct C} F \=: 0 B =: 0 100*F+10*U+T+100*B+10*O+L=: 100*G+10*R+A {FD.distribute ff C} Sfârşit {SearchAll Foot Res} {Browse Res} Sfârşitva arata toate solutiile acestui rebus sub forma unui tabel.
Limbaje de programare | |
---|---|
|