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