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
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 endBack end
Lexical analizer (1) Riconosce i token dellinput stream Token: Numeri Identificatori Simboli (punteggiatura)
Lexical analizer (2) Numeri digit 0|1|2|3|4|5|6|7|8|9 digits digit digit* optional_fraction. digits | ε optional_ exponent ( E ( + | - | ε ) digits) | ε number digits optional_fraction optional_exponent
Lexical analizer (3) Identificatori letter A|B|C|…|Z|a|b|c|…|z digit 0|1|2|3|4|5|6|7|8|9 id letter (letter | digit )*
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 program opt_sub mainp opt_sub opt_sub ε | sub id ( listargs ) statement opt_sub mainp main ( ) statement statement { statement } |ε statement write ( id ) ; statement $ id ( listargs ) ; Programma sub out(a) { write(a); } main() { $out(1); }
Albero di parsing program mainp opt_sub ε main()stmt )lstarg(idsub ε outid a }stmt{ )id(write a stmt}{ ;$out(lstarg); 1
Il mio compilatore ha laritmetica 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 sorgente compilatore Pseudo assembler Assembler sorgente intel 80x86 Codice macchina intel 80x86
esempio Programma sorgente Pseudo assembler sub somma(a,b) { local(z); z=a+b; return(z); } main() { x=$somma(1,3); } 1-jump 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 push loadc push call destroy_local(4) 19- store halt 21- destroy_local(0) 22- end_funz 23- dw block(2)
esempio E push cs F pop ds E93400 jmp 0x nop push bp E5 mov bp,sp EC0200 sub sp,0x D 89EB mov bx,bp F 81C30600 add bx,0x B07 mov ax,[bx] EB mov bx,bp C30400 add bx,0x B 0307 add ax,[bx] D 89EB mov bx,bp F 81C3FEFF add bx,0xfffe mov [bx],ax EB mov bx,bp C3FEFF add bx,0xfffe B 8B07 mov ax,[bx] D 81C40200 add sp,0x D pop bp C3 ret C40200 add sp,0x D pop bp C3 ret nop A 55 push bp B 89E5 mov bp,sp D B80100 mov ax,0x push ax B80300 mov ax,0x push ax E8BDFF call 0x C40400 add sp,0x C A35701 mov [0x157],ax F CD20 int 0x C40000 add sp,0x D pop bp C3 ret add [bx+si],al nop Funzione somma Funzione main old bp h bp main z bp somma 0 FFFF h
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 Compilatore funzionante Eseguibili DOS/Windows Linguaggio C-like Sviluppi futuri Estenzione per un linguaggio ad oggetti eseguibile per altri sistemi operativi Sviluppare interfaccia grafica