12Marzo_Meo

Transcript

12Marzo_Meo
 P M I/O Macchina di Von Neumann: E’ formata da tre unità chiamate processore, memoria e unità di ingresso/uscita. A queste si aggiunge un quarto componente chiamato bus (in figura rappresentato dalla linea) su cui si può scrivere o da cui si può leggere. -­‐Unità di ingresso/uscita: ha la capacità di realizzare dei codici trasformando i numeri, le lettere, i colori, gli odori, i movimenti in bit e viceversa. -­‐Memoria: possiamo immaginarla come un lungo nastro fatto da unità di memoria (in figura sono rappresentate da ciascuna riga), che chiamiamo parole di memoria (in figura l’esempio di una parola di memoria è “10100110”). Ogni parola di memoria è fatta da 8 bit (sono 8 per ragioni di natura tecnica e in figura ciascun bit è rappresentato da un quadratino). Ogni cella ha la capacità di un byte, che rappresenta quindi l’unità di memoria. Ogni byte, essendo formato da bit, al suo interno 0 1 0 1 0 0 1 1 0 può contenere 0 o 1: non possono esserci celle vuote. Ad ogni riga è 1 associato un numero, partendo da zero: questo è chiamato indirizzo della 2 cella di memoria e serve a identificare una precisa parola. Alla colonna 3 dell’indirizzo e a quella del dato (che servono al calcolatore), aggiungiamo 4 una terza colonna: quella del nome simbolico. Esso è rappresentato da 5 variabili e costanti che permettono di creare modelli matematici dei nostri problemi: ciò permette a noi di riferirci più facilmente ad una determinata cella di memoria. x y -­‐Bus: è costituito da tanti fili elettrici che conducono i segnali da una parte all’altra dei circuiti del computer. Ci sono tre gruppi di fili: bus indirizzi, bus dati, bus di controllo (contiene le operazioni W, write, e R, read). Ogni istruzione per leggere o scrivere nella memoria deve contenere indirizzo, dato e operazione da seguire. (ESEMPIO: Quando in processore vuole leggere dalla memoria la cella 0, scrive sul bus di controllo R, sul bus indirizzi 0 e lascia il bus dati libero perché è la memoria che deve riempire il bus dati con la risposta “10100110”. Viceversa, se il processore vuole scrivere qualcosa sulla memoria scrive sul bus di controllo W, sul bus di indirizzi l’indirizzo della cella e sul bus dati la parola di memoria che vuole scrivere.) Linguaggi di programmazione I problemi del mondo reale e le operazioni elementari di una macchina sono descritti da linguaggi di livello diverso. Esiste un gap (salto) tra potere espressivo del linguaggio di macchina e il potere espressivo del linguaggio naturale. I linguaggi di programmazione sono linguaggi di livello intermedio, basati su linguaggi di programmazione di livello più basso, che astraggono il livello hardware per consentire agli esseri umani di parlare in maniera comprensibile al computer, pur facendo essi una parte del lavoro per arrivare al livello macchina. I linguaggi di livello macchina sanno fare solo operazioni elementari e una per volta; perciò per avvicinare i linguaggi di macchina ai linguaggi umani si sono costruiti i linguaggi a basso livello, ad esempio quelli assemblativi che sono più potenti di quelli di macchina. Estendendo il concetto di linguaggi a basso livello si è passati a quelli di alto livello di cui fanno parte i linguaggi C, C++, Java, Fortran, Pascal ed altri. INFORMAL LANGUAGES FORMAL LANGUAGES NL (natural languages) HLL (high level languages) LLL (low level languages) ML (machine languages) Espressività +++ + -­‐ -­‐ -­‐ -­‐ Presenza di ambiguità sì no I formal languages sono facilmente comprensibili e non sono ambigui in quanto individuano una ben precisa operazione tra un certo numero di operazioni possibili; gli informal languages sono molto potenti nell’espressività ma sono ambigui in quanto c’è la dipendenza dal contesto. Tra i due tipi di linguaggi c’è quindi un salto concettuale e per passare da linguaggi informali a linguaggi formali occorre che il gap sia superato dall’uomo tramite la programmazione. Gli esseri umani si abbassano al livello della macchina esprimendo un problema del mondo reale in linguaggio di alto livello: è poi lasciato al computer il compito di tradurre questo linguaggio in linguaggi di livello più basso finché lo stesso computer lo scriverà nel linguaggio macchina. Il linguaggio C non è il linguaggio del computer perché quest’ultimo è fatto da 0 e 1. Per tradurre la istruzioni di linguaggio C in istruzioni fatte da 0 e 1 vengono utilizzati i traduttori, che sono di due tipi: compilatore o interprete. -­‐ Il linguaggio interpretato sottrae al computer un po’ della sua capacità perché, oltre ad eseguire l’operazione, deve prima tradurre il comando e poi tradurre il risultato. Questo linguaggio è efficace, facile da gestire e comprendere ma non è efficiente, perché comporta uno sforzo aggiuntivo che fa perdere tempo al processore. Esempi di linguaggi interpretati sono: BASIC, C#, PHP, JAVASCRIPT, JAVA*. -­‐ I compilatori introducono passi intermedi che però vanno eseguiti solo una volta perché dopo essere stato tradotto in linguaggio macchina, il programma non ha bisogno di ulteriori traduzioni. L’operazione intermedia si chiama compilazione. Quindi penso in linguaggio naturale, scrivo in linguaggio C, chiedo al computer di tradurre solo una volta il programma dal linguaggio C al linguaggio macchina: da quel momento non ha più bisogno dell’interprete perché è capito dal computer. Anziché usare più interpreti, ne uso uno solo che una volta per tutte traduca. Questa traduzione è massimamente efficiente poiché sfrutta la macchina al meglio della sua possibilità. E’ però meno flessibile: non si può cambiare un’istruzione altrimenti non è possibile eseguire il programma. Esempi di linguaggi compilati sono C, C++, FORTRAN, PASCAL, JAVA*. *JAVA sfrutta la tecnica della compilazione just-­‐in-­‐time: essa viene effettuata la prima volta che viene incontrata una certa istruzione; quindi è una soluzione di mezzo tra compilatore e interprete. Il linguaggio C che studieremo è quindi un linguaggio compilato L’ambiente di programmazione serve a scrivere i programmi nel compilatore. Le operazioni che faremo saranno le seguenti: prendiamo un problema, scriviamo l’algoritmo risolutivo in linguaggio C, lo compiliamo, lo linkiamo e avremo creato il file eseguibile, cioè le istruzioni in linguaggio macchina che il computer esegue per fare quello che gli abbiamo detto.