Compilatori - Dipartimento di Ingegneria dell`informazione e scienze
Transcript
Compilatori - Dipartimento di Ingegneria dell`informazione e scienze
Fondamenti di Programmazione CdL Ingegneria Informatica e dell'Informazione Linguaggi di Programmazione Compilatori e Interpreti Grammatiche LP ad alto livello e compilatori Da LP ad alto livello a linguaggio macchina Compilatori e interpreti Compilatori Traduttore da linguaggio di alto livello a linguaggio macchina (o assembly) Linguaggi “evoluti” Indipendenti dalla macchina file.o file.c File sorgente Compilatore File oggetto 3 Linker Uno o più files oggetto devono essere collegati alle librerie Librerie: insieme di file oggetto preparati dal produttore del compilatore con le istruzioni per l’esecuzione di compiti comuni − − − Librerie matematiche Librerie grafiche Servizi di I/O L’operazione di link può essere esplicita o implicita 4 Compilatore file.c File sorgente file.o File oggetto Linker file.exe File eseguibile Compilatori e interpreti Compilatore: Programma che traduce un programma in un linguaggio ad alto livello in un programma in linguaggio assembly o macchina Interprete: Programma che traduce ed esegue una dopo l'altra le istruzioni che compongono il programma sorgente Confronto Interprete: Compilatore: -efficienza +efficienza +flessibilità -flessibilità +semplicità +memoria ridotta ... Compilatori e interpreti Java: Il compilatore traduce il codice in byte-code Linguaggio della macchina virtuale Java Un interprete traduce ed esegue le istruzioni in byte-code Linguaggi di programmazione Sintassi e semantica Grammatiche libere Grammatiche e compilatori Linguaggi di programmazione Istruzioni primitive che il calcolatore è in grado di eseguire e regole per combinare tra di loro le istruzioni primitive Sintassi: forma in cui l’istruzione primitiva è espressa Semantica: significato dell’istruzione stessa Grammatica (un esempio) G=(V,N,P,S) V={il,lo,la,cane,mela,gatto,mangia,graffia,,} N={frase,soggetto,verbo,complemento,articolo,nome} P: frase::=soggetto verbo complemento soggetto::=articolo nome articolo::=il | la | lo nome::= cane | mela | gatto verbo::= mangia | graffia complemento::= articolo nome | articolo nome , complemento S=frase Albero di derivazione frase soggetto articolo il nome gatto complemento verbo graffia articolo il nome cane , complemento articolo nome la mela LP, grammatiche e compilatori Un linguaggio di programmazione L è generato dalla sua grammatica (libera, non ambigua) Il vocabolario è costituito da identificatori e parole chiave Un compilatore conosce la grammatica del linguaggio e da una sequenza di simboli terminali può verificare se la frase appartiene al linguaggio • Risalendo al simbolo iniziale mediante le regole della grammatica Struttura di un compilatore file.c File sorgente Lista token Analisi lessicale AST Analisi sintattica AST aumentato Analisi semantica Generazione Forma intermedia Forma intermedia Tabella dei simboli Ottimizzazione file.o File oggetto Fasi della compilazione Analisi lessicale I simboli che costituiscono le istruzioni vengono letti (scansione) da sx verso dx allo scopo di raggrupparli in token. La scansione utilizza grammatiche regolari es. x=1+pippo++; restituirà 7 token Fasi della compilazione Analisi sintattica L'analizzatore sintattico (parser) cerca di costruire l'albero sintattico per la lista di token. In caso di fallimento, l'istruzione non è corretta e la compilazione viene abortita (messaggi di errore). Fasi della compilazione Analisi semantica (sintattica contestuale) Effettua controlli relativi ai vincoli contestuali del linguaggio: Dichiarazioni delle variabili Tipi e compatibilità Numero di parmatri delle funzioni... Queste informazioni arricchiscono la tabella dei simboli Fasi della compilazione Generazione della forma intermedia Produce una prima generazione di codice attraverso una visita dell'albero di derivazione aumentato (non ancora codice oggetto) Fasi della compilazione Ottimizzazione del codice Rimozione del codice inutile Espansione in-line delle funzioni Ottimizzazione dei cicli Variabili da memorizzare nei registri... Tipi di LP I linguaggi possono essere suddivisi sulla base del modello astratto di programmazione: Linguaggi di programmazione Imperativi Procedurali Ad Oggetti Paralleli (C,Pascal, (C++, Java) (Occam) Fortran) Dichiarativi Funzionali Logici Relazionali (Prolog) (SQL) (Lisp) Tipi di LP Linguaggi imperativi: − − − Il modello computazionale è basato sui cambiamenti di stato della memoria della macchina È centrale il concetto di assegnamento di un valore ad una locazione di memoria Il compito del programmatore è costruire una sequenza di assegnamenti che producano lo stato finale (in modo tale che questo rappresenti la soluzione del problema) Tipi di LP Linguaggi dichiarativi: − − Il modello computazionale è basato sui concetti di funzione e relazione Il programmatore non ragiona in termini di assegnazioni di valori, ma di relazioni fra entità e di valori di funzione NB. tutti i linguaggi di programmazione sono equivalenti (Turing completi) Ogni programma può essere scritto in un qualunque LP Tipi di LP Scelta del linguaggio di programmazione: sulla base dell’ambito del problema da risolvere: Calcolo Scientifico: Fortran,C Intelligenza Artificiale: Prolog,Lisp Sistemi device driven: Assembler,C Applicazioni gestionali: SQL,C Applicazioni client visuali: C++,Java,Visual Basic Applicazioni Web: Perl,ASP,Java Applicazioni distribuite: Java,C,C++ Fondamenti Il problema della fermata Espressività dei linguaggi di programmazione Il problema della fermata Problema: verificare se un programma terminerà o andrà in ciclo NB. per qualunque programma e input Fissiamo un linguaggio L P: un programma in L x: un input P(x): il risultato di una computazione Il problema della fermata ? Esiste un programma H che termina sempre e che risponde: H(P,x)=SI, se P(x) termina H(P,x)=NO, se P(x) va in ciclo Si dimostra per assurdo che non esiste Autoreferenzialità e negazione Il problema della fermata Se H esiste, esiste un programma K con input un programma: K(P)=SI, se H(P,P)=NO K(P)=va in ciclo, se H(P,P)=SI Poichè: H(P,P)=NO, se P(P) va in ciclo, allora K(P)=SI, se P(P) va in ciclo H(P,P)=SI, se P(P) termina, allora K(P)=va in ciclo, se P(P) termina Esegui K su se stesso! Indecidibilità del problema della fermata NB. non dipende dalla scelta di L, ogni LP dotato di costrutti per la forma condizionale e iterzione (o ricorsione) Altri: Verificare se due programmi calcolano la stessa funzione Espressività dei LP LP sono tutti equivalenti? Turing completezza: ogni LP calcola lo stesso insieme di funzioni, cioè quelle calcolate dalle macchine di Turing