53
Deel I: Functionele Deel I: Functionele Programmeertalen Programmeertalen Hoofdstuk 5: Implementatie- technieken

Deel I: Functionele Programmeertalen

  • Upload
    etta

  • View
    55

  • Download
    6

Embed Size (px)

DESCRIPTION

Deel I: Functionele Programmeertalen. Hoofdstuk 5: Implementatie-technieken. @. @. Applicatie. f x. f x. . . Abstractie. v M. v M. :. Constructor. :. x y. x y. Constante. N. 25. 25. Operator. B. +. +. Veranderlijke. V. v. v. - PowerPoint PPT Presentation

Citation preview

Page 1: Deel I: Functionele Programmeertalen

Deel I: FunctioneleDeel I: FunctioneleProgrammeertalenProgrammeertalen

Hoofdstuk 5:Implementatie-

technieken

Page 2: Deel I: Functionele Programmeertalen

Voorstelling abstract concreet

Constante N 2525Operator B ++Veranderlijke V vv

Applicatie @@

f x

Abstractie

v M

f x

v M

Constructor :x y

:

x y

Page 3: Deel I: Functionele Programmeertalen

Syntaxisboom@

@

5@

+ 5

x @

@ x

* x

(x.x*x)(5+5)

Page 4: Deel I: Functionele Programmeertalen

Ingeblikte voorstelling

Page 5: Deel I: Functionele Programmeertalen

Oningeblikte voorstelling

Page 6: Deel I: Functionele Programmeertalen

Lazy uitvoering

Twee voorwaarden Argumenten van functies worden

slechts geëvalueerd op het ogenblik dat men de waarde werkelijk nodig heeft (soms ook call by need genoemd)

Argumenten van functies mogen ten hoogste eenmaal geëvalueerd worden

Page 7: Deel I: Functionele Programmeertalen

Lazy uitvoering

Strikte talen: ML en Hope

Lazy talen: SASL, KRC, LML, Miranda, Orwell, Ponder, Haskell en Hugs

Page 8: Deel I: Functionele Programmeertalen

Zwakke hoofdnormaalvorm

0 ,1 nEFE n

is, met F een veranderlijke, een gegevensobject, een ingebouwde functie, ofwel een -abstractie en zodanig dat FE1…Em geen -redex is voor m n

Een -expressie is in zwakke hoofdnormaalvorm als en slechts als ze van de vorm

Page 9: Deel I: Functionele Programmeertalen

Zwakke hoofdnormaalvorm

Gegevensobject: constante of constructor

Gevolg: ZHN: geen kopredices

Voorbeelden: v, 19, 3, y.x 3

Page 10: Deel I: Functionele Programmeertalen

Overzicht

-expressiereductie van kopredices

normale reductieordezwakke hoofdnormaalvorm

normaalvorm

Page 11: Deel I: Functionele Programmeertalen

Voorbeeld

])6,5,4[ ]3,2,1[ som( hdprog som:)():( ):( som

] [] [ ] [ som21212211

llaalala

Page 12: Deel I: Functionele Programmeertalen

Voorbeeld: normale reductievolgorde

5])))) [:9(:7(:5( hd])))) [ ] [ som(:9(:7(:5( hd

])))) [ ] [ som(:)63((:7(:5( hd])))6[ ]3[ som(:7(:5( hd

])))6[ ]3[ som(:)52((:5( hd]))6,5[ ]3,2[ som(:5( hd

]))6,5[ ]3,2[ som(:)41(( hd])6,5,4[ ]3,2,1[ som( hdprog

Page 13: Deel I: Functionele Programmeertalen

Voorbeeld: reductie van kopredices

541

]))6,5[ ]3,2[ som(:)41(( hd])6,5,4[ ]3,2,1[ som( hdprog

Page 14: Deel I: Functionele Programmeertalen

Kopredices@

Mn

@

M M1

@

M2

@

M3

Page 15: Deel I: Functionele Programmeertalen

Vier gevallen

M is een gegevensobject (constante, CONS-cel, enz)n 0: ZHNn 0: fatale fout

M is een ingebouwde functie met k argumentenk n: ZHNk n: kopredex MM1… Mk

Page 16: Deel I: Functionele Programmeertalen

Vier gevallen

M is een -abstractien 0: kopredex MM1

n 0: ZHNM is een veranderlijken 0: ZHNn 0: fatale fout

Page 17: Deel I: Functionele Programmeertalen

Ruggengraadstapel

Page 18: Deel I: Functionele Programmeertalen

Kopredices@

Mn

@

M M1

@

M2

@

M3

...

Page 19: Deel I: Functionele Programmeertalen

Reductie

Argumenten niet substitueren, maar verwijzingen gebruiken

Applicatieknopen worden vervangen door hun waarde

Page 20: Deel I: Functionele Programmeertalen

Graafreductie@

@

5@

+ 5

x @

@ x

* x

(x.x*x)(5+5)

Page 21: Deel I: Functionele Programmeertalen

Graafreductie@

@

5@

+ 5

x @

@ x

* x

(5+5)*(5+5)

@

*

Page 22: Deel I: Functionele Programmeertalen

Graafreductie@

10

5@

+ 5

x @

@ x

* x

10*10

@

*

Page 23: Deel I: Functionele Programmeertalen

Graafreductie100

10

5@

+ 5

x @

@ x

* x

@

*

Page 24: Deel I: Functionele Programmeertalen

Het overschrijven van de redex

Page 25: Deel I: Functionele Programmeertalen

Het overschrijven van de redex@

x

(x.x)(fa)

x

@

f a

@

f a

@@

f a

Page 26: Deel I: Functionele Programmeertalen

De SECD-machine

S: de evaluatiestapel, gebruikt om de tijdelijke resultaten van het evaluatieproces bij te houden

E: de omgeving die de waarden van de veranderlijken bijhoudt

C: controlestapel met de continuatiesD: de dump die gebruikt wordt om

gegevens te bewaren tijdens de oproep van een andere functie

De virtuele machine met vier stapels,

Page 27: Deel I: Functionele Programmeertalen

een graaf

G-programma

expressiestapel

een controlestapel

De G-machineVier gegevensstructuren

Page 28: Deel I: Functionele Programmeertalen

Voorbeeld

2))(.( fxfxf

PUSH 1 ; dupliceer fMKAP ; maak f xPUSH 1 ; dupliceer fMKAP ; maak f (f x)SLIDE 1 ; gooi argument f weg

Page 29: Deel I: Functionele Programmeertalen

Voorbeeld

fxffxf

f(fx)f(fx)

Page 30: Deel I: Functionele Programmeertalen

68030 Codemove.l (4,a6),-(a6) ; dupliceer f move.l (4,a6),-(a5) ; xmove.l (a6)+,-(a5) ; fmove.l AP,-(a5) ; typekentekenmove.l a5,(a6) ; overschrijf "x" move.l (4,a6),-(a6) ; dupliceer f

move.l (4,a6),-(a5) ; f xmove.l (a6)+,-(a5) ; fmove.l AP,-(a5) ; typekentekenmove.l a5,(a6) ; overschrijf "f x"

move.l (a6)+,(a6) ; overschrijf "f"

Page 31: Deel I: Functionele Programmeertalen

Voorbeeld

Page 32: Deel I: Functionele Programmeertalen

Optimale code

move.l (a6)+,-(a5) ; x, en gooi "x" wegmove.l (a6),-(a5) ; fmove.l AP,-(a5) ; typekentekenmove.l a5,-(a5) ; f xmove.l (a6),-(a5) ; fmove.l AP,-(a5) ; typekentekenmove.l a5,(a6) ; overschrijf "f” ; met "f (f x)"

Page 33: Deel I: Functionele Programmeertalen

Compilatieschema

Mxx n 1naam

GLOBSTART naam, n...UPDATE n+1POP nUNWIND

Page 34: Deel I: Functionele Programmeertalen

Stapelorganisatie

Page 35: Deel I: Functionele Programmeertalen

CompilatieGetallen PUSHINT getalCombinatoren en ingebouwde functies

PUSHGLOBAL naamVeranderlijken PUSH verschuivingApplicaties MN (Applicatieknoop)

Code voor NCode voor MMKAP

Page 36: Deel I: Functionele Programmeertalen

Voorbeeld

)55( kwadraatprogkwadraat

xxx

GLOBSTART kwadraat, 1PUSH 0 ; push xPUSH 1 ; push xPUSHGLOBAL * ; push *MKAP ; maak * xMKAP ; maak (* x) xUPDATE 2 ; overschrijf redexPOP 1 ; gooi "x" wegUNWIND ; zoek volgende redex

Page 37: Deel I: Functionele Programmeertalen

Voorbeeld

GLOBSTART prog, 0 PUSHINT 5 PUSHINT 5 PUSHGLOBAL +MKAP ; + 5MKAP ; (+ 5) 5 PUSHGLOBAL kwadraat MKAP ; kwadraat ((+ 5) 5)UPDATE 1 ; overschrijf redexUNWIND ; zoek volgende redex

Page 38: Deel I: Functionele Programmeertalen

Voorbeeld

BEGIN ; initialiseerPUSHGLOBAL prog ; vast beginpuntEVAL ; start de uitvoeringPRINT ; print resultaat ; van stapelEND ; einde van het programma

Page 39: Deel I: Functionele Programmeertalen

Code: detail

GLOBSTART kwadraat, 1PUSH 0 ; push xPUSH 1 ; push xPUSHGLOBAL * ; push *MKAP ; maak * xMKAP ; maak * x xUPDATE 2 ; overschrijf redexPOP 1 ; gooi "x" wegUNWIND ; zoek volgende redex

Page 40: Deel I: Functionele Programmeertalen

Code: detail

GLOBSTART *, 2PUSH 1 ; push yEVAL ; reduceer naar ZHNVPUSH 1 ; push xEVAL ; reduceer naar ZHNVMULTIPLY ; voer de vermenig- ; vuldiging uitUPDATE 3 ; overschrijf redexPOP 2 ; gooi de argumenten wegRETURN ; zoek volgende redex

Page 41: Deel I: Functionele Programmeertalen

Uitv

oerin

g va

n EVAL

Page 42: Deel I: Functionele Programmeertalen

Optimalisatie 1: combinatorsubstitutie

GLOBSTART kwadraat, 1PUSH 0 ; push xEVALPUSH 1 ; push xEVALMULTIPLY ; voer de vermenig- ; vuldiging uitUPDATE 2 ; overschrijf redexPOP 1 ; gooi "x" wegUNWIND ; zoek volgende redex

Page 43: Deel I: Functionele Programmeertalen

Optimalisatie 2: resultaatrecuperatie

GLOBSTART kwadraat, 1PUSH 0 ; push xEVALPUSH 0 ; push de waarde van xMULTIPLY ; voer de vermenig- ; vuldiging uitUPDATE 2 ; overschrijf redexPOP 1 ; gooi "x" wegRETURN ; herstel dump

Page 44: Deel I: Functionele Programmeertalen

Optimalisatie 3: geheugenrecuperatie

GLOBSTART kwadraat, 1EVALPUSH 0 ; push de waarde van xMULTIPLY ; voer de vermenig- ; vuldiging uitUPDATE 1 ; overschrijf redexRETURN ; herstel dump

Page 45: Deel I: Functionele Programmeertalen

Optimalisatie 4: combinatorsubstitutie

GLOBSTART prog, 0 PUSHINT 5 PUSHINT 5 ADDPUSHGLOBAL kwadraat MKAP ; kwadraat (+ 5 5)UPDATE 1 ; overschrijf redexUNWIND ; zoek volgende redex

Page 46: Deel I: Functionele Programmeertalen

Optimalisatie 5:constante expressies

GLOBSTART prog, 0 PUSHINT 10 PUSHGLOBAL kwadraat MKAP ; kwadraat 10UPDATE 1 ; overschrijf redexUNWIND ; zoek volgende redex

Page 47: Deel I: Functionele Programmeertalen

Optimalisatie 6: striktheidGLOBSTART kwadraat, 1PUSH 0 ; push de waarde van xMULTIPLY ; voer de vermenig- ; vuldiging uitUPDATE 1 ; overschrijf redexRETURN ; herstel dump

GLOBSTART prog, 0PUSHINT 10PUSHGLOBAL kwadraatMKAP ; kwadraat 10UPDATE 1 ; overschrijf redexUNWIND ; zoek volgende redex

Page 48: Deel I: Functionele Programmeertalen

Staartrecursie

zyx

EEEyx W

W F 321

GLOBSTART F,2..code voor E3..code voor E2..code voor E1PUSHGLOBAL WMKAPMKAPMKAPUPDATE 3POP 2UNWIND

Page 49: Deel I: Functionele Programmeertalen

Staartrecursie: stapelbeeld

Page 50: Deel I: Functionele Programmeertalen

Voorbeeld))( )1( (fac )0( if fac annanan

GLOBSTART FAC,2PUSH 0 ; nEVAL ; waarde van nPUSHINT 0 ; nulEQUAL ; gelijk ?JTRUE POSITIEF ; indien n>0PUSH 1 ; aEVAL ; evalueerUPDATE 3 ; overschrijf redex van facPOP 2 ; argumenten van fac wegRETURN ; reeds in ZHN vorm dank ; zij eval

Page 51: Deel I: Functionele Programmeertalen

LABEL POSITIEFPUSH 1 ; aPUSH 1 ; nMULTIPLY ; n*aPUSH 1 ; nPUSHINT 1 ; 1MINUS ; n-1PUSHGLOBAL FAC ; fac (n-1) (n*a)SQUEEZE 3 2 ; overschrijf originele ; argumenten DISPATCH 2 ; staartrecursie

Voorbeeld

Page 52: Deel I: Functionele Programmeertalen

Prestatienadelen van lazyness

laxlax :)():( telop

De uitdrukking

zal herleid worden tottelop 1 (telop 2 (telop 3 [0]))

[1 + 2 + 3 + 0]

Page 53: Deel I: Functionele Programmeertalen

Oplossing:accumulator + striktheid

lalbaaa

xx

)1( acculengte):( acculengte] [ acculengte

0acculengtelengte