Oz (limbaj de programare)

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 29 septembrie 2017; verificările necesită 5 modificări .
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 ) ( 05-09-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ă .

Istoricul dezvoltării

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.

Caracteristicile limbii

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ă.

Prezentare generală a limbii

Structuri de date

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ă:

'|'(2 '|'(4 '|'(6 '|'(8 zero)))) 2|(4|(6|(8|nil))) % zahăr sintactic 2|4|6|8|nil % este chiar mai scurt [2 4 6 8] % utilizarea eficientă a zahărului sintactic pentru a implementa sintaxa concisă

Aceste valori sunt entități constante de primul fel (prima clasă), în timp ce tastarea este dinamică.

Funcții

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şit

Variabile de fir și concurență declarativă

Dacă 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ăt

Nu 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şit

Datorită 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] .

Exemple de programe în Oz

Sita lui Eratosthenes

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şit

Evaluare leneșă

Implicit, 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şit

Trecerea mesajului

Modelul 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şit

Crearea 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şit

State și obiecte

Modelul 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şit

Cu 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şit

Un exemplu de program Oz care rezolvă un rebus

Condiț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şit

va arata toate solutiile acestui rebus sub forma unui tabel.

Vezi și

Note

  1. Concepte, tehnici și modele de programare pe computer . Consultat la 30 noiembrie 2010. Arhivat din original pe 26 august 2014.
  2. Mozart-oz.org Concurență (link nu este disponibil) . Data accesului: 30 noiembrie 2010. Arhivat din original pe 24 februarie 2015. 

Link -uri