Deel I: Functionele Programmeertalen Hoofdstuk 5: Implementatie- technieken
Voorstelling abstract concreet Constante N25 Operator B+ + Veranderlijke Vv f x Abstractie v M f x v M Constructor : x y :
Syntaxisboom + x *x ( x.x*x)(5+5)
Ingeblikte voorstelling
Oningeblikte voorstelling
Lazy uitvoering qTwee voorwaarden 4Argumenten van functies worden slechts geëvalueerd op het ogenblik dat men de waarde werkelijk nodig heeft (soms ook call by need genoemd) 4Argumenten van functies mogen ten hoogste eenmaal geëvalueerd worden
Lazy uitvoering qStrikte talen: ML en Hope qLazy talen: SASL, KRC, LML, Miranda, Orwell, Ponder, Haskell en Hugs
Zwakke hoofdnormaalvorm is, met F een veranderlijke, een gegevensobject, een ingebouwde functie, ofwel een -abstractie en zodanig dat FE 1 … E m geen -redex is voor m n Een -expressie is in zwakke hoofdnormaalvorm als en slechts als ze van de vorm
Zwakke hoofdnormaalvorm qGegevensobject: constante of constructor qGevolg: ZHN : geen kopredices Voorbeelden: v, 19, 3, y. x 3
Overzicht -expressie reductie van kopredices normale reductieorde zwakke hoofdnormaalvorm normaalvorm
Voorbeeld
Voorbeeld: normale reductievolgorde
Voorbeeld: reductie van kopredices
M3M3
Vier gevallen M is een gegevensobject (constante, CONS-cel, enz) n 0: ZHN n 0: fatale fout M is een ingebouwde functie met k argumenten k n : ZHN k n : kopredex MM 1 … M k
Vier gevallen M is een -abstractie n 0: kopredex MM 1 n 0: ZHN M is een veranderlijke n 0: ZHN n 0: fatale fout
Ruggengraadstapel
M3M3...
Reductie qArgumenten niet substitueren, maar verwijzingen gebruiken qApplicatieknopen worden vervangen door hun waarde
Graafreductie + x *x ( x.x*x)(5+5)
Graafreductie + x *x *
x *x *
Graafreductie x *
Het overschrijven van de redex
@ x ( x.x)(fa) @ fa
De SECD-machine qS: de evaluatiestapel, gebruikt om de tijdelijke resultaten van het evaluatieproces bij te houden qE: de omgeving die de waarden van de veranderlijken bijhoudt qC: controlestapel met de continuaties qD: de dump die gebruikt wordt om gegevens te bewaren tijdens de oproep van een andere functie De virtuele machine met vier stapels,
qeen graaf qG-programma qexpressiestapel qeen controlestapel De G-machine Vier gegevensstructuren
Voorbeeld PUSH 1 ; dupliceer f MKAP ; maak f x PUSH 1 ; dupliceer f MKAP ; maak f (f x) SLIDE 1 ; gooi argument f weg
Voorbeeld f x f fx f f(fx)
68030 Code move.l (4,a6),-(a6) ; dupliceer f move.l (4,a6),-(a5) ; x move.l (a6)+,-(a5) ; f move.l AP,-(a5) ; typekenteken move.l a5,(a6) ; overschrijf "x" move.l (4,a6),-(a6) ; dupliceer f move.l (4,a6),-(a5) ; f x move.l (a6)+,-(a5) ; f move.l AP,-(a5) ; typekenteken move.l a5,(a6) ; overschrijf "f x" move.l (a6)+,(a6) ; overschrijf "f"
Voorbeeld
Optimale code move.l (a6)+,-(a5) ; x, en gooi "x" weg move.l (a6),-(a5) ; f move.l AP,-(a5) ; typekenteken move.l a5,-(a5) ; f x move.l (a6),-(a5) ; f move.l AP,-(a5) ; typekenteken move.l a5,(a6) ; overschrijf "f” ; met "f (f x)"
Compilatieschema GLOBSTART naam, n... UPDATE n+1 POP n UNWIND
Stapelorganisatie
Compilatie Getallen PUSHINT getal Combinatoren en ingebouwde functies PUSHGLOBAL naam Veranderlijken PUSH verschuiving Applicaties MN (Applicatieknoop) Code voor N Code voor M MKAP
Voorbeeld GLOBSTART kwadraat, 1 PUSH 0 ; push x PUSH 1 ; push x PUSHGLOBAL * ; push * MKAP ; maak * x MKAP ; maak (* x) x UPDATE 2 ; overschrijf redex POP 1 ; gooi "x" weg UNWIND ; zoek volgende redex
Voorbeeld GLOBSTART prog, 0 PUSHINT 5 PUSHGLOBAL + MKAP ; + 5 MKAP ; (+ 5) 5 PUSHGLOBAL kwadraat MKAP ; kwadraat ((+ 5) 5) UPDATE 1 ; overschrijf redex UNWIND ; zoek volgende redex
Voorbeeld BEGIN ; initialiseer PUSHGLOBAL prog ; vast beginpunt EVAL ; start de uitvoering PRINT ; print resultaat ; van stapel END ; einde van het programma
Code: detail GLOBSTART kwadraat, 1 PUSH 0 ; push x PUSH 1 ; push x PUSHGLOBAL * ; push * MKAP ; maak * x MKAP ; maak * x x UPDATE 2 ; overschrijf redex POP 1 ; gooi "x" weg UNWIND ; zoek volgende redex
Code: detail GLOBSTART *, 2 PUSH 1 ; push y EVAL ; reduceer naar ZHNV PUSH 1 ; push x EVAL ; reduceer naar ZHNV MULTIPLY ; voer de vermenig- ; vuldiging uit UPDATE 3 ; overschrijf redex POP 2 ; gooi de argumenten weg RETURN ; zoek volgende redex
Uitvoering van EVAL
Optimalisatie 1: combinatorsubstitutie GLOBSTART kwadraat, 1 PUSH 0 ; push x EVAL PUSH 1 ; push x EVAL MULTIPLY ; voer de vermenig- ; vuldiging uit UPDATE 2 ; overschrijf redex POP 1 ; gooi "x" weg UNWIND ; zoek volgende redex
Optimalisatie 2: resultaatrecuperatie GLOBSTART kwadraat, 1 PUSH 0 ; push x EVAL PUSH 0 ; push de waarde van x MULTIPLY ; voer de vermenig- ; vuldiging uit UPDATE 2 ; overschrijf redex POP 1 ; gooi "x" weg RETURN ; herstel dump
Optimalisatie 3: geheugenrecuperatie GLOBSTART kwadraat, 1 EVAL PUSH 0 ; push de waarde van x MULTIPLY ; voer de vermenig- ; vuldiging uit UPDATE 1 ; overschrijf redex RETURN ; herstel dump
Optimalisatie 4: combinatorsubstitutie GLOBSTART prog, 0 PUSHINT 5 ADD PUSHGLOBAL kwadraat MKAP ; kwadraat (+ 5 5) UPDATE 1 ; overschrijf redex UNWIND ; zoek volgende redex
Optimalisatie 5: constante expressies GLOBSTART prog, 0 PUSHINT 10 PUSHGLOBAL kwadraat MKAP ; kwadraat 10 UPDATE 1 ; overschrijf redex UNWIND ; zoek volgende redex
Optimalisatie 6: striktheid GLOBSTART kwadraat, 1 PUSH 0 ; push de waarde van x MULTIPLY ; voer de vermenig- ; vuldiging uit UPDATE 1 ; overschrijf redex RETURN ; herstel dump GLOBSTART prog, 0 PUSHINT 10 PUSHGLOBAL kwadraat MKAP ; kwadraat 10 UPDATE 1 ; overschrijf redex UNWIND ; zoek volgende redex
Staartrecursie GLOBSTART F,2..code voor E3..code voor E2..code voor E1 PUSHGLOBAL W MKAP UPDATE 3 POP 2 UNWIND
Staartrecursie: stapelbeeld
Voorbeeld GLOBSTART FAC,2 PUSH 0 ; n EVAL ; waarde van n PUSHINT 0 ; nul EQUAL ; gelijk ? JTRUE POSITIEF ; indien n>0 PUSH 1 ; a EVAL ; evalueer UPDATE 3 ; overschrijf redex van fac POP 2 ; argumenten van fac weg RETURN ; reeds in ZHN vorm dank ; zij eval
LABEL POSITIEF PUSH 1 ; a PUSH 1 ; n MULTIPLY ; n*a PUSH 1 ; n PUSHINT 1 ; 1 MINUS ; n-1 PUSHGLOBAL FAC ; fac (n-1) (n*a) SQUEEZE 3 2 ; overschrijf originele ; argumenten DISPATCH 2 ; staartrecursie Voorbeeld
Prestatienadelen van lazyness De uitdrukking zal herleid worden tot telop 1 (telop 2 (telop 3 [0])) [ ]
Oplossing: accumulator + striktheid