Uns | |
---|---|
Semantik | funktionell, procedurell, deklarativ, objektorienterad, begränsad beräkning, H-modeller, parallell beräkning |
Språkklass | programmeringsspråk , begränsningsprogrammeringsspråk [d] och programmeringsspråk med flera paradigm |
Utförandetyp | sammanställt |
Framträdde i | 1991 |
Författare | Gert Smolka och hans elever |
Släpp |
Oz 1.4.0 Mozart 2.0.1 (5 september 2018 ) |
Stora implementeringar | Mozart |
Blivit påverkad | Prolog |
påverkas | Alice |
Licens | MIT-licens |
Hemsida | mozart.github.io |
Oz är ett pedagogiskt programmeringsspråk på hög nivå som kombinerar funktionell , processuell och deklarativ semantik .
Utvecklingen av programmeringsspråket Oz startades 1991 av professor Gert Smolka med hans studenter från programmeringssystemlaboratoriet vid katolska universitetet i Louvain i Belgien. 1996 gick Seif Haridi och Peter Van Roy från Svenska Institutet för Datavetenskap med i utvecklingsprocessen och använde språket i sin klassiska lärobok Concepts, Techniques, and Models of Computer Programming [1] . Från 1999 till 2005 utvecklades språket under ledning av en internationell forskargrupp (Mozart Consortium), bestående av tre universitet: Saarlands universitet , Svenska Institutet för Informatik (Svenska Institutet för Datavetenskap) och katolska universitetet i Louvain .
Mozart är en högkvalitativ implementering av Oz-språket med öppen källkod och inkluderar en IDE baserad på Emacs editortillägg , en kompilator , en debugger , en profilerare och andra verktyg.
Ledningen av utvecklingen av programmeringssystemet Mozart 2005 överfördes till en utvecklingsgrupp (Mozart Board) för att attrahera ett bredare spektrum av forskare. Detta system släpptes av Mozart Consortium under en fri licens och portades (porterades) därefter till de flesta populära operativsystem , inklusive Unix , FreeBSD , Linux , Microsoft Windows och Mac OS X.
Oz-programmeringsspråket inkluderar de flesta av begreppen för populära programmeringsparadigm , inklusive logisk, funktionell (både lat och kraftfull datoranvändning), imperativ, objektorienterad, begränsningsprogrammering, distribuerad och parallell programmering. Å ena sidan har Oz en enkel formell semantik, och å andra sidan har en effektiv mjukvaruimplementering skapats för den.
De främsta fördelarna med detta språk inkluderar stöd för multiparadigmprogrammering, begränsningsprogrammering och distribuerad programmering. På nivån för språkkonstruktioner stöds således enkel och naturlig parallellisering och distribution av beräkningar över nätverket, vilket gör det enkelt att skapa feltoleranta applikationer. För att implementera begränsningsprogrammering i Oz-språket introduceras konceptet med beräkningsutrymmen, där en lösning söks. Detta gör det möjligt att lösa problem med matematisk programmering, och i synnerhet problem med diskret optimering.
Språkets kärna bildas av ett fåtal grundläggande datastrukturer, men kan utökas med vad som kallas syntaktisk socker .
Grundläggande datastrukturer:
Dessa värden är konstanta enheter av det första slaget (första klass), medan att skriva är dynamiskt.
Funktioner är entiteter av det första slaget , vilket gör att vi kan tillämpa det funktionella programmeringsparadigmet:
kul {Fakta N} % faktor om N =< 0 så är 1 annat N*{Fakta N-1} slut slutet kul {Comb NK} % antal kombinationer {Fakta N} div ({Fakta K} * {Fakta NK}) % heltal kan vara godtyckligt stora slutet fun {SumList List} % summa av listelement fall Lista på noll sedan 0 [] H|T sedan H+{SumList T} % mönstermatchning för lista slutet slutetOm programmet stöter på en obunden variabel, väntar det tills variabeln tilldelas ett värde:
tråd Z = X+Y % väntar tills variablerna X och Y får värden {Bläddra Z} % visar Z-värdet slutet gänga X = 40 ände tråd Y = 2 ändeDet är inte möjligt att ändra värdet på en strömvariabel som har ett värde kopplat till sig:
X=1 X = 2 % felTrådvariabler gör det enkelt att skapa agenter som körs i parallella trådar:
kul {Ints N Max} om N == Max då noll annan {Delay 1000} N|{Ints N+1 Max} slutet slutet kul {Sum S Stream} fall Ström av noll sedan S [] H|T sedan S|{Summa H+ST} slut slutet lokal XY in tråd X = {Ints 0 1000} slut tråd Y = {Summa 0 X} slut {Bläddra Y} slutetPå grund av hur strömvariabler fungerar kan du använda trådar var som helst i ditt program som garanterat ger samma resultat, vilket gör parallell programmering enkel. Samtidigt förbrukar trådar väldigt lite systemresurser: som i Erlang kan 100 000 trådar köras samtidigt [2] .
Detta exempel beräknar en ström av primtal med hjälp av sikten från Eratosthenes-algoritmen. För att göra detta, skapa rekursivt parallella strömmar som filtrerar bort sammansatta tal:
kul {Sieve Xs} fall Xs av noll sedan noll [] X|Xr sedan Ys in tråd Ys = {Filter Xr kul {$Y} Y mod X \= 0 slut} slut X|{Sive Ys} slutet slutetSom standard använder Oz den ivriga utvärderingsmodellen, men stöder också den så kallade lata utvärderingen:
rolig lat {Fakta N} om N =< 0 så är 1 annat N*{Fakta N-1} slut slutet lokal XY in X = {Fakta 100} Y = X + 1 % eftersom värdet på X krävs, det beräknas i detta ögonblick slutetDen deklarativa samtidighetsmodellen kan utökas med hjälp av meddelandeöverföringsmekanismen:
deklarera lokal Stream Port in Port = {NewPort Stream} {Send Port 1} % Stream är nu 1|_ ('_' indikerar en obunden och namnlös variabel) {Skicka port 2} % Stream är nu 1|2|_ ... {Skicka port n} % Stream är nu 1|2| .. |n|_ slutetSkapandet av asynkrona agenter implementeras med hjälp av trådar och portar:
kul {NewAgent Init Fun} Msg Ut in tråd {FoldL Msg Fun Init Out} slut {NewPort Msg} slutetDen deklarativa samtidighetsmodellen kan utvidgas för att stödja begreppet tillstånd och objektorienterad programmering; för att göra detta måste du skapa en celldatastruktur, vars värde kan ändras:
lokal AX in A = {NewCell 0} A := 1% ändrar värdet på A till 1 X = @A % @ används för att komma åt värdet på A slutetMed denna lilla förlängning av semantik kan du använda den fulla kraften av objektorienterad programmering:
klassräknare attr-val meth init(Value) val:=värde slutet meth bläddra {Bläddra @val} slutet meth inc(värde) val :=@val+värde slutet slutet lokal C in C = {New Counter init(0)} {C inc(6)} {C bläddra} slutetSkick:
FOT +BOL --- SPELET Där I=0 och alla olika bokstäver står för olika siffror.Lösning:
lokala fotres in proc {Fut C} F#U#T#B#O#L#G#R#A = C i 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} slutet {SearchAll Foot Res} {Bläddra Res} slutetkommer att visa alla lösningar för denna rebus i form av en tabell.
Programmeringsspråk | |
---|---|
|