O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.
CompilerConstructie / Les 3 
Activatierecords & 
Intermediaire Code 
Christophe Van Ginneken
les 3 in 1 [slide|minuut] 
broncode (intermediaire code)* machine code 
Front End Back End 
mov edx,len ;message length 
M...
89 minuten te vullen 
;-)
Proloog: jij && CC
Proloog: jij && CC 
• 38 jaar + vrouw & 2 kinderen 
• (ex-)software consultant 
• Open{Source,Mind} 
! 
• 1999 
gbasic 
• ...
Les 3 
Activatierecords & 
Intermediaire Code
EN ➔ NL
EN ➔ NL
EN ➔ NL
EN ➔ NL 
Intermediaire Code 
Intermediaire Voorstelling
Les 3 
Activatierecords & 
Intermediaire Code
Situering
Structuur van een compiler 
broncode intermediaire code 
machine code 
Front End Back End 
fouten 
mov edx,len ;message le...
Front End 
broncode intermediaire 
Scanner & 
Parser 
Semantisch 
Analyse & 
IC generatie 
tokens 
fouten 
code 
CJUMP(LT,...
CJUMP(LT,x,CONST(5), t, F) 
MEM(+(TEMP fp, CONST kn), S) 
SEQ(label z, s2(t, f) 
CALL(NAME z, [sl,e1, e2,...,en]) 
mov edx...
Waarom intermediaire 
code ? 
Java 
ML 
Pascal 
C 
C++ 
Sparc 
MIPS 
Pentium 
Alpha 
Java 
ML 
Pascal 
C 
C++ 
Sparc 
MIPS...
Intermediaire code 
• IC = “abstracte machine” code 
• moet handig zijn 
• genereren (door front-end) 
• om te zetten (doo...
CJUMP(LT,x,CONST(5), t, F) 
MEM(+(TEMP fp, CONST kn), S) 
SEQ(label z, s2(t, f) 
CALL(NAME z, [sl,e1, e2,...,en]) 
! 
Back...
Activatierecords ?
broncode 
Acties 
@ 
run-time
broncode 
Acties 
@ 
run-time namen data 
objecten
Terminologie 
program sort(input, output);! 
var a : array [0..10] of integer;! 
! 
procedure readarray;! 
var i : integer...
Procedure-verloop & 
levensduur 
1. sequentieel: uitvoeringsstappen 
2. procedureel: oproep - uitvoering - terugkeer 
proc...
Activatiesboom 
sort 
readarray qs(1, 9) 
part(1, 9) qs(1, 3) qs(5, 9) 
part(1, 3) qs(1, 0) qs(2, 3) part(5, 9) qs(5, 5) q...
Controlestack 
sort 
readarray qs(1, 9) 
part(1, 9) qs(1, 3) 
qs(2, 3) 
qs(1, 3) 
qs(1, 9) 
part(1, 3) qs(1, 0) qs(2, 3) s...
Scope van een 
declaratie 
• zelfde naam op meerdere plaatsen 
➔ scope regels: lokaal, niet-lokaal 
• “de scope van x” 
➔ ...
Naambinding 
omgeving status 
naam plaats waarde 
binding 
“l-value” 
pi 100 0 
pi:=3.14; 
“r-value” 
status 
pi 100 3.14 ...
Organisatie van geheugen 
stack 
vrij geheugen 
heap 
statische gegevens 
code 
(voorbeeld MIPS) 
hoge adressen 
controles...
Activatierecords 
• Stack Frame 
• procedure oproep == “activatie” 
• alle info gaat op de stack in een “frame” 
• ligt bi...
Activatierecords 
... 
argument n 
... 
argument 2 
argument 1 
statische link 
lokale variabelen 
terugkeer adres 
tijdel...
Intermezzo: 
Registers 
• 32 
• lokale variabelen ➔ snelheid 
• caller-save / callee-save 
• doorgeven van parameters (4, ...
Parameters & 
terugkeeradres 
• Calling convention 
• Call-by-reference 
! 
• CALL() 
• stack / register 
... 
argument n ...
Variabelen in het 
activatierecord 
• register ! 
• by-reference 
• geneste procedures 
• > 1 register 
• rij 
• veel 
! 
...
Statische link 
• blok structuur 
• statische link 
• “display” 
• “lambda lifting” 
part() 
qs(1, 3) 
qs(1, 9) 
sort 
pro...
Display 
• blok structuur 
• statische link 
• “display” 
• “lambda lifting” 
part() 
qs(1, 3) 
qs(1, 9) 
sort 
program so...
Lambda Lifting 
• blok structuur 
• statische link 
• “display” 
• “lambda lifting” 
program sort(input, output);! 
var a ...
Intermezzo: 
Hogere orde functies 
fun f(x) = 
let fun g(y) = x+y 
in g 
end 
! 
val h = f(3) 
val j = f(4) 
! 
val z = h(...
Intermediaire Code 
Generatie
IC generatie 
• meerdere iteraties 
• optimaliserende algoritmes één per één 
• onderlinge afhankelijkheid 
! 
AST 
! 
boo...
IC statements 
• SEQ( stm, stm ) 
• LABEL( label ) 
• JUMP( exp ) 
• CJUMP( op, exp, exp, label, label ) 
• MOVE( exp, exp...
IC expressies 
• BINOP( binop, exp, exp ) 
• MEM( exp ) 
• TEMP( temp ) 
• ESEQ( stm, exp ) 
• NAME( label ) 
• CONST( int...
Intermezzo: 
Expressies & Statements 
“Expressies” 
= “evalueert” tot een waarde 
1 + 2 
⇒ 3 
“Statements” 
= “doet iets” ...
AST ➔ IC 
• AST expressie 
• 3 soorten IC expressies 
• expressie 
2 + 1 Ex 
• statement 
procedure Nx 
• boolse expr. 
a ...
Enkelvoudige variabele 
MEM MEM(BINOP(PLUS, TEMP(fp), CONST(k))) 
BINOP 
PLUS TEMP fp CONST k MEM(+(TEMP(fp), CONST(k))) 
...
Rijen 
var a,b : array[1..12] of integer 
begin 
b := a; 
end; 
X ➔ 
{ 
int a[12], b[12]; 
b = a; 
} 
{ 
int a[12], *b; 
b...
Rijen 
MEM(+(MEM(e),BINOP(MUL,i,CONST(W))) 
MEM 
BINOP 
MUL i CONST W 
MEM e 
+ 
locale variabelen 
terugkeer adres 
tijde...
Integers & Strings 
• Integer 
IntExp(i) ➔ 
CONST(i) 
• Operaties 
OpExp(i,...) ➔ 
BINOP(i,...) 
! 
• Strings 
lengte + “r...
Boolse expressies 
a>b | c<d 
SEQ 
CJUMP 
GT a b null t z 
SEQ 
CJUMP 
LABEL(z) 
LT c d null t 
null f 
if a > b goto lbl_...
Intermezzo: 
Conversie van IC expr. 
• a < b 
boolse expressie 
CJUMP(LT, a, b, ..., ...) 
• var x = a < b 
expressie 
MOV...
Conditionele Expressies 
if e1 then e2 else e3 
if e1 goto t 
goto f 
unCx unEx unEx 
t: r = e2 
goto join 
f: r = e3 
joi...
Lussen 
test: if not(condition) goto done 
<body> 
goto test 
done: 
for i := low to high do 
<body> 
let var i := low in ...
Functieoproepen 
f(a1,a2,...,an) 
CALL(NAME(lf), [sl,e1,e2,...,en]) 
lf LABEL voor f 
sl statische link 
ex adres voor ax
Functiedefinities 
function partition(y, z: integer) : integer;! 
var i, j, x, v: integer;! 
begin ... end; 
FunctionDec 
...
Proloog / Epiloog 
• proloog 
• aankondiging begin functie 
• label voor functie naam 
• aanpassen stack pointer 
• escapi...
Managed - Unmanaged
Managed - Unmanaged 
• IC == Java Bytecode ? 
• .NET Common Intermediate Language ? 
• javac == Front-End ? 
• java == Bac...
Managed - Unmanaged 
• Java, .NET, Perl 6,... 
• Heeft unmanaged nog zin ? 
• Run-Time optimalisaties verder dan 
machine ...
Managed - Unmanaged 
Conclusies groepsgesprek: 
• Intermediare Code staat nog ver van Java bytecode: 
bvb. veel details (e...
Wat hebben we geleerd 
vandaag ? 
COMPILEERPLEZIER CC
broncode (intermediaire code)* machine code 
Front End Back End 
mov edx,len ;message length 
Mov ecx,msg ;message to writ...
Optimale Code Generatie 
is een onbeslisbaar probleem 
• Doe het zo goed mogelijk 
• correct 
• gebruik machine architectu...
EndOfPresentationException
Mogelijke 
Examenvragen 
• Wat is een “standaard activatierecord-layout” en waarom zou je 
dit al dan niet volgen ? 
• Kan...
Compiler Constructie - Activatierecords en Intermediaire Code
Compiler Constructie - Activatierecords en Intermediaire Code
Compiler Constructie - Activatierecords en Intermediaire Code
Compiler Constructie - Activatierecords en Intermediaire Code
Próximos SlideShares
Carregando em…5
×

Compiler Constructie - Activatierecords en Intermediaire Code

255 visualizações

Publicada em

Een presentatie gegeven tijdens mijn cursus "Compiler Constructie" mbt Activatierecords en Intermediaire Code. Gebaseerd op het handboek "Modern Compiler Construction in C" van Appel en "The Dragon Book" :-)

Publicada em: Tecnologia
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Compiler Constructie - Activatierecords en Intermediaire Code

  1. 1. CompilerConstructie / Les 3 Activatierecords & Intermediaire Code Christophe Van Ginneken
  2. 2. les 3 in 1 [slide|minuut] broncode (intermediaire code)* machine code Front End Back End mov edx,len ;message length Mov ecx,msg ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel Java ML Pascal C C++ Sparc MIPS Pentium Alpha CJUMP(LT,x,CONST(5), t, F) MEM(+(TEMP fp, CONST kn), S) SEQ(label z, s2(t, f)) CALL(NAME z, [sl,e1, e2,...,en]) ... argument n ... argument 2 argument 1 statische link locale variabelen terugkeer adres tijdelijke variabelen opgeslagen registers argument n ... argument 2 argument 1 statische link locale variabelen ... stack vrij geheugen heap statische gegevens code CALL(NAME z, [sl,e1, e2,...,en]) procedure-oproep- en keer-terug-model oproep == activatie activatierecord == stack frame
  3. 3. 89 minuten te vullen ;-)
  4. 4. Proloog: jij && CC
  5. 5. Proloog: jij && CC • 38 jaar + vrouw & 2 kinderen • (ex-)software consultant • Open{Source,Mind} ! • 1999 gbasic • 2006 UML model “compiler” • 2012 foo-lang
  6. 6. Les 3 Activatierecords & Intermediaire Code
  7. 7. EN ➔ NL
  8. 8. EN ➔ NL
  9. 9. EN ➔ NL
  10. 10. EN ➔ NL Intermediaire Code Intermediaire Voorstelling
  11. 11. Les 3 Activatierecords & Intermediaire Code
  12. 12. Situering
  13. 13. Structuur van een compiler broncode intermediaire code machine code Front End Back End fouten mov edx,len ;message length Mov ecx,msg ;message to write mov ebx,1 ;file descriptor mov eax,4 ;system call int 0x80 ;call kernel ! mov eax,1 ;system call int 0x80 ;call kernel
  14. 14. Front End broncode intermediaire Scanner & Parser Semantisch Analyse & IC generatie tokens fouten code CJUMP(LT,x,CONST(5), t, F) MEM(+(TEMP fp, CONST kn), S) SEQ(label z, s2(t, f) CALL(NAME z, [sl,e1, e2,...,en]) AST
  15. 15. CJUMP(LT,x,CONST(5), t, F) MEM(+(TEMP fp, CONST kn), S) SEQ(label z, s2(t, f) CALL(NAME z, [sl,e1, e2,...,en]) mov edx,len ;message length Mov ecx,msg ;message to write mov ebx,1 ;file descriptor mov eax,4 ;system call int 0x80 ;call kernel ! mov eax,1 ;system call int 0x80 ;call kernel Back End {code generatie Instructie Selectie & Flow Analyse Register Allocatie & Code Emissie fouten intermediaire code machine code Optimizer Optimizer
  16. 16. Waarom intermediaire code ? Java ML Pascal C C++ Sparc MIPS Pentium Alpha Java ML Pascal C C++ Sparc MIPS Pentium Alpha IC
  17. 17. Intermediaire code • IC = “abstracte machine” code • moet handig zijn • genereren (door front-end) • om te zetten (door back-end) • eenvoudig en duidelijk
  18. 18. CJUMP(LT,x,CONST(5), t, F) MEM(+(TEMP fp, CONST kn), S) SEQ(label z, s2(t, f) CALL(NAME z, [sl,e1, e2,...,en]) ! Back End ! Front End Situering IC Semantisch Analyse & IC generatie Code Generatie
  19. 19. Activatierecords ?
  20. 20. broncode Acties @ run-time
  21. 21. broncode Acties @ run-time namen data objecten
  22. 22. Terminologie program sort(input, output);! var a : array [0..10] of integer;! ! procedure readarray;! var i : integer;! begin! for i := 1 to 9 do read(a[i])! end;! ! function partition(y, z: integer) : integer;! var i, j, x, v: integer;! begin ... end;! ! procedure quicksort(m, n : integer);! var a : integer;! begin! if( n > m ) then begin! a := partition(m, n);! quicksort(m, a-1);! quicksort(a+1, n);! end! end;! ! begin! a[0] := -9999; a[10] := 9999;! readarray;! quicksort(1,9);! end. procedure naam procedure body formele parameters actuele parameters niveau 1 niveau 2 niet-lokale scope & geneste diepte lokale scope
  23. 23. Procedure-verloop & levensduur 1. sequentieel: uitvoeringsstappen 2. procedureel: oproep - uitvoering - terugkeer procedure A procedure B X activatie procedure A procedure B procedure A procedure B procedure A procedure A recursief
  24. 24. Activatiesboom sort readarray qs(1, 9) part(1, 9) qs(1, 3) qs(5, 9) part(1, 3) qs(1, 0) qs(2, 3) part(5, 9) qs(5, 5) qs(7, 9) part(2, 3) qs(2, 1) qs(3, 3) part(7, 9) qs(7, 7) qs(9, 9)
  25. 25. Controlestack sort readarray qs(1, 9) part(1, 9) qs(1, 3) qs(2, 3) qs(1, 3) qs(1, 9) part(1, 3) qs(1, 0) qs(2, 3) sort
  26. 26. Scope van een declaratie • zelfde naam op meerdere plaatsen ➔ scope regels: lokaal, niet-lokaal • “de scope van x” ➔ “de scope van de declaratie van naam x die van toepassing is voor dit voorkomen van x” • compilatie ➔ symbolen tabel voorkomen ➔ declaratie program sort(input, output);! var a : array [0..10] of integer;! ! procedure readarray;! var i : integer;! begin! for i := 1 to 9 do read(a[i])! end;! ...! procedure quicksort(m, n : integer);! var a : integer;! begin! if( n > m ) then begin! a := partition(m, n);! quicksort(m, a-1);! quicksort(a+1, n);! end! end;! ...
  27. 27. Naambinding omgeving status naam plaats waarde binding “l-value” pi 100 0 pi:=3.14; “r-value” status pi 100 3.14 statisch / in code dynamisch / tijdens uitvoering definitie van een procedure activatie van de procedure declaratie van een naam binding van de naam scope van een declaratie levensduur van de binding
  28. 28. Organisatie van geheugen stack vrij geheugen heap statische gegevens code (voorbeeld MIPS) hoge adressen controlestack met activatierecords “malloc” lage adressen
  29. 29. Activatierecords • Stack Frame • procedure oproep == “activatie” • alle info gaat op de stack in een “frame” • ligt bijna volledig vast bij compilatie • conventionele layout
  30. 30. Activatierecords ... argument n ... argument 2 argument 1 statische link lokale variabelen terugkeer adres tijdelijke variabelen opgeslagen registers argument n ... argument 2 argument 1 statische link locale variabelen ... frame pointer stack pointer vorig frame huidig frame volgend frame
  31. 31. Intermezzo: Registers • 32 • lokale variabelen ➔ snelheid • caller-save / callee-save • doorgeven van parameters (4, 6) http://en.wikipedia.org/wiki/Processor_register
  32. 32. Parameters & terugkeeradres • Calling convention • Call-by-reference ! • CALL() • stack / register ... argument n ... argument 2 argument 1 statische link lokale variabelen terugkeer adres tijdelijke variabelen opgeslagen registers argument n ... argument 2 argument 1 statische link
  33. 33. Variabelen in het activatierecord • register ! • by-reference • geneste procedures • > 1 register • rij • veel ! • “escapes” ... argument n ... argument 2 argument 1 statische link lokale variabelen terugkeer adres tijdelijke variabelen opgeslagen registers argument n ... argument 2 argument 1 statische link
  34. 34. Statische link • blok structuur • statische link • “display” • “lambda lifting” part() qs(1, 3) qs(1, 9) sort program sort(input, output);! var a : array [0..10] of integer;! ...! procedure quicksort(m, n : integer);! var i : integer;! function partition() : integer;! var i, j, x, v: integer;! begin ... a[x] ... end;! begin! if( n > m ) then begin! i := partition();! quicksort(m, i-1);! quicksort(i+1, n);! end! end;
  35. 35. Display • blok structuur • statische link • “display” • “lambda lifting” part() qs(1, 3) qs(1, 9) sort program sort(input, output);! var a : array [0..10] of integer;! ...! procedure quicksort(m, n : integer);! var i : integer;! function partition() : integer;! var i, j, x, v: integer;! begin ... a[x] ... end;! begin! if( n > m ) then begin! i := partition();! quicksort(m, i-1);! quicksort(i+1, n);! end! end; d[3] d[2] d[1]
  36. 36. Lambda Lifting • blok structuur • statische link • “display” • “lambda lifting” program sort(input, output);! var a : array [0..10] of integer;! ! procedure readarray(a : array[0..10] of integer);! var i : integer;! begin! for i := 1 to 9 do read(a[i])! end;! ! function partition(y, z: integer,! a : array[0..10] of integer)! : integer;! var i, j, x, v: integer;! begin ... end;! ! procedure quicksort(m, n : integer,! a : array[0..10] of integer);! var i : integer;! begin! if( n > m ) then begin! i := partition(m,n,a);! quicksort(m,i-1,a);! quicksort(i+1,n,a);! end! end;! ! begin! a[0] := -9999; a[10] := 9999;! readarray(a);! quicksort(1,9,a);! end.
  37. 37. Intermezzo: Hogere orde functies fun f(x) = let fun g(y) = x+y in g end ! val h = f(3) val j = f(4) ! val z = h(5) (* 8 *) val w = j(7) (* 11 *) geneste functies + resultaat = functie hogere orde functie Kan niet op een stack !
  38. 38. Intermediaire Code Generatie
  39. 39. IC generatie • meerdere iteraties • optimaliserende algoritmes één per één • onderlinge afhankelijkheid ! AST ! boom IC ! sequentieel
  40. 40. IC statements • SEQ( stm, stm ) • LABEL( label ) • JUMP( exp ) • CJUMP( op, exp, exp, label, label ) • MOVE( exp, exp ) • EXP( exp )
  41. 41. IC expressies • BINOP( binop, exp, exp ) • MEM( exp ) • TEMP( temp ) • ESEQ( stm, exp ) • NAME( label ) • CONST( int ) • CALL( exp, args )
  42. 42. Intermezzo: Expressies & Statements “Expressies” = “evalueert” tot een waarde 1 + 2 ⇒ 3 “Statements” = “doet iets” x = 2 doSomething() ! Pascal expliciet function, procedure C* verwaterd doSomething(x = 2) Haskell géén statements, alleen expressies
  43. 43. AST ➔ IC • AST expressie • 3 soorten IC expressies • expressie 2 + 1 Ex • statement procedure Nx • boolse expr. a < b Cx
  44. 44. Enkelvoudige variabele MEM MEM(BINOP(PLUS, TEMP(fp), CONST(k))) BINOP PLUS TEMP fp CONST k MEM(+(TEMP(fp), CONST(k))) ... argument n ... argument 2 argument 1 statische link locale variabelen terugkeer adres tijdelijke variabelen opgeslagen registers argument n ... argument 2 argument 1 statische link locale variabelen ... stack vrij geheugen heap statische gegevens code frame pointer stack pointer TEMP(fp) frame pointer variabele MEM(...) + = CONST(k) + statische link uitwerken
  45. 45. Rijen var a,b : array[1..12] of integer begin b := a; end; X ➔ { int a[12], b[12]; b = a; } { int a[12], *b; b = a; } let type intArray = array of int var a := intArray[12] of 0 var b := intArray[12] of 7 in b := a end Pascal C Tiger
  46. 46. Rijen MEM(+(MEM(e),BINOP(MUL,i,CONST(W))) MEM BINOP MUL i CONST W MEM e + locale variabelen terugkeer adres tijdelijke variabelen opgeslagen registers argument n ... argument 2 argument 1 statische link a[i] a’= MEM(+(TEMP(fp),CONST(ka))) MEM(a’) stack vrij geheugen heap statische gegevens code MEM(a’+(i*W))
  47. 47. Integers & Strings • Integer IntExp(i) ➔ CONST(i) • Operaties OpExp(i,...) ➔ BINOP(i,...) ! • Strings lengte + “rij” van karakters 11 h e l l o w o r l d
  48. 48. Boolse expressies a>b | c<d SEQ CJUMP GT a b null t z SEQ CJUMP LABEL(z) LT c d null t null f if a > b goto lbl_true goto z z: if c < d goto lbl_true goto lbl_false
  49. 49. Intermezzo: Conversie van IC expr. • a < b boolse expressie CJUMP(LT, a, b, ..., ...) • var x = a < b expressie MOVE(TEMP(x), ? ) 0 1 expressie boolse statement unCx unNx unEx
  50. 50. Conditionele Expressies if e1 then e2 else e3 if e1 goto t goto f unCx unEx unEx t: r = e2 goto join f: r = e3 join: SEQ CJUMP “e1” t f SEQ SEQ LABEL(t) MOVE TEMP(r) “e3” MOVE LABEL(f) TEMP(r) “e2” SEQ SEQ LABEL(join) join SEQ join SEQ
  51. 51. Lussen test: if not(condition) goto done <body> goto test done: for i := low to high do <body> let var i := low in while i <= high do <body> i := i + 1 end while maxint !
  52. 52. Functieoproepen f(a1,a2,...,an) CALL(NAME(lf), [sl,e1,e2,...,en]) lf LABEL voor f sl statische link ex adres voor ax
  53. 53. Functiedefinities function partition(y, z: integer) : integer;! var i, j, x, v: integer;! begin ... end; FunctionDec Symbol(“partition”) FieldList Symbol(“y”) Symbol(“z”) Symbol(“integer”) Symbol(“integer”) LetExp Symbol(“integer”) DecList ... VarDec Symbol(“i”) ... Symbol(“integer”) AST IC fragment PROC(label “partition”, <IC code for body>, <frame layout info>)
  54. 54. Proloog / Epiloog • proloog • aankondiging begin functie • label voor functie naam • aanpassen stack pointer • escaping argumenten + statische link bewaren niet-escaping in registers • callee-save registers & terugkeer adres • epiloog • resultaat naar register • callee-save registers • terugzetten stack pointer • terugkeer instructie • aankondiging einde functie exacte grootte frame is pas gekend NA register allocatie
  55. 55. Managed - Unmanaged
  56. 56. Managed - Unmanaged • IC == Java Bytecode ? • .NET Common Intermediate Language ? • javac == Front-End ? • java == Back-End ?
  57. 57. Managed - Unmanaged • Java, .NET, Perl 6,... • Heeft unmanaged nog zin ? • Run-Time optimalisaties verder dan machine code optimalisaties in compiler ?
  58. 58. Managed - Unmanaged Conclusies groepsgesprek: • Intermediare Code staat nog ver van Java bytecode: bvb. veel details (exacte adressering, machineafhankelijke constanten,...) ontbreken nog • Unmanaged code kan zeker nog betekenis behouden in kader van bvb. embedded systemen. • Tendens naar managed is zeker waar te nemen en wordt bvb. ondersteund door processoren die rechtstreeks Java bytecode kunnen uitvoeren. De vraag wordt dan wel of deze dan nog verschillend van klassieke machine code kan/moet gezien worden.
  59. 59. Wat hebben we geleerd vandaag ? COMPILEERPLEZIER CC
  60. 60. broncode (intermediaire code)* machine code Front End Back End mov edx,len ;message length Mov ecx,msg ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel Java ML Pascal C C++ Sparc MIPS Pentium Alpha CJUMP(LT,x,CONST(5), t, F) MEM(+(TEMP fp, CONST kn), S) SEQ(label z, s2(t, f)) CALL(NAME z, [sl,e1, e2,...,en]) ... argument n ... argument 2 argument 1 statische link locale variabelen terugkeer adres tijdelijke variabelen opgeslagen registers argument n ... argument 2 argument 1 statische link locale variabelen ... stack vrij geheugen heap statische gegevens code CALL(NAME z, [sl,e1, e2,...,en]) procedure-oproep- en keer-terug-model oproep == activatie activatierecord == stack frame
  61. 61. Optimale Code Generatie is een onbeslisbaar probleem • Doe het zo goed mogelijk • correct • gebruik machine architectuur • efficiënte uitvoering
  62. 62. EndOfPresentationException
  63. 63. Mogelijke Examenvragen • Wat is een “standaard activatierecord-layout” en waarom zou je dit al dan niet volgen ? • Kan het FP register niet eenvoudig vervangen worden door en/of gebaseerd worden op het SP register ? Bespreek aan de hand van het principe van activatierecords en een stack. • Wat is een “dangling reference” ? Geef een voorbeeld hoe deze kan ontstaan vanuit een activatierecord. • Wat zijn de beperkingen van activatierecords en een stack ? • Waarom gebruik je wel of niet één of meerdere intermediare codes ? Wat zijn de voordelen/nadelen ? • Welke eigenschappen vertoont een goede intermediaire code ?

×