Oz | |
---|---|
Semantik | funktionel, proceduremæssig, deklarativ, objektorienteret, begrænset computing, H-modeller, parallel computing |
Sprog klasse | programmeringssprog , constraint programmeringssprog [d] og multi-paradigme programmeringssprog |
Udførelsestype | kompileret |
Dukkede op i | 1991 |
Forfatter | Gert Smolka og hans elever |
Frigøre |
Oz 1.4.0 Mozart 2.0.1 (5. september 2018 ) |
Større implementeringer | Mozart |
Blev påvirket | Prolog |
påvirket | Alice |
Licens | MIT licens |
Internet side | mozart.github.io |
Oz er et uddannelsessprog på højt niveau , der kombinerer funktionel , proceduremæssig og deklarativ semantik .
Udviklingen af Oz-programmeringssproget blev startet i 1991 af professor Gert Smolka med sine studerende fra Programmeringssystemlaboratoriet ved det katolske universitet i Louvain i Belgien. I 1996 sluttede Seif Haridi og Peter Van Roy fra Swedish Institute of Computer Science sig til udviklingsprocessen og brugte sproget i deres klassiske lærebog Concepts, Techniques, and Models of Computer Programming [1] . Fra 1999 til 2005 blev sproget udviklet under vejledning af en international forskningsgruppe (Mozart Consortium), bestående af tre universiteter: Saarlands Universitet , Det Svenske Institut for Informatik (Svensk Institut for Datalogi) og det katolske universitet i Louvain .
En højkvalitets open source- implementering af Oz-sproget inkluderer Mozart en IDE baseret på Emacs editor - udvidelsen , en compiler , en debugger , en profiler og andre hjælpeprogrammer.
Ledelsen af udviklingen af Mozart-programmeringssystemet blev i 2005 overført til en udviklingsgruppe (Mozart Board) for at tiltrække en bredere vifte af forskere. Dette system blev frigivet af Mozart Consortium under en gratis licens og efterfølgende porteret (porteret) til de fleste populære operativsystemer , inklusive Unix , FreeBSD , Linux , Microsoft Windows og Mac OS X.
Oz-programmeringssproget inkluderer de fleste af begreberne i populære programmeringsparadigmer , herunder logisk, funktionel (både doven og energisk computing), imperativ, objektorienteret, begrænsningsprogrammering, distribueret og parallel programmering. På den ene side har Oz en simpel formel semantik, og på den anden side er der skabt en effektiv softwareimplementering til den.
De vigtigste fordele ved dette sprog inkluderer understøttelse af multi-paradigme programmering, constraint programmering og distribueret programmering. På niveau med sprogkonstruktioner understøttes således enkel og naturlig parallelisering og distribution af beregninger over netværket, hvilket gør det nemt at skabe fejltolerante applikationer. For at implementere begrænsningsprogrammering i Oz-sproget introduceres begrebet computational spaces, hvor der søges efter en løsning. Dette gør det muligt at løse problemer med matematisk programmering, og især problemer med diskret optimering.
Kernen i sproget er dannet af nogle få grundlæggende datastrukturer, men kan udvides med det, der er kendt som syntaktisk sukker .
Grundlæggende datastrukturer:
Disse værdier er konstante enheder af den første slags (første klasse), mens skrivning er dynamisk.
Funktioner er enheder af den første slags , som giver os mulighed for at anvende det funktionelle programmeringsparadigme:
sjov {Fakta N} % faktor hvis N =< 0, så 1 ellers N*{Faktum N-1} ende ende sjov {Comb NK} % antal kombinationer {Faktum N} div ({Fakta K} * {Faktum NK}) % heltal kan være vilkårligt store ende sjov {SumList List} % sum af listeelementer sag Liste over nul derefter 0 [] H|T derefter H+{SumList T} % mønstermatch for liste ende endeHvis programmet støder på en ubundet variabel, venter det, indtil variablen er tildelt en værdi:
tråd Z = X+Y % venter indtil variable X og Y får værdier {Gennemse Z} % viser Z-værdi ende gevind X = 40 ende tråd Y = 2 endeDet er ikke muligt at ændre værdien af en strømvariabel, der har en værdi tilknyttet:
X=1 X = 2 % fejlTrådvariabler gør det nemt at oprette agenter, der kører i parallelle tråde:
sjov {Ints N Max} hvis N == Max, så nul andet {Forsinkelse 1000} N|{Ints N+1 Max} ende ende sjov {Sum S Stream} tilfælde Strøm af nul derefter S [] H|T derefter S|{Sum H+ST} ende ende lokale XY i tråd X = {Ints 0 1000} ende tråd Y = {Sum 0 X} ende {Gennemse Y} endePå grund af den måde, streamvariabler fungerer på, kan du bruge tråde overalt i dit program, der garanteret vil returnere det samme resultat, hvilket gør parallel programmering let. Samtidig bruger tråde meget få systemressourcer: Som i Erlang kan 100.000 tråde køre samtidigt [2] .
Dette eksempel beregner en strøm af primtal ved hjælp af sigten af Eratosthenes-algoritmen. For at gøre dette skal du rekursivt oprette parallelle strømme, der filtrerer sammensatte tal fra:
sjovt {Sieve Xs} tilfælde Xs på nul og derefter nul [] X|Xr derefter Ys ind tråd Ys = {Filter Xr sjov {$Y} Y mod X \= 0 ende} ende X|{Sive Ys} ende endeSom standard bruger Oz den ivrige evalueringsmodel, men understøtter også den såkaldte dovne evaluering:
sjov doven {Fakta N} hvis N =< 0, så 1 ellers N*{Faktum N-1} ende ende lokale XY i X = {Fakta 100} Y = X + 1 %, da værdien af X er påkrævet, beregnes den på dette tidspunkt endeDen deklarative samtidighedsmodel kan udvides ved hjælp af meddelelsesoverførselsmekanismen:
erklære lokal Stream Port ind Port = {NewPort Stream} {Send Port 1} % Stream er nu 1|_ ('_' angiver en ubundet og unavngiven variabel) {Send Port 2} % Stream er nu 1|2|_ ... {Send Port n} % Stream er nu 1|2| .. |n|_ endeOprettelsen af asynkrone agenter implementeres ved hjælp af tråde og porte:
sjov {NewAgent Init Fun} Besked ud ind tråd {FoldL Msg Fun Init Out} ende {NewPort Msg} endeDen deklarative samtidighedsmodel kan udvides til at understøtte begrebet tilstands- og objektorienteret programmering; for at gøre dette skal du oprette en Cells-datastruktur, hvis værdi kan ændres:
lokale AX i A = {NewCell 0} A := 1 % ændrer værdien af A til 1 X = @A % @ bruges til at få adgang til værdien af A endeMed denne lille udvidelse af semantikken kan du bruge den fulde kraft af objektorienteret programmering:
klasse tæller attr-val meth init(værdi) val:=Værdi ende meth gennemse {Gennemse @val} ende meth inc(værdi) val :=@val+værdi ende ende lokale C in C = {Ny tæller init(0)} {C inc(6)} {C browse} endeTilstand:
FOD +BOL --- SPILLET Hvor I=0 og alle forskellige bogstaver står for forskellige tal.Løsning:
lokale fodres i 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} ende {SearchAll Foot Res} {Browse Res} endevil vise alle løsningerne af denne rebus i form af en tabel.
Programmeringssprog | |
---|---|
|