1 Informatica Generale Marzia Buscemi Ricevimento: Giovedì ore , Dipartimento di Informatica, stanza 306-PS o per posta elettronica Pagina web del corso: (sommario delle lezioni in fondo alla pagina)
2 Finora abbiamo visto... Algoritmo Codifica in un linguaggio di programmazione (C, Java, etc) Programma Compilatore Eseguibile
3 Oggi vedremo... Algoritmo Programma traduttore Input : programma Output : rappresentazione comprensibile alla macchina Eseguibile
4 Traduzione I traduttori sono programmi particolari che provvedono a convertire il codice di programmi scritti in un dato linguaggio di programmazione (sorgenti) nella corrispondente rappresentazione in linguaggio macchina (programmi oggetto o eseguibili)
5 Traduzione 2 traduttore x = y indirizzo di y indirizzo di x codice sorgente (scritto in qualche linguaggio di alto livello) codice oggetto (“eseguibile”)
6 Due tipi di traduttori Interpreti traducono ed eseguono direttamente ciascuna istruzione del programma sorgente, istruzione per istruzione Compilatori accettano in input l’intero programma e producono in output la rappresentazione dell’intero programma in linguaggio macchina programma valore interprete programma compilatore
7 Due tipi di traduttori 2 Interpreti la traduzione avviene tante volte quante sono le istruzioni del programma; ad ogni attivazione dell’interprete su una particolare istruzione, segue l’esecuzione dell’istruzione Compilatori per ogni programma, la traduzione avviene una sola volta prima dell’esecuzione
8 Esempio L’istruzione while E do C è interpretata così: 1. l’espressione E in codice macchina viena valutata 2. Se E è falsa, il comando termina e si prosegue dall’istruzione successiva 3. Se E è vera si interpreta l’istruzione C (si traduce e si esegue ogni sottoistruzione) 4. Alla fine si ritorna a 1. PS. L’output di un interprete è il risultato dell’esecuzione del programma e non un programma da eseguire
9 Interprete vs compilatore Quale tra le due soluzioni è la migliore? compilazione: migliori prestazioni (la traduzione viene effettuata una volta sola) processi di ottimizzazione (compilazione sull’intero programma) interprete: in caso di modifiche, consente di eseguire il programma non appena il codice sorgente sia stata aggiornato
10 Processo di compilazione programma sorgente analisi lessicale alberi sintattici analisi sintattica pre-processing codice “pre-processato” elementi sintattici analisi semantica alberi sintattici “annotati” generazione codice macchina codice oggetto
11 Esempio // la seguente istruzione calcola il valore di una certa espressione aritmetica x := a*2 + b*(x*3) 1. La linea di codice sopra è riconducibile a una categoria sintattica? (sì, è un assegnamento) 2. il codice è valido o presenta degli errori? 3. determinare il significato, cioè quali operazioni deve eseguire l’elaboratore Dapprima si divide la linea in elementi sintattici (token), poi si trasformano questi elementi in istruzioni del linguaggio e si effettuano i controlli “semantici”, infine si traducono le istruzioni in linguaggio macchina
12 Esempio: pre-processing // la seguente istruzione calcola il valore di una certa espressione aritmetica x := a*2 + b*(x*3) i commenti al codice vengono rimossi
13 Esempio: analisi lessicale x := a*2 + b*(x*3) x assign a mult 2 plus b mult lpar x mult 3 rpar i caratteri vengono raccolti in elementi sintattici
14 Esempio: analisi sintattica x assign a mult 2 plus b mult lpar x mult 3 rpar x assign plus a 2 mult b x 3 gli elementi sintattici vengono organizzati in una struttura ad albero che descrive l’ordine in cui devono essere eseguite le operazioni (dal basso verso l’alto)
15 Esempio: analisi semantica x assign plus a 2 mult b x 3 x:int assign:int,int plus:int,int a: int 2 mult: int,int b:int mult:int,int x:int 3 Gli elementi dell’albero sintattico vengono etichettati con i tipi corrispondenti alle operazioni e agli operandi e si effettuano dei controlli di compatibilità su questi tipi
16 Processo di traduzione in Java codice byte-code (.class) compilatore programma sorgente (.java) Java Virtual Machine codice oggetto Es. Gli applet contengono codice byte-code e non risiedono permanentemente su un calcolatore, ma vengono tradotti e interpretati dalla JVM della macchina su cui sono copiati specifica per ciascun calcolatore
17 Linking e esecuzione Librerie: raccolte di programmi-oggetto che forniscono particolari funzionalità (funzioni matematiche, etc.) Linking: collega i diversi file-oggetto (librerie + programmi oggetto generati dai sorgenti scritti dal programmatore) in un unico programma eseguibile librerie programmi sorgenti compila- tore codici oggetto programma eseguibile linker
18 La struttura hardware
19 Ritorniamo alla …. struttura generale di un calcolatore Il calcolatore di Von Neumann Memoria (RAM,dischi, etc) Mantiene Dati e Programmi Processore (CPU) E’ un esecutore capace di interpretare i singoli passi richiesti dai programmi (istruzioni elementari) Sottosistema di Interfaccia Permette di comunicare dati e programmi alla macchina e di ottenere i risultati (tastiera, micr., stampante, schermo, )
20 Struttura di un calcolatore 2 RAM (memoria centrale) Processore bus Linee dati, indirizzi e controllo Interfaccia di I/O Interfaccia di I/O Interfaccia di I/O Interfaccia di I/O schermo dischi mouse modem
21 Struttura di un calcolatore 3 RAM (memoria centrale) Processore bus Linee dati, indirizzi e controllo Interfaccia di I/O Interfaccia di I/O Interfaccia di I/O Interfaccia di I/O schermo dischi mouse modem indirizzi Sequenza di parole (un array …)
22 Struttura di un calcolatore 4 RAM (memoria centrale) Processore bus Linee dati, indirizzi e controllo Interfaccia di I/O Interfaccia di I/O Interfaccia di I/O Interfaccia di I/O schermo dischi mouse modem indirizzi Sequenza di parole (un array …) Valore da trasferire Dove trasferirlo Direzione di trasferimento, unità coinvolte etc.
23 Struttura di un calcolatore 5 RAM (memoria centrale) Processore bus Linee dati, indirizzi e controllo Interfaccia di I/O Interfaccia di I/O Interfaccia di I/O Interfaccia di I/O schermo dischi mouse modem
24 Esecuzione: esempio Esempio: come si realizza l’operazione x=y+2 : LOAD Y, R1 ADD 2, R1 STORE R1, X Y X Indirizzi di due parole di memoria che rappresentano le variabili intere x e y 17 R1 Registro interno del processore (variabile temporanea su cui lavorare) Legge il valore in Y e lo scrive in R1 memoria assembler
25 Esecuzione: esempio 2 Esempio x=y+2 LOAD Y, R1 ADD 2, R1 STORE R1, X Y X Indirizzi di due parole di memoria che rappresentano interi 34 R1 Registro interno del processore (variabile temporanea su cui lavorare) Aggiunge 2 a R1 memoria assembler
26 Esecuzione: esempio 3 Esempio x=y+2 (assembler) LOAD Y, R1 ADD 2, R1 STORE R1, X Y X Indirizzi binari di due parole di memoria che rappresentano interi 36 R1 Registro interno del processore (variabile temporanea su cui lavorare) Scrive il contenuto di R1 nella parola di indirizzo X memoria assembler
27 Esecuzione: esempio 4 Esempio x=y+2 LOAD Y, R1 ADD 2, R1 STORE R1, X Y X Situazione finale della memoria 36 R1 memoria
28 Esecuzione: linguaggio macchina Traduzione binaria (in linguaggio macchina) di LOAD Y, R1 ADD 2, R1 STORE R1, X Prima di tutto dobbiamo decidere quale è il vero indirizzo di X e Y memoria Y X
29 Esecuzione: linguaggio macchina 2 Codifica binaria di LOAD 01101, R1 ADD 2, R1 STORE R1, Ogni operazione si codifica secondo un formato stabilito da chi costruisce l’hw un formato semplificato è Codice operativoModo 1Op1Modo 2Op2
30 Esecuzione: linguaggio macchina 3 Vediamo i vari campi del formato : Codice operativoModo1Op1Modo2Op2 è la codifica dell’operazione da eseguire es: ADD 0001 LOAD 0110 STORE 0111
31 Esecuzione: linguaggio macchina 4 Vediamo i vari campi del formato : Codice operativoModo1Op1Modo2Op2 è la codifica primo operando dice a cosa si riferisce OP1 es: se MODO1 = 00 l’operando è nel registro interno del processore (e OP1 è il numero del registro) se MODO1 = 01 l’operando è in memoria (e OP1 è l’indirizzo) se MODO1 = 10 l’operando è immediato, cioè OP1 è direttamente il valore dell’operando Lo stesso vale per il secondo operando!
32 Esecuzione: linguaggio macchina 5 Tipicamente la codifica di una istruzione è lunga come una parola (word) o multipli della parola per poterla leggere dalla memoria in modo più efficiente : es : con parole di 4 byte (32 bit) Codice operativoModo1Op1Modo2Op2 2bit 4bit 12bit
33 Esecuzione: linguaggio macchina 6 Problema ….. es : con 12 bit posso indirizzare ‘solo’ 2 12 parole di memoria centrale (RAM) ! Cioè posso avere al massimo una RAM di 4K parole … se ne ho di più (oggi si arriva a 128M e siamo sempre in aumento …) devo inventarmi codifiche diverse…. Codice operativoModo1Op1Modo2Op2 2bit 4bit 12bit
34 Esecuzione: linguaggio macchina 7 Codifica binaria di LOAD 01101, R1 ADD 2, R1 STORE R1, Codice operativoModo1Op1Modo2Op2 MODI 00 registro 01 memoria 10 immediato CODICI OPERATIVI ADD 0001 LOAD 0110 STORE bit 4bit 12bit load add store
35 Il processore Adesso vediamo come è strutturato il processore per riuscire ad eseguire i programmi in linguaggio macchina che abbiamo appena visto Dati e programmi sono codificati in binario e risiedono in Memoria Centrale (RAM) ad opportuni indirizzi
36 Il processore: struttura base Processore Unità di controllo PC IR R0 R1 R2... R16 Registri generali ALU Operazione Esegui Esito MARMAR MDRMDR MemoriacentraleMemoriacentrale Bus dati Bus indirizzo Bus controllo Registro/i coinvolti clock
37 Il processore: struttura base 2 I registri sono celle di memoria: PC (program counter) indica l’indirizzo di memoria della prossima istruzione da eseguire IR (instruction register) contiene copia della codifica dell’istruzione da eseguire MAR, MDR (Memory Address Register, Memory Data Register) contengono l’indirizzo della cella di memoria che vogliamo leggere/scrivere (MAR) ed i dati da/per la memoria (MDR) R0,R1... sono registri generali che servono per memorizzare valori durante i calcoli
38 Il processore: struttura base 3 CU (Unità di controllo): gestisce la successione delle operazioni da svolgere, sincronizzando le attività ALU (Unità aritmetico logica): effettua operazioni di tipo aritmetico e logico- booleano (+,-,and,or …) Clock: è un segnale periodico fatto di uni e zero che viene distribuito a tutti i circuiti sincroni del processore (vedi dopo)
39 Il processore Esegue il seguente ciclo ininterrottamente : 1. (fetch) legge una nuova istruzione da eseguire dalla memoria centrale 2. (decode) risale alla operazione richiesta decodificando la rappresentazione binaria 3. (execute) porta a termine l’operazione richiesta
40 Un esempio : ADD 2, R1 (fetch) 1 Processore Parte controllo 40 IR R0 R1 R2... R16 Registri generali ALU Operazione Esegui Esito MARMAR MDRMDR Bus dati Bus indirizzo Bus controllo Registro/i coinvolti memoria Indirizzo della istruzione codifica PC
41 Un esempio : ADD 2, R1 (fetch) 2 Processore Parte controllo 41 IR R0 R1 R2... R16 Registri generali ALU Operazione Esegui Esito MDRMDR Bus dati Bus indirizzo Registro/i coinvolti memoria Indirizzo della istruzione codifica PC 40 MAR Leggi!
42 Un esempio : ADD 2, R1 (fetch) 3 Processore Parte controllo R0 R1 R2... R16 Registri generali ALU Operazione Esegui Esito Bus dati Bus indirizzo Registro/i coinvolti memoria PC MAR MDR IR
43 Un esempio : ADD 2, R1 (dec) Processore Parte controllo R0 R1 R2... R16 Registri generali ALU add Esegui Esito Bus dati Bus indirizzo Registro/i coinvolti memoria PC MAR MDR IR
44 Un esempio : ADD 2, R1 (exe) 1 Processore Parte controllo R1 R2... R16 Registri generali ALU add Esegui Esito Bus dati Bus indirizzo Registro/i coinvolti memoria PC MAR MDR IR
45 Un esempio : ADD 2, R1 (exe) 2 Processore Parte controllo R2... R16 Registri generali ALU add Esegui Esito Bus dati Bus indirizzo Registro/i coinvolti memoria PC MAR MDR IR
46 Un esempio : ADD 2, R1 (exe) 3 Processore Parte controllo R2... R16 Registri generali ALU Esito Bus dati Bus indirizzo Registro/i coinvolti memoria PC MAR MDR IR
47 Il clock: periodo e frequenza L’esecuzione è sincrona, cioè esiste un segnale di ‘inizio della sottooperazione’ (detto impulso o tick, in quanto generato dal clock) distribuito a tutti i circuiti sequenziali sincroni. Il periodo di clock è l’intervallo di tempo tra due successivi impulsi. La frequenza con cui viene inviato il tick è misurata in ‘numero di impulsi al secondo’ (Hz) [1 GHz = un milione di impulsi al secondo] Importante: il tempo di esecuzione di una istruzione si misura in cicli di clock, cioè in quanti impulsi di clock sono necessari perché la CPU la completi. Quindi: maggiore frequenza maggiore velocità di CPU