Oz


mandag 12. desember 2011 Julekalender Polyglot Oz

Oz er et programmeringsspråk som skiller seg ut i mengden! Det er utviklet i et sammarbeid mellom flere universiteter, brukes først og fremst til undervisning, og støtter mange ulike programmeringsparadigmer som logisk programmering, funksjonell programmering, imperativ og objektorientert programmering osv. Det støtter samtidighetsbasert programmering blant annet gjennom bruk av actors, og er spesielt tilrettelagt for å lage distribuerte systemer.

oz

I bunn er Oz et meget enkelt språk med kun noen få datatyper. I tillegg har det en masse "syntaktisk sukker" som gjør språket praktisk. Det er først og fremst inspirert av Lisp, Prolog og Erlang, men har også skapt noe nytt og unikt.

Oz har derfor lenge fristet meg. Jeg har vurdert det som et språk hvor man kan teste ut og eksperimentere med alle mulige slags programmeringsmodeller.

På tide med litt kode

Nedenfor er et komplett Oz-program som skriver ut summen av alle tall fra 0 til 999 som er multipler av 3 eller 5. Det er ikke det korteste programmet jeg kunne ha skrevet, men illustrerer i stedet flere aspekter ved språket.

Oz har såvidt jeg vet ingen vanlige løkker. Det ble derfor naturlig å velge en funksjonell, stream-basert løsning.

I koden får du se hvordan man definerer funksjoner, inkludert en rekursiv funksjon som bygger opp en liste. Du får også se hvordan man bruker høyereordens-funksjoner, hvordan man sender en funksjon som et argument, og hvordan man deklarerer en funksjon in-line i et kallet til FoldL ("fold left", funksjonen som summerer opp alle tallene).

10 functor
11 import
12    Application
13    System
14 
15 define
16 
17    %% recursive function to create a new list
18    fun {Range From To}
19      if From == To then [From]
20      else From | {Range From+1 To} end
21    end
22 
23    %% function to get value to include in sum
24    fun {Euler1Value X}
25      if X mod 3 == 0 then X
26      elseif X mod 5 == 0 then X
27      else 0 end
28    end
29 
30    %% Variables bound in definition body
31    Values
32    Sum
33  in
34    Values = {Map {Range 0 999} Euler1Value}
35    Sum = {FoldL Values
36                 fun {$ X Y} X + Y end
37                 0}
38    {System.showInfo Sum}
39    {Application.exit 0}
40 end

Du har sett meg bruke map og fold så mange ganger nå at dette bør være helt greit å skjønne. Når du ser noe slikt som {Foo Bar Zot}, så er det et funksjonskall. Foo er funksjonen, og Bar og Zot er argumentene.

Min opplevelse av Oz

Da jeg begyte å studere Oz virket det svært fremmed og nesten uforståelig. Dokumentasjonen var frustrerende; den var skrevet for å lære meg språket grundig, ikke for at jeg raskt skulle kunne komme igang.

Etter hvert begynte jeg derimot å se paralellene til Erlang – spesielt hvordan Erlang håndterer lister. Og da jeg så arven fra Lisp i språket begynte brikkene å falle på plass.

Nå tror jeg det skal gå ganske greit å fortsette med Oz. Det er egentlig et ganske enkelt språk, men med avanserte muligheter.

Hvordan komme i gang

Hovedimplementasjonen av Oz kalles the Mozart Programming System. Det er open source, og tilgjengelig på Unix, Linux, FreeBSD, Windows og Mac OS X.

Jeg lastet det ned på Windows, men fikk det ikke til å virke helt som tiltenkt – GNU Emacs, som er en del av det interaktive miljøet, ville ikke kjøre. Jeg endte til slutt opp med å programmere online i ideone, et kjekt sted hvor man kan kompilere og kjøre programmer i et utall ulike språk.

Mozart-sidene har også den mest komplette dokumentasjonen for Oz. I tillegg finnes det en bok som heter Concepts, Techniques, and Models of Computer Programming. Dette er en lærebok i programmering som bruker Oz til å illustrere alle de ulike aspektene og paradigmene. Sikkert ikke en dum bok å ønske seg til Jul.


comments powered by Disqus