TDT4165: Programmeringsspråk
Installasjon
Windows og Linux
Last ned og installer.
OS X
For å installere Oz på OS X, må du følge disse enkle steg.
Noob-versjon
- Gå til http://www.aquamacs.org/
- Last ned Aquamacs for
Mac OS X
- Gå til http://www.mozart-oz.org/download/view.cgi
- Velg
MacOS X Packages
- Installer begge pakkene
- Åpne Aquamacs for så å avslutte det igjen
- Åpne Mozart og du er klar til å programmere Oz!
Pro-versjon
- Gå til http://sourceforge.net/projects/mozart-oz/files/
- Velg versjon 1 eller 2 og last ned den nyeste dmgfilen.
- Installer denne pakken
- Gå til Terminalen din og legg til i
.bash_profile
dette:PATH="/Applications/Mozart.app/Contents/Resources/bin:$PATH"
- Bruk
Mozart2.app
i strengen over hvis du lastet ned versjon 2. - Lagre og skriv
source .bash_profile
i Terminalen - Du har nå en Oz-kompilator ved hjelp av funksjonen
ozc
. - Enkleste måten å jobbe på da er å bruke den editoren du foretrekker og så kjøre
ozc -c <filnavn>.oz && ozengine <filnavn>.osf
- Du har også en Oz-spesifikk emacs versjon som kan kjøres å kjøre
oz
. I dette programmet kompilerer du ved F10 O f. Hvis F10 eller fn+F10 ikke viser annen tekst, prøv fn+F10+cmd. Bytting av vinduer skjer ved ctrl+x o. Du kan lagre ved hjelp av ctrl+x s. Programmet avsluttes ved hjelp av ctrl-x ctrl-c.
Feilmeldinger
OS-error
Denne feilen er testet på Mac OS X. Noen ganger kan man være så uheldig å komme over en OS-error. Dette skjer ofte når man kjører et program som åpner tk.exe (du har altså brukt Browse i fortolkeren). Ikke avslutt tk.exe uten videre. Skulle du gjøre dette må du restarte hele programmet for å unngå denne feilen. En annen feil kan være at filen ligger i en mappe med æøå, unngå dette
Expression at Statement position
Denne feilen forekommer flere ganger. Stort sett er det fordi at du har flere if-setninger.
Bad:
if X then
X
end
if Y then
Y
end
X + Y
Good:
if X then
X
elseif Y then
Y
else
X + Y
end
Mini-mini-kompendium
Basert på forelesninger, midtsemesterprøver og eksamensoppgaver
Syntaks, semantikk (og DSKL)
Syntaks
Syntaks omfatter tillatt struktur i et språk, vanligvis ved bruk av grammatikk. Makrosyntaks omhandler hvordan en gruppe tokens kan settes sammen til et program. Mikrosyntaks omhandler hvordan tokens blir bygd opp.
Semantikk
Hvordan elementene i syntaksen skal tolkes ved programutførelse.
DSKL
Forkortelse for Deklarativt Sekvensielt Kernel Language, kjernespråket.
Abstrakt maskin for DSKL:
- Semantisk stakk
- En stakk av semantiske utrykk (statements). Det øverste elementet er det neste som skal utføres.
- Semantisk utrykk (statement)
- Består av et utrykk (statement) og et miljø (environment) E.
- Miljøet E
- En mapping fra identifikatorer til variabler.
- Single Assignement store
- inneholder alle variabler som har blitt deklarert og verdiene deres (for bundne variabler).
Syntaktisk sukker
Elementer i et programmeringsspråk som ikke har noen direkte funksjon/ikke tilføyer noe verdi til språket.
For DSKL: (eksempel fra eksamen 2010):
Tillate flere variabler å bli deklarert samtidig. Forklar syntaks og semantikk: endre fra
<statement> ::= local <id> in <statement> end
til
<statement> ::= local { <id> }+ in <statement> end
The semantics is easily explained by translating into the kernel language:
local X0 X1 ... XN in <statement> end
is translated to
local X0 in
local X1 in
...
local XN in
<statement>
end
...
end
end
Linguistisk abstraksjon
-for DSKL
Unntakshåndtering (exceptions) Unntak endrer beregningsmodellen til DSKL, for unntak kan ikke utrykkes ved grunnleggende DSKL.
hvordan utvide DSKL for å støtte unntak: syntaks:
<statement> ::= try <statement>1 catch <id>C then <statement>2 end
<statement> ::= raise <id>R end
Semantikk er forklart i henhold til den abstrakte maskinen: Ved semantiske utrykk med try og miljøet E, legg to semantiske utrykk på stakken:
- catch ...
- <statement>1.,
Begge med miljøet E. OBS! A semantic statement with catch ... is the same as the skip statement.
Ved semantiske utrykk med raise, pop det semantiske utrykk til catch... oppstår.
Datastrukturer
Datastrukturer kan ha 6 ulike egenskaper: - Stateless - Stateful - Secure - Insecure (or open) - Bundled - Unbundled
Eksempel (eksamen 2010):
Implementer en datastruktur som er stateful (, Secure og bundled).
declare
fun {Counter} C Increase Get in
{NewCell 0 C}
proc {Increase}
Old in
{Exchange C Old Old}
{Exchange C _ Old+1}
end
fun {Get}
Old in
{Exchange C Old Old}
Old
end
counter(increase:Increase get:Get)
end
Parametersending:
Med referanse | Betyr at funksjonen opererer på minneadressen til det faktiske parameteret. Det krever at parameteret er en variable med en minneadresse, og ikke en verdi som er lagret i argumentkall-listen. |
Med verdi | Det lages en kopi av det faktiske argumentet, slik at verdien nå eksisterer på to forskjellige minneadresser. Funksjonen og bruker kun den nylig tildelte adressen, det er kun den adressen funksjonen vet eksisterer. |
Deklarativitet
I følge læreboka er en deklarativ programenhet tilstandsløs, uavhengig og deterministisk.
Samtidige program (concurrent programs) kan være deklarative. Oz' dataflyt-variabler garanterer at variablene i en utførelse av programmet alltid vil bindes på samme måte.
Observerbar deklarativitet:
1) At de tilgjengelige delene av en programenhet (interface), kan ikke bli brukt til å avgjøre om enheten er deklarativ. 2) Alle enkle bruk av en programenhet under oppsyn vil alltid gi samme output uavhengig av input.
Funksjonell og høyere-ordens programmering
Høyere-ordens programmering
Vil si å bruke funksjoner som første-klasses objekter/verdier.
Prosedural abstraksjon
Gir en gruppe av uttrykk et navn som kan bli brukt for å utføre dem.
Generisitet
Tar uttrykk ut av en prosedyre of bruker et argument for å kjøre vilkårlige argumenter i deres sted.
Instantiering
Å returnere en mer spesifikk prosedyre (en prosedyre med færre argumenter).
Innebygging (embedding)
Å lagre en prosedyre i en datastruktur.
Tillukning(closure)
En tillukning er en prosedyreverdi som består av prosedyredefinisjoner og miljøet hvor den ble definert.
Message-based Concurrecny
Porter:
Sending til porter:
For å sende en verdi til en port, bruk {Send Port value}. Når du sender noe til en port, blir strømmen som er assosiert med porten utvidet med verdien som ble sendt. Porten blir oppdatert til å bruke den nye, ubundne enden av strømmen.
Utvidelse av DSKL for å støtte porter:
Multiset av semantiske stakker: Hver semantisk stakk representerer en tråd. Multiset vil erstatte den enkle semantiske stakken. Muterbar store: Inneholder alle par av tildelte porter og deres nåverende strøm-ende.
Lat evaluering
Verdien evalueres ikke før det faktisk trengs. Det betyr at verdien må bli spesifisert i henhold til noe som blir evalutert (f.eks en funksjon). Funksjonen må bli kalt for å beregne verdien første gang den trengs. Etter dette forblir verdien kjent.
Ivrig (eager) evaluering
Motstykket til lat evaluering.
Eksempel fra eksamen 2010:
Gi et kodeeksempel som illustrerer forskjellen mellom de to:
fun {Foo} {Show foo} 1 end
fun lazy {Bar} {Show bar} 2 end
fun {Baz} {Show baz} 3 end
fun {Calc A B C}
A + B + C
end
{Show {Calc {Foo} {Bar} {Baz}}}
Det vil printe ut:
foo
baz
bar
6
Som demonstrer at verdien fra Bar-kallet kun evalueres når det faktisk trengs i en beregning, og de to andre kallene blir evaluert før Calc blir kalt.
Oppslagsverk
Her er noen gode ressurser du kanskje vil få bruk for: - http://www.eecs.ucf.edu/~leavens/COP4020Spring12/running_oz.shtml - http://strasheela.sourceforge.net/strasheela/doc/Basics-1.html