Appunti di informatica L'elaboratore elettronico COSA SI IMPARA IN QUESTA LEZIONE: Cosa studia l'informatica Cosa è un algoritmo Come è costituito un elaboratore Come l'elaboratore esegue un proramma Come l'elaboratore memorizza le informazioni Cosa studia l'informatica COSA NON È L'INFORMATICA – L'informatica non è lo studio dei calcolatori (i calcolatori sono solo degli apparecchi, strumenti usati in informatica) – L'informatica non è imparare a scrivere programmi (anche i programmi sono solo degli strumenti) – L'informatica non è saper usare i programmi (così come guidare la macchina non è ingegneria meccanica) L'informatica non è nessuna di queste cose (ma le comprende tutte). COSA È L'INFORMATICA L'informatica è una scienza (in inglese: computer science). L'informatica è la scienza che studia gli ALGORITMI e le loro: – proprietà formali (aspetti logico-matematici, teorici) – realizzazioni hardware, cioè elettroniche, cioè calcolatori – realizzazioni software, cioè i programmi – applicazioni pratiche: calcolo, organizzazione dati, comunicazione 1.1 Cosa è un algoritmo Un algoritmo è la soluzione formale a un problema. È una procedura che consta di un numero finito di passi. È il modo per risolvere un problema in maniera automatica. Un algoritmo è una cosa scritta con tanta pignoleria e puntigliosità che anche un calcolatore, per quanto stupido, è in grado di eseguirlo. ESEMPIO DI ALGORITMO Programmare un videoregistratore 1. Se la data o l'ora non sono esatte, vai a pagina 40 del manuale; esegui la procedura per impostare data e ora 2. Inserisci una cassetta vuota 3. Esegui da 4. a 7. tante volte quante sono le trasmissioni da registrare 4. Imposta il canale e premi il tasto CHAN 5. Imposta l'ora di inizio e premi il tasto START TIME 6. Imposta l'ora di fine e premi il tasto END TIME 7. Premi il tasto END PROG 8. Premi il tasto TIMER Possiamo notare diverse caratteristiche generali in questo semplice algoritmo. Prima di tutto, non sono tenuto a sapere che cosa succede quando seguo le istruzioni. L'algoritmo è la soluzione automatizzata di un problema. Notiamo inoltre che esistono tre tipi di successione temporale dei passi dell'algoritmo, ossia il flusso di esecuzione può procedere in tre modi: SEQUENZIALE. Dopo l'istruzione n viene eseguita l'istruzione n+1, in sequenza. Nell'esempio: l'istruzione 2. è una istruzione che provoca un flusso di esecuzione sequenziale (cioè non altera la sequenza naturale delle istruzioni). ITERATIVO o ciclico. Una sequenza di istruzioni viene ripetuta per un certo numero di volte. Nell'esempio: l'istruzione 3. è una istruzione che provoca un flusso di esecuzione iterativo (cioè altera la sequenza naturale delle istruzioni introducendo una ripetizione). CONDIZIONALE. L'istruzione n viene eseguita solo se si verifica una condizione determinata. Nell'esempio: l'istruzione 1. è una istruzione che provoca una esecuzione condizionale (cioè può alterare o non alterare la sequenza naturale delle istruzioni a seconda del verificarsi della condizione specificata). Possiamo infine vedere che questo algoritmo fa uso di un sottoprogramma. 1.2 Il sottoprogramma è un altro algoritmo (qui si trova a pagina 40 del manuale del videoregistratore). Di esso non conosciamo i dettagli. Di esso ci interessano solo gli effetti (ossia che, una volta richiamato il sottoprogramma, data e ora siano corrette). Queste sono le basi della programmazione. ESECUZIONE DI UN ALGORITMO Un algoritmo deve essere eseguito da un qualche agente. Per millenni, gli agenti che eseguivano gli algoritmi sono state le persone. Gli algoritmi erano realizzati come istruzioni verbali. Nel 1500, esistevano agenti meccanici in grado di eseguire algoritmi. Essi erano gli automi. Gli algoritmi erano allora realizzati come strutture meccaniche (p.es. il tamburo dentato del carillon). Tra la fine del 1800 e la prima metà del 1900 esistevano macchine elettromeccaniche per eseguire gli algoritmi. Gli algoritmi erano realizzati ancora come strutture meccaniche o anche codificati su nastri o schede perforate. Infine, dagli anni '40 del 1900, sono stati inventati agenti elettronici: l'elaboratore o calcolatore elettronico. Gli algoritmi sono realizzati come programmi. Un programma è un algoritmo realizzato e memorizzato in una forma che il calcolatore è in grado di leggere ed eseguire. Struttura dell'elaboratore Il termine elaboratore o calcolatore elettronico indica una vasta gamma di macchine, dai supercalcolatori per le analisi del Progetto Genoma o per le simulazioni meteorologiche, fino ai microprocessori incorporati negli apparecchi domestici (telefoni cellulari, televisori, lavatrici e frigoriferi). Ma noi ci riferiremo in particolare al calcolatore destinato all'uso generale, per applicazioni "da ufficio" o "da scrivania", il personal computer o PC. Un elaboratore (anche il PC più economico) è un apparato complesso, quindi è costituito da più parti o componenti. Alcuni componenti formano il nucleo centrale del calcolatore (il "cuore"). Essi sono detti componenti centrali. Nei calcolatori moderni, essi sono tutti ospitati su un'unica scheda di circuito stampato, detta la scheda madre (motherboard). La maggior parte di essi trova addirittura spazio all'interno di un unico circuito integrato, il microprocessore. 1.3 Questi componenti sono imprescindibili per il funzionamento del calcolatore. Altri componenti sono concettualmente esterni al nucleo centrale del calcolatore, e sono pertanto detti componenti periferici o le periferiche. Ovviamente, specie nel caso dei portatili, spesso una periferica è in realtà fisicamente incorporata in unico blocco nel calcolatore. I componenti periferici non sono in linea di principio indispensabili per il funzionamento dell'apparato. In realtà, molti di essi sono necessari per poter utilizzare il calcolatore (p.es. tastiera e schermo). COMPONENTI CENTRALI PRINCIPALI: Unità centrale di elaborazione/Central Processing Unit/CPU: esegue i programmi. È temporizzata da un segnale, detto clock, che imposta il ritmo di esecuzione delle operazioni ed è generato da un apposito circuito presente sulla scheda madre. (Quindi la scheda madre impone la frequenza di clock.) La CPU è il componente principale del microprocessore, che può contenere però anche parti ausiliarie: memorie temporanee, elaboratori di istruzioni matematiche o di elaborazione segnali, circuiti di controllo e accesso alla memoria RAM, ecc. Memoria primaria: detta RAM (random access memory, memoria ad accesso casuale) perchè ha la caratteristica che, richiedendo ad essa un dato scelto a caso, essa è in grado di fornirlo in un tempo costante. Questa proprietà non l'hanno, per esempio, i nastri magnetici, che vanno prima avvolti fino a raggiungere il punto desiderato. Quindi i nastri possono servire come memorie ad accesso sequenziale. La memoria primaria contiene i programmi in esecuzione e anche i dati su cui i programmi stanno lavorando. PERIFERICHE PRINCIPALI: Tastiera: dispositivo di ingresso (input) di caratteri alfanumerici e simboli. Schermo/monitor: dispositivo di uscita (output) grafico. Mouse: dispositivo di ingresso, usato per il puntamento. Scheda video: dispositivo di conversione, codifica l'uscita grafica destinata al monitor per renderla visualizzabile. Disco rigido/Disco fisso/Hard disk: dispositivo di ingresso/uscita, per memorizzare le informazioni in modo stabile ma reversibile (si possono cancellare e modificare). È inamovibile (il disco è fisicamente sigillato all'interno del lettore, il drive, e nemmeno l'aria può raggiungerlo). Data la sua velocità, è usato anche come estensione della memoria di lavoro. 1.4 Dischetto/Floppy disk: dispositivo di ingresso/uscita, per memorizzare le informazioni in modo stabile ma reversibile. È amovibile (posso sostituire un disco con un altro, semplicemente togliendolo dal drive). È notevolmente più lento di un hard disk. ALTRE PERIFERICHE: Stampante: dispositivo di uscita su carta. Lettore dischi ottici (CD-ROM, DVD-ROM): dispositivo di ingresso, analogo a floppy disk perché amovibile, ma più capace e non scrivibile. Masterizzatore dischi ottici: scrive (tipicamente in modo irreversibile) i dischi ottici. I dischi usati sono di un tipo apposito. In lettura è identico al lettore descritto sopra. Scheda di rete: dispositivo per trasmettere e ricevere dati su una rete locale. Normalmente accetta un cavo di collegamento, ma può essere anche wireless (senza fili, cioè radio). Altre connessioni wireless: per trasmettere e ricevere dati su collegamenti a breve raggio (10, max 100 metri) l’interfaccia Bluetooth (radio a bassa potenza). Per collegamenti a brevissimo raggio, a vista (max 1 metro) l’interfaccia Fast Infrared (FIR), a tecnologia a infrarossi come il telecomando della TV. Modem: dispositivo per il collegamento a una linea telefonica. In versione “analogica” (56 Kb/s), ADSL (centinaia di kbps ma prestazioni non garantite), ISDN (128 kbps con garanzie di prestazioni) Scheda audio: dispositivo per l'acquisizione, l'elaborazione e l'emissione di informazioni acustiche, memorizzate in forma digitale. Interfaccia universale USB (Universal Serial Bus): non è una periferica in sé, ma vi si possono collegare moltissimi dispositivi tradizionali come quelli elencati sopra (inclusi dischi rigidi esterni, masterizzatori CD esterni...) e anche oggetti di nuova concezione come memorie esterne di archiviazione dati. Interfaccia multimediale Firewire o IEEE 1394: non è una periferica in sé, ma è progettata per il collegamento di periferiche audiovideo (dispositivi musicali digitali, videocamere digitali...). 1.5 Architettura interna dell'elaboratore Architettura significa “come è costruito”. Un personal computer è costruito secondo lo schema seguente. PERIFERICHE PERIFERICHE PERIFERICHE Processore ALU REGISTRI MEMORIA PRIMARIA Unità di controllo BUS Ogni “blocchetto” di questo schema rappresenta un circuito elettronico con precise funzioni. I circuiti sono tutti collegati fra loro in modo da poter interagire. In particolare, possiamo dire che esistono: parti per l’elaborazione dei dati (processore) parti per la memorizzazione dei dati (memoria primaria; memorie secondarie e “di massa” poste su periferiche, p.es. disco rigido) parti per il trasferimento dei dati (all’interno: il bus; tra interno ed esterno: periferiche) Prima di vedere il funzionamento delle varie parti, consideriamo la rappresentazione dell'informazione all'interno dell'elaboratore. Rappresentazione dell'informazione Informazione = Significato, Contenuto L'elaboratore elettronico tratta informazione. L'elaboratore elettronico è in grado di agire solo su numeri con operazioni di tipo aritmetico: A = B + C logico: if A = 1 then ... Perciò tutte le informazioni sono codificate in forma numerica. 1.6 MEMORIZZAZIONE DEI DATI Dentro a un calcolatore, le informazioni sono costituite da unità elementari, dette parole o word. Ogni architettura di calcolatore (ogni "famiglia" di macchine) ha parole di una data dimensione, prefissata e stabilita quando il calcolatore viene progettato. Questa dimensione dipende dalla struttura dei circuiti di memorizzazione (memoria, registri), di trasferimento (bus) e di trattamento (CPU) delle informazioni. QUANTO È GRANDE UNA PAROLA? Le dimensioni delle parole si misurano in byte. Una parola può essere lunga da 1 a 4 o più byte. 4 byte è normale. 1 byte è costituito da 8 bit, cioè 8 cifre binarie (binary digit). (C'è stato un tempo in cui anche i bit in un byte potevano essere 6, 7, o 9, ...) RAPPRESENTAZIONE IN BASE 2 Una cifra binaria è un numero intero in base 2, ossia che va da 0 a 1. Cioè, in pratica, può solo valere o 0 oppure 1. Perchè base 2? Perchè 0 e 1 si possono rappresentare facilmente: con una luce accesa o spenta; con una crocetta fatta o non fatta; con un interruttore aperto o chiuso; con un circuito elettrico attivo o inattivo. La matematica ci dice che un numero espresso in base A con N cifre può rappresentare AN valori distinti. Un byte (numero binario a 8 cifre) può quindi può rappresentare numeri binari tra 0 e 28 – 1 = 255 (in informatica si conta sempre partendo da zero). Quella che segue è una tabella completa di corrispondenze tra numeri in base dieci (espressi con 3 cifre) e gli stessi in base due (a 8 cifre). La tabella prevede valori tra 0 e 127. Per avere i valori tra 128 e 255, che è il massimo ottenibile con 8 cifre binarie, occorre sommare 128 alla forma decimale. Nella forma binaria invece c'è un trucco molto comodo. Quello che cambia è solo la prima cifra (che qui è zero e tra 128 e 255 è invece uno). 1.7 Decimale Binario 000 00000000 001 00000001 002 00000010 003 00000011 004 00000100 005 00000101 006 00000110 007 00000111 008 00001000 009 00001001 010 00001010 011 00001011 012 00001100 013 00001101 014 00001110 015 00001111 016 00010000 017 00010001 018 00010010 019 00010011 020 00010100 021 00010101 022 00010110 023 00010111 024 00011000 025 00011001 026 00011010 027 00011011 028 00011100 029 00011101 030 00011110 031 00011111 Decimale Binario 032 00100000 033 00100001 034 00100010 035 00100011 036 00100100 037 00100101 038 00100110 039 00100111 040 00101000 041 00101001 042 00101010 043 00101011 044 00101100 045 00101101 046 00101110 047 00101111 048 00110000 049 00110001 050 00110010 051 00110011 052 00110100 053 00110101 054 00110110 055 00110111 056 00111000 057 00111001 058 00111010 059 00111011 060 00111100 061 00111101 062 00111110 063 00111111 Decimale Binario 064 01000000 065 01000001 066 01000010 067 01000011 068 01000100 069 01000101 070 01000110 071 01000111 072 01001000 073 01001001 074 01001010 075 01001011 076 01001100 077 01001101 078 01001110 079 01001111 080 01010000 081 01010001 082 01010010 083 01010011 084 01010100 085 01010101 086 01010110 087 01011111 088 01011000 089 01011001 090 01011010 091 01011011 092 01011100 093 01011101 094 01011110 095 01011111 Decimale Binario 096 01100000 097 01100001 098 01100010 099 01100011 100 01100100 101 01100101 102 01100110 103 01100111 104 01101000 105 01101001 106 01101010 107 01101011 108 01101100 109 01101101 110 01101110 111 01101111 112 01110000 113 01110001 114 01110010 115 01110011 116 01110100 117 01110101 118 01110110 119 01110111 120 01111000 121 01111001 122 01111010 123 01111011 124 01111100 125 01111101 126 01111110 127 01111111 PERCHÈ BYTE E PAROLE? La ragione per inventare il byte e tenerlo distinto dalla parola è che: la parola è l'unità di rappresentazione all'interno di una macchina il byte è l'unità di comunicazione tra macchine. Quindi le informazioni, finchè sono memorizzate dentro una macchina, sono organizzate in parole. Quando però devono essere scambiate si organizzano in byte, perchè non è detto che la macchina di origine e la macchina di destinazione usino la stessa organizzazione interna. Per esempio, una macchina potrebbe organizzare una parola nel modo seguente: parola byte 1 byte 2 byte 3 byte 4 1.8 mentre un'altra macchina potrebbe organizzarla come segue: parola byte 4 byte 3 byte 2 byte 1 (notare che l'ordine è diverso e quindi non si possono sovrapporre). Come si rappresenta l'informazione CODIFICA Per ogni tipo di informazione, esiste un codice. Un codice è una legge che fa corrispondere a una determinata informazione un determinato simbolo o una sequenza di simboli. Questi simboli sono rappresentati nell’elaboratore come numeri in base 2. Quando ho un numero o una sequenza di numeri in base 2, se mi viene detto qual è il codice di cui esso rappresenta un simbolo, allora posso recuperare ed utilizzare l’informazione originale. Quindi per usare un’informazione memorizzata in forma digitale devo avere 2 cose: • L’elenco dei simboli che la rappresentano • Le regole di codifica (il “codice” usato) TIPI DI INFORMAZIONI L'elaboratore, al suo livello più basso (diciamo quasi al livello elettrico), tratta essenzialmente i seguenti tipi di dati: – Informazione testuale: testo – Informazione numerica: valori numerici interi/reali Esso ovviamente può trattare un gran numero di tipologie di informazioni, ma questi sono i tipi di base, con cui vengono espressi gli altri tipi di informazione. Cominciamo dal testo che è più semplice. INFORMAZIONI TESTUALI Il byte è stato inventato come un gruppo di bit sufficienti a rappresentare un carattere. I caratteri dell'alfabeto inglese sono 26, quindi come minimo un byte deve consentire 26 codici distinti. Per fare questo non basterebbe un byte di 4 bit (24 = 16), ma uno di 5 bit basterebbe (25 = 32 > 26) 1.9 In realtà, rappresentare solo i caratteri dell'alfabeto è limitativo. Vorrei poter rappresentare anche le cifre. Vorrei poter rappresentare anche la punteggiatura. Vorrei poter rappresentare anche qualche simbolo (p.es. aritmetici). Vorrei poter aggiungere "caratteri" speciali che marchino p.es. la fine di una riga, l'inizio e la fine di una trasmissione, e svolgano altre funzioni di controllo. Vorrei anche il lusso di distinguere le 26 lettere in maiuscolo dalle stesse 26 lettere in minuscolo. Una specie di "alfabeto esteso" di questo tipo è il codice ASCII American Standard Code for Information Interchange. Il codice ASCII è una convenzione per trasferire dell'informazione fra architetture di calcolatori differenti. (Vedi esempio sopra.) Nel seguito è presentata la tabella ASCII completa. I codici sono 127 in modo da poter essere usati con vecchi byte di 7 bit. I primi 32 codici si riferiscono a "caratteri" non stampabili ma usati per il controllo della trasmissione (i "caratteri di controllo"). Il loro nome è riportato nella tabella, e una breve spiegazione è riportata in coda alla tabella. Si può notare che, oltre al codice in base 10, sono riportati i codici in base 8 (ottale/octal, "oct") e 16 (esadecimale/hexadecimal, "hex"). Il motivo per usare queste basi è che: in base 16, ogni cifra corrisponde esattamente a un gruppo di 4 cifre binarie (in base 16 le cifre sono: 0 1 2 3 4 5 6 7 8 9 A B C D E F ) in base 8, ogni cifra corrisponde esattamente a un gruppo di 3 cifre binarie La conversione tra la base 2 e le basi potenze di 2 (4, 8, 16...) è quindi velocissima, perché si può fare per gruppi di cifre, anziché solo per valore totale. Inoltre, se un byte è di 8 bit e uso la base 16, mi servono solo 2 cifre per rappresentare qualunque valore, quindi la scrittura è molto più compatta. BASE 2 B7 B6 B5 B4 B3 B2 B1 B0 ----------- ----------- BASE 16 H1 H0 Esempio: BASE 10 BASE 2 BASE 16 71 0 1 0 0 0 1 1 1 ---------- ---------- 4 7 1.10 ASCII TABLE ----------Dec Hex Oct Char Dec Hex Oct Char Dec Hex Oct Char Dec Hex Oct Char ----------------------------------------------------------------------0 00 000 NUL 32 20 040 SPace 64 40 100 @ 96 60 140 ` 1 01 001 SOH 33 21 041 ! 65 41 101 A 97 61 141 a 2 02 002 STX 34 22 042 " 66 42 102 B 98 62 142 b 3 03 003 ETX 35 23 043 # 67 43 103 C 99 63 143 c 4 04 004 EOT 36 24 044 $ 68 44 104 D 100 64 144 d 5 05 005 ENQ 37 25 045 % 69 45 105 E 101 65 145 e 6 06 006 ACK 38 26 046 & 70 46 106 F 102 66 146 f 7 07 007 BEL 39 27 047 ' 71 47 107 G 103 67 147 g 8 9 10 11 12 13 14 15 08 09 0A 0B 0C 0D 0E 0F 010 011 012 013 014 015 016 017 BS HT LF VT FF CR SO SI 40 41 42 43 44 45 46 47 28 29 2A 2B 2C 2D 2E 2F 050 051 052 053 054 055 056 057 ( ) * + , . / 72 73 74 75 76 77 78 79 48 49 4A 4B 4C 4D 4E 4F 110 111 112 113 114 115 116 117 H I J K L M N O 104 105 106 107 108 109 110 111 68 69 6A 6B 6C 6D 6E 6F 150 151 152 153 154 155 156 157 h i j k l m n o 16 17 18 19 20 21 22 23 10 11 12 13 14 15 16 17 020 021 022 023 024 025 026 027 DLE DC1 DC2 DC3 DC4 NAK SYN ETB 48 49 50 51 52 53 54 55 30 31 32 33 34 35 36 37 060 061 062 063 064 065 066 067 0 1 2 3 4 5 6 7 80 81 82 83 84 85 86 87 50 51 52 53 54 55 56 57 120 121 122 123 124 125 126 127 P Q R S T U V W 112 113 114 115 116 117 118 119 70 71 72 73 74 75 76 77 160 161 162 163 164 165 166 167 p q r s t u v w 24 25 26 27 28 29 30 31 18 19 1A 1B 1C 1D 1E 1F 030 031 032 033 034 035 036 037 CAN EM SUB ESC FS GS RS US 56 57 58 59 60 61 62 63 38 39 3A 3B 3C 3D 3E 3F 070 071 072 073 074 075 076 077 8 9 : ; < = > ? 88 89 90 91 92 93 94 95 58 59 5A 5B 5C 5D 5E 5F 130 131 132 133 134 135 136 137 X Y Z [ \ ] ^ _ 120 121 122 123 124 125 126 127 78 79 7A 7B 7C 7D 7E 7F 170 171 172 173 174 175 176 177 x y z { | } ~ DEL ASCII CONTROL CHARACTER ABBREVIATIONS ------------------------------------NUL STX EOT ACK null start of text end of transmission acknowledge SOH ETX ENQ BEL start of heading end of text enquiry bell BS LF FF SO backspace linefeed form feed shift out HT VT CR SI horizontal tabulation vertical tabulation carriage return shift in DLE DC2 DC4 SYN data link escape device control 2 device control 4 synchronous idle DC1 DC3 NAK ETB device control 1 device control 3 negative acknowledge end of transmission block CAN SUB FS RS DEL cancel substitute file separator record separator delete EM end of medium ESC escape GS group separator US unit separator ETB end of transmission block Questa tabella di codici è un po' antiquata, ma ancora usatissima come "minimo comune denominatore" fra architetture differenti. Per rappresentare un testo, è sufficiente usare una sequenza di byte in cui ogni byte contiene un numero, il codice ASCII di un carattere. Sapendo che si tratta di un testo, possiamo decodificarlo usando la tabella ASCII. Esempio con codici in base 10 (prima colonna della tabella): 67 105 97 111 44 C i a o , 32 109 111 110 100 111 m o n d 1.11 o NUMERI INTERI Abbiamo visto come le parole possono contenere codici di caratteri. Ovviamente una parola di calcolatore può essere interpretata, secondo necessità, come semplice valore numerico intero. Se una parola è di 32 bit, i valori numerici rappresentabili possono essere 0 .. 232 – 1 = 4.294.967.295 (quattromiliardierotti). Questo però implica solo valori positivi. Se introduco anche il segno +/– , dovrò scegliere una convenzione per rappresentare i numeri negativi. Il risultato finale è che di questi quattromiliardi di valori, duemiliardi saranno positivi e duemiliardi negativi. NUMERI REALI Potrei anche desiderare di fare dei calcoli su numeri reali. Per rappresentare i numeri reali si usa la forma esponenziale. Dei bit che compongono la parola, alcuni vengono interpretati come mantissa, altri come esponente, Mantissa ed esponente sono valori interi con i loro segni, e vengono interpretati come segue: PAROLA Mantissa segno valore segno bit 31 bit 30 bit 29 ... bit 21 bit 20 (L'esempio è con una parola a 4 byte, ossia 32 bit) Esponente valore bit 19 bit 18 ... Valore = Mantissa Base Esponente La base è una costante (qui ovviamente vale 2) Occorre memorizzare Mantissa ed Esponente. Se la mantissa è positiva o negativa, il valore è rispettivamente positivo o negativo. Se l'esponente è positivo o negativo, il valore è rispettivamente maggiore o minore di 1. Quindi gli esponenti negativi caratterizzano i valori frazionari. In questa forma è possibile rappresentare numeri in un intervallo molto più esteso che non con la forma intera. L'altro lato della medaglia è che i dati estremi (molto grandi e molto piccoli) non si possono rappresentare con la stessa precisione di quelli intermedi. Posso scegliere tra precisione ed estensione, ma non posso pretendere entrambe. L'unica via per aumentare la precisione rispetto all'esempio è usare rappresentazioni più estese: 1.12 bit 0 1. rappresentazione in doppia precisione: usa due parole, quindi un totale di 64 bit 2. rappresentazione in doppia precisione lunga: usa 80 bit Come l'elaboratore esegue un programma L’elaboratore dispone di vari programmi, che normalmente sono archiviati su disco rigido (hard disk). Questa è la memoria secondaria. Quando occorre eseguire un programma, esso viene trasferito in memoria primaria (la RAM). Una volta in memoria primaria, il programma può essere eseguito istruzione per istruzione. Un programma, poi, agisce su determinati dati. Anche questi dati devono essere in memoria primaria. Andranno poi a finire su memoria secondaria (p.es. sul disco rigido; p.es. su una memoria esterna USB) una volta terminato il lavoro. Vediamo ora il funzionamento delle parti illustrate nel diagramma già visto, che replichiamo qui: bus, memoria, processore e periferiche. PERIFERICHE PERIFERICHE PERIFERICHE Processore ALU REGISTRI MEMORIA PRIMARIA Unità di controllo BUS IL BUS Il bus è un circuito di collegamento, che si occupa: 1) di fare in modo che ciascun circuito possa collegarsi a tutti gli altri per trasferire dati 2) di controllare che due circuiti non cerchino di trasferire dati contemporaneamente. Il nome deriva proprio dalla sua funzione di trasporto pubblico. 1.13 Possiamo pensare il bus come se fosse diviso in “corsie”: ciascuna cosria trasporta informazioni di un determinato tipo. dati indirizzi linee di controllo (comandi vari) LA MEMORIA PRIMARIA (RAM) La memoria è un circuito elettrico. Dal punto di vista logico, ossia per il programma, essa è una sequenza di parole. Ogni parola ha una sua lunghezza (p.es. 32 bit = 4 byte). Ogni parola ha anche una sua posizione. C'è una parola nella posizione 0, una parola nella posizione 1, una parola nella posizione 2, una parola nella posizione 3... Il numero che indica la posizione della parola si chiama il suo indirizzo. Quando sul bus dati compare, poniamo, l'indirizzo 12, la memoria sa che deve accedere alla tredicesima parola (N.B.: SI CONTA DA ZERO). Accedere per farne che cosa? La memoria sarà in grado di ricevere un comando che dice se quella parola va letta oppure scritta. Perchè dobbiamo ricordarci che stiamo parlando della memoria di lavoro, in cui occorre scrivere i programmi da eseguire e i dati, perchè successivamente il processore li possa leggere ed eventualmente nuovamente scrivere una volta modificati. Scrittura della memoria: sul bus compare un dato (nella “corsia” riservata ai dati). Poi sul bus compare un indirizzo (nella “corsia” riservata agli indirizzi). Infine sul bus compare il comando di scrittura memoria (sempre in una apposita “corsia”). A questo punto, la memoria legge il dato e lo memorizza nella posizione richiesta. Lettura della memoria: sul bus compare un indirizzo (nella “corsia” riservata agli indirizzi). Poi sul bus compare il comando di lettura memoria (in apposita “corsia”). A questo punto, la memoria prende il dato dalla posizione richiesta e lo mette sul bus (sempre nella corsia apposita) perchè chi lo ha richiesto possa leggerlo. 1.14 LE PERIFERICHE Le periferiche sono dispositivi esterni, di cui abbiamo già visto un elenco. Si tratta degli oggetti che consentono la comunicazione con il mondo esterno (con le persone, con altre macchine, con la rete telefonica...). Possono avere funzione di ingresso (input): il mondo esterno introduce informazione nel calcolatore. Esempi: la tastiera, il mouse. Oppure possono avere funzione di uscita (output): il calcolatore emette informazione nel mondo esterno. Esempio: la stampante, il monitor. Oppure ancora possono avere entrambe le funzioni (input/output o I/O). Esempio: la scheda di rete, il modem. Una periferica normalmente si collega a una porta. Una porta è (come il nome lascia intendere) un oggetto che consente l'ingresso o l'uscita di informazioni. Esistono vari tipi di porte. In generale ogni tipo di porta può essere usato per più di un tipo di periferica. Ma qualcuna è più generale di altre. Per esempio: • Le porte VGA si usano quasi solo per monitor video. • Le porte PS/2 si usano solo per mouse e tastiere. • Le porte “parallele” o “stampante” o “Centronics” si usano quasi solo per le stampanti. Tendono comunque a essere sostituite dalle porte USB. • Le porte Firewire si usano per qualunque dispositivo ad alta velocità (audio/video, ma anche scanner, masterizzatori DVD...) • Le porte USB si usano per quasi qualunque tipo di periferica (mouse, tastiera, modem, scanner, dischi esterni, interfacce Bluetooth, periferiche di memorizzazione...) Una porta è formata da: 1. un connettore: una presa elettrica dove si attacca fisicamente un cavo o un apparecchio periferico. Esempio (schematico, visto di fronte): (altri esempi si possono avere guardando sotto un telefono cellulare). Ogni connettore ha una forma diversa da quelli di altri tipi di porte, per evitare di fare collegamenti non permessi. Di conseguenza un tipo di porta si può facilmente identificare guardando la forma del connettore. 2. un'interfaccia: alcuni circuiti elettronici che si occupano di consentire la trasmissione dell'informazione verso l'esterno (nel caso di output) o l'interno (nel caso di input). Per esempio, amplificatori che danno potenza al segnale elettrico, per consentirgli di viaggiare su cavi lunghi qualche metro. Altro esempio: circuiti che ricevono le parole “tutte in una volta” 1.15 (si dice: in parallelo) e le ritrasmettono “un bit alla volta in sequenza” (si dice: in serie). 3. una memorietta piccola, che contiene una sola parola. Una memoria simile si chiama un registro. In questo registro si posteggia il dato in ingresso, in attesa che il calcolatore trovi un momento libero per trasferirlo in memoria primaria, oppure il dato in uscita, in attesa che la periferica se lo legga. 4. eventualmente, una memoria un po’ più estesa per parcheggiare più di una parola per un tempo un po’ più lungo. Questa memoria si chiama un buffer. Ma siccome le prestazioni degli elaboratori sono sempre più elevate, spesso il buffer non si fa presso la porta ma direttamente occupando uno spazio in memoria primaria (RAM), senza perdere in efficienza. IL PROCESSORE Il processore è quello che esegue i programmi. È un circuito elettronico molto complesso e quindi, al suo interno, si possono distinguere varie parti: 1. L'unità aritmetico-logica o ALU (arithmetic-logical unit). Essa esegue le istruzioni, che sono di tipo aritmetico (A + B) o logico (IF A = B). 2. L'unità di controllo. Essa prende le istruzioni e i dati dalla memoria, comanda la ALU perchè esegua le istruzioni, scrive i risultati in memoria, e comanda il flusso di esecuzione (vedi spiegazione sugli algoritmi). 3. Alcuni registri. Nei registri vengono temporaneamente posteggiati i dati che la ALU deve elaborare e vengono anche scritti i risultati. Se l'elaboratore fosse il mio ufficio, la memoria primaria sarebbe la scrivania su cui appoggio tutti i documenti che mi servono per il lavoro. Invece i registri sarebbero quei due o tre fogli su cui sto lavorando effettivamente in un dato momento. Un registro molto usato (che spesso – come nell'esempio che segue – è addirittura sottinteso nelle istruzioni) si chiama accumulatore. Per capire cosa succede all'interno dell'elaboratore proviamo a immedesimarci nel processore mentre esegue un pezzetto di programma, e a far finta di non essere in grado di pensare. La memoria primaria contiene questo programma (ogni istruzione è indicata con accanto l'indirizzo a cui si trova): Indirizzo Contenuto cella 12 LOAD 2 13 ADD 1 14 STORE 100 (...omissis) 100 0 Spiegazione in linguaggio umano: l'istruzione all'indirizzo 12 carica nell'elaboratore il numero “2”; l'istruzione all'indirizzo 13 gli somma il 1.16 numero “1”; l'istruzione all'indirizzo 14 scrive il risultato dentro la cella di memoria all'indirizzo 100. Quello che c'è tra l'indirizzo 14 e l'indirizzo 100 non mi interessa e lo ho omesso. In pratica vogliamo fare 2+1. Vediamo passo passo cosa succede. Tra i registri del processore, ce n'è uno che si chiama PROGRAM COUNTER, contatore di programma. Esso ha una funzione speciale. Esso contiene l'indirizzo della prossima istruzione da eseguire. All'inizio dell'esempio, quindi, esso conterrà l'indirizzo 12. L'unità di controllo legge il program counter e sa che deve prendere l'istruzione contenuta all'indirizzo 12. Quindi l'istruzione all'indirizzo 12 viene letta dalla memoria primaria e messa in un altro apposito registro. A questo punto l'unità di controllo interpreta l'istruzione, comandando alla ALU di eseguirla. (Questa istruzione sarà ovviamente una parola, cioè un numero in base 2. Però l'unità di controllo sa che questo numero è una istruzione di programma, e quindi lo interpreta correttamente. Per esempio, se l'istruzione LOAD 2 fosse codificata come 01110000, potrebbe essere interpretata anche come il numero decimale 112, oppure come il carattere ASCII numero 112, cioè una p minuscola. Invece l'unità di controllo sa che si tratta di una istruzione e come tale va considerata.) La ALU, l'unità di controllo, e tutto il resto sono circuiti elettronici. Quindi, quando diciamo “comandare”, intendiamo qualcosa di simile ad manovrare gli interruttori di una stanza per decidere quali luci vanno accese e quali spente; oppure a premere i pedali di un'auto per stabilire se aumentare, diminuire o mantenere la velocità. L'istruzione LOAD 2 viene eseguita (e il suo effetto è di mettere il valore 2 in un registro, di solito l'accumulatore). L'accumulatore contiene quindi, in questo momento, il valore 2. A questo punto il program counter viene incrementato: 12 + 1 → 13. Con un meccanismo simile a prima, viene caricata ed eseguita l'istruzione SUM 1: viene sommato 1 al valore dell'accumulatore, e il risultato rimesso nell'accumulatore. A questo punto l'accumulatore contiene il valore 3. Ulteriore incremento del program counter: 14 + 1 → 14. L'istruzione all'indirizzo 14 dice di scrivere in memoria all'indirizzo 100. (Scrivere che cosa? Sottinteso: il contenuto dell'accumulatore.) Dopo che questa istruzione è stata eseguita, in modo analogo alle altre, in memoria primaria ci sarà il risultato dell'elaborazione (cioè il valore 3) e si troverà all'indirizzo 100. 1.17