Messaggi di errore #define L 10 int i,k,r[L]; for(i=0;i

12
Linguaggi e compilatori Dal linguaggio sorgente al programma eseguibile #define L 10 main() { int i,k,r[L]; for(i=0;i<L;i++) { k = 3*i+2; r[i] = k*k; } } 0010011000110001 1000111011001010 1101010010101001 1010101010101111 1010100111111111 0101010101010101 compilatore Messaggi di errore

Transcript of Messaggi di errore #define L 10 int i,k,r[L]; for(i=0;i

Page 1: Messaggi di errore #define L 10 int i,k,r[L]; for(i=0;i

Linguaggi e compilatori Dal linguaggio sorgente al programma eseguibile

#define L 10

main() { int i,k,r[L]; for(i=0;i<L;i++) { k = 3*i+2; r[i] = k*k; } }

0010011000110001 1000111011001010 1101010010101001 1010101010101111 1010100111111111 0101010101010101

compilatore

Messaggi di errore

Page 2: Messaggi di errore #define L 10 int i,k,r[L]; for(i=0;i

Il compilatore

Tecnologie per l'elaborazione del linguaggio

Marco Maggini

2

Page 3: Messaggi di errore #define L 10 int i,k,r[L]; for(i=0;i

Linguaggio sorgente e obiettivo

•  Esistono... migliaia di linguaggi sorgente ▫  Linguaggi di programmazione generici

  C, C++, Pascal, Fortran, Java, Basic, Lisp, Prolog, perl.... ▫  Linguaggi specializzati

  Formattazione di testi (Tex, Latex...)   Interrogazione di basi di dati

•  Il compilatore traduce il linguaggio sorgente in ▫  Un altro linguaggio di programmazione (pascal -> C) ▫  Il linguaggio macchina per un dato processore

Tecnologie per l'elaborazione del linguaggio

Marco Maggini

3

Page 4: Messaggi di errore #define L 10 int i,k,r[L]; for(i=0;i

Analisi e sintesi

Tecnologie per l'elaborazione del linguaggio

Marco Maggini

4

X = A+B*C X *

+ =

C B A

Page 5: Messaggi di errore #define L 10 int i,k,r[L]; for(i=0;i

Il “contesto” del compilatore

Tecnologie per l'elaborazione del linguaggio

Marco Maggini

5

preprocessore

assembler

linker/loader

scheletro programma sorgente

programma sorgente

programma assembly

programma oggetto

programma eseguibile

librerie

include, define (macro)

Page 6: Messaggi di errore #define L 10 int i,k,r[L]; for(i=0;i

La struttura del compilatore

Tecnologie per l'elaborazione del linguaggio

Marco Maggini

6

analisi lessicale

analisi sintattica

analisi semantica

generazione di codice intermedio

ottimizzazione

generazione del codice

gestione degli errori tavola dei simboli

Page 7: Messaggi di errore #define L 10 int i,k,r[L]; for(i=0;i

Analisi lessicale (scanning)

Tecnologie per l'elaborazione del linguaggio

Marco Maggini

7

int somma, diff = 0.3;

Page 8: Messaggi di errore #define L 10 int i,k,r[L]; for(i=0;i

Analisi sintattica

Tecnologie per l'elaborazione del linguaggio

Marco Maggini

8

istruzione di assegnazione

identificatore espressione

espressione

espressione identificatore

identificatore numero

espressione

espressione A

=

+

*

B C 60

Page 9: Messaggi di errore #define L 10 int i,k,r[L]; for(i=0;i

Regole sintattiche

Tecnologie per l'elaborazione del linguaggio

Marco Maggini

9

regole base

regole ricorsive

Page 10: Messaggi di errore #define L 10 int i,k,r[L]; for(i=0;i

Analisi semantica •  Ricava il significato associato alla struttura sintattica ▫  Verifica che le regole di impiego del linguaggio siano

soddisfatte   dichiarazione degli identificatori (ridefinizione,...)   controllo dei tipi (uso nelle espressioni, conversione

automatica di tipo, tipo di indici nei vettori, ecc..)

Tecnologie per l'elaborazione del linguaggio

Marco Maggini

10

*

C

D

int D; float C;

funzione di conversione int -> float

Page 11: Messaggi di errore #define L 10 int i,k,r[L]; for(i=0;i

Tavola dei simboli •  Memorizza gli identificatori con i relativi attributi ▫  utilizzo di memoria ▫  tipo ▫  campo di visibilità ▫  numero e tipo dei parametri per le funzioni

Tecnologie per l'elaborazione del linguaggio

Marco Maggini

11

Allocazione in memoria

Page 12: Messaggi di errore #define L 10 int i,k,r[L]; for(i=0;i

Generazione del codice oggetto

Tecnologie per l'elaborazione del linguaggio

Marco Maggini

12

= id1

id2 id3

+ * int-to-float

60

t1 = int-to-float(60) t2 = id3 * t1 t3 = id2 + t2 id1 = t3

t1 = id3 * 60.0 id1 = id2 + t1

MOVF id3, R2 MULF #60.0, R2 .............

rappresentazione interna

generazione di codice intermedio

ottimizzazione del codice

generazione del codice oggetto