TDT4165: Programmeringsspråk
#1 Mini-mini-kompendium#2 SYNTAKS, SEMANTIKK (OG DSKL)
__## Syntaks__## Semantikk__## DSKL__## Abstrakt maskin for DSKL:__## Syntaktisk sukker__## Linguistisk abstraksjon__## Datastrukturer#2 DEKLARATIVITET
__## Deklarativitet:__## Observerbar deklarativitet:#2 FUNKSJONELL OG HØYERE-ORDENS PROGRAMMERING
__## Høyere-ordens programmering__## Prosedural abstraksjon__## Generisitet__## Instantiering__## Innebygging (embedding)__## Tillukning(closure)#2 MESSAGE-BASED CONCURRENCY
__## Porter:#2 LAT EVALUERING
__## Lat evaluering__## Ivrig (eager) evaluering
- basert på forelesninger, midtsemesterprøver og eksamensoppgaver
Syntaks omfatter tilatt 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.
Hvordan elementene i syntaksen skal tolkes ved programutførelse.
Forkortelse for Deklarativt Sekvensielt Kernel Language, kjernespråket.
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 er en mapping fra identifikatorer til variabler.
Single Assignement store: inneholder alle variabler som har blitt deklarert og verdiene deres (for bundne variabler).
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
-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:
1)catch ...
2) <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 kan ha 6 ulike egenskaper: Stateless, stateful, Secure, insecure (or open), bundled og 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.
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 vil alltid bindes på samme måte.
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.
Vil si å bruke funksjoner som første-klasses objekter/verdier.
Gir en gruppe av uttrykk et navn som kan bli brukt for å utføre dem.
Tar uttrykk ut av en prosedyre of bruker et argument for å kjøre vilkårlige argumenter i deres sted.
Å returnere en mer spesifikk prosedyre (en prosedyre med færre argumenter).
Å lagre en prosedyre i en datastruktur.
En tillukning er en prosedyreverdi som består av prosedyredefinisjoner og miljøet hvor den ble definert.
-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.
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.
Motstykket til lat evaluering.
_Eksempel fra 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 vise:
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.