La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Sviluppo di un compilatore per un linguaggio imperativo. Università degli studi di Roma Tor Vergata Facoltà di Ingegneria Corso di laurea in Ingegneria.

Presentazioni simili


Presentazione sul tema: "Sviluppo di un compilatore per un linguaggio imperativo. Università degli studi di Roma Tor Vergata Facoltà di Ingegneria Corso di laurea in Ingegneria."— Transcript della presentazione:

1 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

2 Cosa e un compilatore E un programma che traduce un programma (sorgente) in un altro programma equivalente sorgente compilatore codice

3 Struttura di un compilatore Front end = lexical analizer + parser Back end = encoder + linker Front endBack end

4 Lexical analizer (1) Riconosce i token dellinput stream Token: Numeri Identificatori Simboli (punteggiatura)

5 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

6 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 )*

7 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

8 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); }

9 Albero di parsing program mainp opt_sub ε main()stmt )lstarg(idsub ε outid a }stmt{ )id(write a stmt}{ ;$out(lstarg); 1

10 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

11 Output del mio compilatore sorgente compilatore Pseudo assembler Assembler sorgente intel 80x86 Codice macchina intel 80x86

12 esempio Programma sorgente Pseudo assembler sub somma(a,b) { local(z); z=a+b; return(z); } main() { x=$somma(1,3); } 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)

13 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 Funzione main old bp 1 3 148 h bp main z bp somma 0 FFFF h

14 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; }

15 Esempio (2) Output del programma fattoriale

16 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


Scaricare ppt "Sviluppo di un compilatore per un linguaggio imperativo. Università degli studi di Roma Tor Vergata Facoltà di Ingegneria Corso di laurea in Ingegneria."

Presentazioni simili


Annunci Google