160 likes | 270 Views
Sviluppo di un compilatore per un linguaggio imperativo. Università degli studi di Roma “Tor Vergata” Facoltà di Ingegneria Corso di laurea in Ingegneria Informatica. Relatore Prof. Alberto Pettorossi. Laureando Fernando Iazeolla. Anno Accademico 2003-2004. Cosa e’ un compilatore.
E N D
Sviluppo di un compilatore per un linguaggio imperativo. Università degli studi di Roma “Tor Vergata” Facoltà di Ingegneria Corso di laurea in Ingegneria Informatica Relatore Prof. Alberto Pettorossi Laureando Fernando Iazeolla Anno Accademico 2003-2004
Cosa e’ un compilatore • E’ un programma che traduce un programma (sorgente) in un altro programma equivalente sorgente compilatore codice
Struttura di un compilatore • Front end = lexical analizer + parser • Back end = encoder + linker Front end Back end
Lexical analizer (1) • Riconosce i token dell’input stream • Token: • Numeri • Identificatori • Simboli (punteggiatura)
Lexical analizer (2) • Numeri
Lexical analizer (3) • Identificatori
parser (1) • Il linguaggio e’ riconosciuto dal parser tramite grammatiche ‘context-free’ o BNF • Assumiamo il parser come una rappresentazione di un albero di parsing per i token generati dal lexical analizer
Parser (2) Grammatica programopt_sub mainp opt_sub opt_subε | sub id ( listargs ) statement opt_sub mainpmain() statement statement{ statement } |ε statementwrite( id ); statement$ id ( listargs ); Programma sub out(a) { write(a); } main() { $out(1); }
Albero di parsing program opt_sub opt_sub mainp sub id ( lstarg ) stmt ε main ( ) stmt ε { stmt } out id { stmt } a write ( id ) ; $ out ( lstarg ) ; 1 a
Il mio compilatore • ha l’aritmetica dei puntatori • ha le funzioni con parametri • ha variabili globali • ha variabili locali • ha tipi di dato : interi, puntatori, stringhe • e’ procedurale • adotta una sintassi C-like
Output del mio compilatore Pseudo assembler compilatore sorgente Assembler sorgente intel 80x86 Codice macchina intel 80x86
Programma sorgente Pseudo assembler esempio 1-jump 12 2- init_funz 3- create_local(2) 4- load stack_bp(6) 5- add stack_bp(4) 6- store stack_bp(-2) 7- load stack_bp(-2) 8- destroy_local(2) 9- end_funz 10- destroy_local(2) 11- end_funz 12- init_funz 13- loadc 1 14- push 0 15- loadc 3 16- push 0 17- call 2 18- destroy_local(4) 19- store 23 20- halt 21- destroy_local(0) 22- end_funz 23- dw 0 24- block(2) sub somma(a,b) { local(z); z=a+b; return(z); } main() { x=$somma(1,3); }
esempio 00000100 0E push cs 00000101 1F pop ds 00000102 E93400 jmp 0x39 00000105 90 nop 00000106 55 push bp 00000107 89E5 mov bp,sp 00000109 81EC0200 sub sp,0x2 0000010D 89EB mov bx,bp 0000010F 81C30600 add bx,0x6 00000113 8B07 mov ax,[bx] 00000115 89EB mov bx,bp 00000117 81C30400 add bx,0x4 0000011B 0307 add ax,[bx] 0000011D 89EB mov bx,bp 0000011F 81C3FEFF add bx,0xfffe 00000123 8907 mov [bx],ax 00000125 89EB mov bx,bp 00000127 81C3FEFF add bx,0xfffe 0000012B 8B07 mov ax,[bx] 0000012D 81C40200 add sp,0x2 00000131 5D pop bp 00000132 C3 ret 00000133 81C40200 add sp,0x2 00000137 5D pop bp 00000138 C3 ret 00000139 90 nop 0000013A 55 push bp 0000013B 89E5 mov bp,sp 0000013D B80100 mov ax,0x1 00000140 50 push ax 00000141 B80300 mov ax,0x3 00000144 50 push ax 00000145 E8BDFF call 0x5 00000148 81C40400 add sp,0x4 0000014C A35701 mov [0x157],ax 0000014F CD20 int 0x20 00000151 81C40000 add sp,0x0 00000155 5D pop bp 00000156 C3 ret 00000157 0000 add [bx+si],al 00000159 90 nop Funzione somma FFFF h old bp 1 3 148 h bp main bp somma Funzione main z 0
Esempio (2) • Programma fattoriale sub foo() { return(5); } sub fattoriale(a) { local(x,y,z); if(a==1) return(1); z=a-1; y=$fattoriale(z); x=y*a; return(x); } main() { local(x,z); write("fattoriale"); write(crlf); x=$fattoriale(8); write(x); write(crlf); if(x>100) { z=4; } else { z=$foo(); } write("ciclo"); write(crlf); while(z>0) { write(z); write(crlf); z=z-1; } }
Esempio (2) Output del programma fattoriale
Conclusioni • Conclusioni • Compilatore funzionante • Eseguibili DOS/Windows • Linguaggio C-like • Sviluppi futuri • Estenzione per un linguaggio ad oggetti • eseguibile per altri sistemi operativi • Sviluppare interfaccia grafica