Informatica Generale Marzia Buscemi [email protected] Ricevimento: Giovedì ore 16.00-18.00, Dipartimento di Informatica, stanza 306-PS o per posta elettronica Pagina web del corso: http://www.di.unipi.it/~buscemi/IG07.htm (sommario delle lezioni in fondo alla pagina) 1 Finora abbiamo visto... Algoritmo Codifica in un linguaggio di programmazione (C, Java, etc) Programma Compilatore Eseguibile 2 Oggi vedremo... Algoritmo Programma Input : programma traduttore Eseguibile Output : rappresentazione comprensibile alla macchina 3 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) 4 Traduzione codice sorgente (scritto in qualche linguaggio di alto livello) x = y +2 traduttore 2 codice oggetto (“eseguibile”) 00010100 11001011 00010110 00000010 00010111 11001111 indirizzo di y indirizzo di x 5 Due tipi di traduttori Interpreti traducono ed eseguono direttamente ciascuna istruzione del programma sorgente, istruzione per istruzione programma interprete valore Compilatori accettano in input l’intero programma e producono in output la rappresentazione dell’intero programma in linguaggio macchina programma compilatore programma 6 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 7 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 8 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 9 Processo di compilazione programma sorgente codice oggetto analisi semantica alberi sintattici pre-processing generazione codice macchina codice “pre-processato” analisi lessicale alberi sintattici “annotati” analisi sintattica elementi sintattici 10 Esempio // la seguente istruzione calcola il valore di una certa espressione aritmetica x := a*2 + b*(x*3) 1. 2. 3. La linea di codice sopra è riconducibile a una categoria sintattica? (sì, è un assegnamento) il codice è valido o presenta degli errori? 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 11 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 x := a*2 + b*(x*3) 12 Esempio: analisi lessicale x := a*2 + b*(x*3) i caratteri vengono raccolti in elementi sintattici <id>x assign <id>a mult <int>2 plus <id>b mult lpar <id>x mult <int>3 rpar 13 Esempio: analisi sintattica <id>x assign <id>a mult <int>2 plus <id>b mult lpar <id>x mult <int>3 rpar 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) assign plus x mult mult mult a 2 b x 3 14 Esempio: analisi semantica assign:int,int assign x:int plus x mult mult mult: int,int mult a 2 plus:int,int b mult:int,int mult:int,int a: int 2 x 3 b:int 3 x:int 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 15 Processo di traduzione in Java programma sorgente (.java) compilatore codice oggetto codice byte-code (.class) Java Virtual Machine specifica per ciascun calcolatore 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 16 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 programmi sorgenti compilatore codici oggetto linker librerie programma eseguibile 17 La struttura hardware 18 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, ) 19 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 20 Struttura di un calcolatore 3 Sequenza di parole (un array …) indirizzi 0 1 2 3 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 21 Struttura di un calcolatore 4 Sequenza di parole (un array …) indirizzi 0 1 2 3 4 Valore da trasferire RAM (memoria centrale) Processore Dove trasferirlo . . . Direzione di trasferimento, unità coinvolte etc. 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 22 Struttura di un calcolatore RAM (memoria centrale) 5 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 23 Esecuzione: esempio Esempio: come si realizza l’operazione x=y+2 : LOAD Y, R1 ADD 2, R1 STORE R1, X assembler R1 memoria Legge il valore in Y e lo scrive in R1 17 Registro interno del processore (variabile temporanea su cui lavorare) Y 34 X 222 Indirizzi di due parole di memoria che rappresentano le variabili intere x e y 24 Esecuzione: esempio Esempio x=y+2 LOAD Y, R1 ADD 2, R1 Aggiunge 2 a R1 STORE R1, X 2 memoria Y 34 X 222 assembler R1 34 Registro interno del processore (variabile temporanea su cui lavorare) Indirizzi di due parole di memoria che rappresentano interi 25 Esecuzione: esempio Esempio x=y+2 (assembler) LOAD Y, R1 ADD 2, R1 STORE R1, X Y assembler R1 Scrive il contenuto di R1 nella parola di indirizzo X 36 Registro interno del processore (variabile temporanea su cui lavorare) X 3 memoria 34 222 Indirizzi binari di due parole di memoria che rappresentano interi 26 Esecuzione: esempio Esempio x=y+2 LOAD Y, R1 ADD 2, R1 STORE R1, X R1 36 4 memoria Y 34 X 36 Situazione finale della memoria 27 Esecuzione: linguaggio macchina Traduzione binaria (in linguaggio macchina) di memoria Y LOAD Y, R1 ADD 2, R1 STORE R1, X Prima di tutto dobbiamo decidere quale è il vero indirizzo di X e Y 01101 11100 X 28 Esecuzione: linguaggio macchina 2 Codifica binaria di LOAD 01101, R1 ADD 2, R1 STORE R1, 11100 Ogni operazione si codifica secondo un formato stabilito da chi costruisce l’hw un formato semplificato è Codice operativo Modo 1 Op1 Modo 2 Op2 29 Esecuzione: linguaggio macchina 3 Vediamo i vari campi del formato : Codice operativo Modo1 Op1 Modo2 Op2 è la codifica dell’operazione da eseguire es: ADD LOAD STORE 0001 0110 0111 30 Esecuzione: linguaggio macchina 4 Vediamo i vari campi del formato : Codice operativo Modo1 Op1 Modo2 Op2 è 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 31 dell’operando Lo stesso vale per il secondo operando! 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 operativo 4bit Modo1 2bit Op1 Modo2 Op2 12bit 2bit 12bit 32 Esecuzione: linguaggio macchina 6 Problema ….. es : con 12 bit posso indirizzare ‘solo’ 212 parole di memoria centrale (RAM) ! Codice operativo 4bit Modo1 2bit Op1 Modo2 Op2 12bit 2bit 12bit 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…. 33 Esecuzione: linguaggio macchina 7 MODI 00 registro 01 memoria 10 immediato CODICI OPERATIVI ADD 0001 LOAD 0110 STORE 0111 Codifica binaria di LOAD 01101, R1 ADD 2, R1 STORE R1, 11100 Codice operativo 4bit Modo1 2bit Op1 Modo2 Op2 12bit 2bit 12bit 0110 01 01101 00 00001 load 0001 10 00010 01 00001 add 0111 00 00001 01 11100 store 34 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 35 Il processore: struttura base M e m o r i a c e n t r a l e PC Bus controllo Bus indirizzo Bus dati Operazione M A R Esegui IR Unità di controllo Registro/i coinvolti M D R R0 R1 R2 ... R16 ALU Registri generali clock Esito Processore 36 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 37 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 logicobooleano (+,-,and,or …) Clock: è un segnale periodico fatto di uni e zero che viene distribuito a tutti i circuiti sincroni del processore (vedi dopo) 38 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 39 Un esempio : ADD 2, R1 (fetch) 1 Indirizzo della istruzione memoria Bus controllo 40 000..01 Bus indirizzo Bus dati 40 M A R PC Esegui IR Parte controllo Registro/i coinvolti M D R R0 R1 R2 ... R16 codifica Operazione ALU Registri generali Esito Processore 40 Un esempio : ADD 2, R1 (fetch) 2 Indirizzo della istruzione memoria Leggi! 41 40 000..01 Operazione PC Esegui IR Parte controllo 40 Bus indirizzo Bus dati MAR M D R Registro/i coinvolti R0 R1 R2 ... R16 codifica ALU Registri generali Esito Processore 41 Un esempio : ADD 2, R1 (fetch) 3 memoria 41 40 000..01 Operazione PC Esegui IR Parte controllo 000110000100100001 Bus indirizzo MAR Bus dati MDR Registro/i coinvolti R0 R1 R2 ... R16 ALU Registri generali Esito Processore 42 Un esempio : ADD 2, R1 (dec) memoria 41 40 000..01 add PC Esegui IR Parte controllo 000110000100100001 Bus indirizzo MAR Bus dati MDR Registro/i coinvolti R0 R1 R2 ... R16 ALU Registri generali Esito Processore 43 Un esempio : ADD 2, R1 (exe) 1 memoria 41 40 000..01 add PC Esegui IR Parte controllo 000110000100100001 Bus indirizzo MAR Bus dati MDR Registro/i coinvolti 00010 R1 R2 ... R16 ALU Registri generali Esito Processore 44 Un esempio : ADD 2, R1 (exe) 2 memoria 41 40 000..01 add PC Esegui IR Parte controllo 000110000100100001 Bus indirizzo MAR Bus dati MDR Registro/i coinvolti 00010 34 R2 ... R16 ALU Registri generali Esito Processore 45 Un esempio : ADD 2, R1 (exe) 3 memoria 41 40 000..01 PC IR Parte controllo 000110000100100001 Bus indirizzo MAR Bus dati MDR Registro/i coinvolti 00010 36 R2 ... R16 ALU Registri generali Esito Processore 46 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 47