fondamenti.pdf
Document Details
Uploaded by RoomierLosAngeles
Tags
Full Transcript
Andrea Giachetti, Fabio Bettio Fondamenti di informatica 2 Fondamenti di Informatica © 2003-2008 Andrea Giachetti e Fabio Bettio Quest’opera è pubblicata con la licenza Creative Commons 2.5 Attribuzione-N...
Andrea Giachetti, Fabio Bettio Fondamenti di informatica 2 Fondamenti di Informatica © 2003-2008 Andrea Giachetti e Fabio Bettio Quest’opera è pubblicata con la licenza Creative Commons 2.5 Attribuzione-NonCommerciale-StessaLicenza. Per visionare una copia di questa licenza visita http://creativecommons.org Fanno eccezione le immagini non originali di cui sia eventualmente citata la fonte. 3 Indice Introduzione...........................................................................................................................4 1.Che cos'è un “computer”?...................................................................................................7 1.1 Architettura del calcolatore.......................................................................................7 1.2 La CPU.....................................................................................................................8 1.3 La memoria.............................................................................................................11 1.4 Gestione dell’Input/output.......................................................................................14 1.5 Dal modello al PC fisico..........................................................................................14 1.6 I dispositivi periferici................................................................................................15 1.7 Bus e schede di espansione...................................................................................16 1.8 Porte di collegamento.............................................................................................17 1.9 Alcuni dispositivi periferici.......................................................................................18 1.10 Storia del calcolatore............................................................................................23 2Calcolo automatico, algoritmi, programmi.........................................................................26 2.1 Algoritmi e programmi.............................................................................................26 2.2 Analisi ed implementazione degli algoritmi............................................................28 3Codifica dell'informazione..................................................................................................30 3.1 Codifica dei caratteri alfabetici................................................................................31 3.2 Sistemi numerici.....................................................................................................31 3.3 Altri tipi di informazione...........................................................................................34 4Sistemi operativi e applicazioni software...........................................................................38 4.1 Il software di sistema..............................................................................................39 4.2 Stratificazione dei linguaggi....................................................................................39 4.3 Moduli del sistema operativo..................................................................................40 4.4 Gestione dei processi.............................................................................................41 4.5 Gestione della memoria..........................................................................................44 4.6 Gestione dei file......................................................................................................47 4.7 Gestione delle periferiche.......................................................................................48 4.8 Interfacce utente.....................................................................................................49 4.9 Classificazione dei sistemi operativi e sistemi operativi in commercio..................50 4.10 BIOS.....................................................................................................................51 4.11 Programmi applicativi...........................................................................................51 4.12 Il software “libero”.................................................................................................54 4.13 Il software “maligno” o malware...........................................................................55 5Le reti di calcolatori............................................................................................................57 5.1 Motivazioni, vantaggi e svantaggi delle reti............................................................57 5.2 Mezzi trasmissivi.....................................................................................................58 5.3 Classificazioni delle reti..........................................................................................61 5.4 Protocolli di comunicazione....................................................................................63 5.5 Il modello ISO/OSI..................................................................................................66 6Internet..............................................................................................................................69 6.1 Connettersi ad Internet...........................................................................................69 6.2 Servizi di internet....................................................................................................70 7Glossario............................................................................................................................81 4 Fondamenti di Informatica Introduzione L'utilizzo del calcolatore nelle sue forme moderne, personal computer, portatili, palmari, ecc e l'accesso alle reti con la possibilità di comunicare ed accedere a materiale di ogni tipo sta rivoluzionando diversi aspetti della nostra vita ed il suo effetto non può essere ignorato da chiunque lavori nel mondo della comunicazione, dell'educazione, e di ogni disciplina legata al trattamento dell'informazione. Eppure, nonostante l'ormai ampia diffusione dei mezzi e la notevole eco che hanno sulla stampa gli argomenti legati al mondo digitale, la cultura di base relativamente all'informatica di base ed al funzionamento e le potenzialità delle tecnologie è decisamente scarsa. Facciamo un semplice esempio: chi non ha mai sentito parlare di bit e byte, multimedialità, tecnologie client-server? Quasi nessuno. E molti, se venisse loro chiesto se sanno o non sanno di cosa si stia parlando, risponderebbero certamente di sì. Solo che, posta la domanda ad un campione di studenti universitari e registrate le risposte, si scopre che la stragrande maggioranza di essi ha idee errate su cosa questi termini di uso comune significhino. Le ragioni di questo analfabetismo e della diffusione di informazioni approssimative ed errate possono essere cercate da una parte in una purtroppo dilagante cultura antiscientifica con la pretesa esistenza di una barriera tra cultura umanistica e scienza e tecnlogia, dall'altra al modo decisamente approssimativo e sensazionalistico con cui si parla sui media più diffusi, di ciò che riguarda le tecnologie, privilegiando il fenomeno di costume, la moda (il blog, Second Life) o le paure (virus, pedofilia) all'informazione competente ed obiettiva. Ma una parte della responsabilità va anche attribuita a noi “addetti ai lavori”. Un primo, fondamentale passo per la divulgazione di una qualsiasi disciplina consiste infatti nel chiarire il contesto e il significato di ciò di cui stiamo parlando e dare chiare ed esaurienti definizioni dei termini utilizzati. Quando tentiamo di fornire adeguate conoscenze informatiche di base a “non addetti ai lavori” che devono fare ampio uso di calcolatori e programmi per la loro attività, spesso dimentichiamo questa regola di base e diamo per scontato che chi ascolta abbia chiaro di cosa stiamo parlando solo perché magari è un termine di uso comune. Un altro problema su cui poi, non ci si sofferma abbastanza, è quello di cercare di far capire in che cosa effettivamente consista avere una “cultura” informatica di base, dato che non solo tra la gente comune, ma anche all'interno dei corsi di laurea non specialistici, non si riesce neppure a far capire neppure cosa studino gli informatici e cosa si dovrebbe imparare in un corso base di informatica. Lo scopo di un buon corso base di informatica non è quello di insegnare a utilizzare in dettaglio determinati programmi, magari commerciali, con vari trucchi e trucchetti (quella che gli anglosassoni chiamano Computer/Information Literacy), ma a capire le tecnologie Introduzione 5 ed i meccanismi che stanno alla base dei sistemi di elaborazione in modo da essere in grado di capire le tendenze di mercato, scegliere i prodotti utili, ideare o progettare nuove applicazioni nel proprio campo (Computer/Information Fluency). Per fare un semplice parallelo, se vogliamo sfruttare al meglio quello che l'automobile può offrirci non è necessario che studiamo nel dettaglio la fisica del motore a scoppio (l'informatica teorica per il calcolatore), ma non è neppure necessario ed è anzi controproducente che impariamo nel dettaglio il manuale di istruzioni della Fiat Punto (l'equivalente di un particolare programma per il calcolatore, per esempio Microsoft Word). Dovremo, invece, avere una sufficiente infarinatura tecnica sul funzionamento dell'automobile e conoscerne le varie tipologie, l'evoluzione del mercato, degli accessori, e tutte quelle nozioni che ci servono a scegliere il modello adeguato ai nostri bisogni ed ad utilizzarlo nel modo più efficiente. E' invece frustrante vedere che addirittura a livello universitario si confonda ancora lo studio dell'informatica con l'uso di alcune applicazioni per il personal computer e si pensi che un corso di informatica tenuto da informatici dovrebbe insegnare ad usare dei programmi. Nulla di più lontano dalla realtà. L'uso di un determinato programma non richiede competenze informatiche e può benissimo essere lasciato alla lettura del manuale od a tutorial tenuti da utenti dello stesso genere (insegnanti, scrittori, contabili, grafici, a seconda del programma di cui si parla). L'informatica e gli informatici si occupano, in effetti, di altro. L'”informatica”, più che una semplice disciplina, è un insieme di discipline che hanno a che fare con: L’informazione e la sua elaborazione Il linguaggio e le sue proprietà L’architettura e il funzionamento delle macchine calcolatrici Le tecniche per elaborare l’informazione con tali macchine I sistemi operativi che rendono utilizzabili le macchine Le applicazioni pratiche dei calcolatori I sistemi che collegano tra loro più calcolatori Il concetto di “informazione” è qui inteso in senso molto generico: l’informatica si occupa di elaborazione di dati eterogenei, come testi, dati numerici, immagini, suoni. Anche i concetti di rappresentazione ed elaborazione sono altrettanto ampi: l’informatica si occupa di rappresentazione grafica, meccanica, sonora, trasformazione tra diversi formati, trasmissione di dati a distanza, eccetera. L’unico punto fisso è che tutte le forme di informazione, per essere elaborate dal calcolatore, devono essere “codificate” in segnali binari, sequenze di 0 e 1 o valori alti e bassi di tensione su cui il microprocessore (l'unità di calcolo della nostra macchina) è in grado di operare. Utilizzando i sistemi a semiconduttore per l’elaborazione di dati binari sono state costruite macchine capaci non solo di fare operazioni aritmetiche ripetitive (il solo compito dei primi calcolatori elettronici), ma anche in grado di affiancarci in numerosissime attività lavorative o ricreative (dalla scrittura, al gioco, dall’educazione alla simulazione). Tutto questo è stato reso possibile dall'evoluzione di tutte le branche dell’informatica, e si può quindi facilmente comprendere come questa sia diventata una disciplina sempre più varia, complessa ed affascinante. Certo, non è utile né richiesto (anche se non certo dannoso) che un insegnante, un contabile o un geometra conoscano i problemi dell'algoritmica, della programmazione o dei protocolli di rete, ma la conoscenza dei fondamenti tecnologici degli strumenti che usano sarebbe per loro indubbiamente di grande utilità. Per questo motivo cercheremo di riassumere nelle dispense quel minimo di informazioni sulle tecnologie informatiche che 6 Fondamenti di Informatica possono meglio far capire come fanno a funzionare le comuni applicazioni per PC. Nei capitoli seguenti faremo quindi una panoramica sulle varie problematiche legate all’elaborazione automatica dell’informazione, vedremo la struttura ed il funzionamento di un comune personal computer, come siano fatti i programmi che lo gestiscono e come i calcolatori possano essere connessi in rete e comunicare tra loro. In dettaglio, nel capitolo 1 vedremo che cos'è esattamente un computer e ne vedremo brevemente l'evoluzione storica, nel capitolo 2 verranno introdotti i concetti di calcolo automatico ed algoritmi, nel capitolo 3 si descrive come l’informazione di nostro interesse sia trasformata in dati elaborabili dal calcolatore (codifica). Nel capitolo 4 passeremo quindi ad analizzare il software di sistema (il “sistema operativo” dei computer) e l'utilizzo moderno delle macchine di calcolo. Nel capitolo 5 si parlerà delle reti di calcolatori. Il capitolo 6 è infine dedicato al mondo di Internet e dei suoi servizi. Che cos'è un “computer”? 7 1.Che cos'è un “computer”? Può essere difficile da comprendere per chi al giorno d'oggi usa un PC per scrivere, giocare o guardare un film, a chi aggiorna l'agenda sul cellulare, viaggia col navigatore satellitare o usa l'iPod, ma, in realtà, tutte queste macchine elettroniche discendono direttamente da quei “cervelli elettronici” grossi come armadi, che cominciarono a comparire nel dopoguerra e che elaboravano dati numerici introdotti in genere su schede perforate facendo una serie di calcoli preordinati. Ma svolgere in sequenza una serie di calcoli aritmetici o logici su dati digitali (cioè codificati come numeri binari e fisicamente consistenti in livelli alti o bassi di tensione) è sostanzialmente la stessa cosa che fanno, senza che ce ne rendiamo conto, tutte le apparecchiature basate su microprocessori che utilizziamo quotidianamente per le più disparate attività. E l'architettura dei moderni computer non si discosta sostanzialmente da quella di quegli armadi che vediamo nei vecchi telefilm di fantascienza. 1.1 Architettura del calcolatore I calcolatori elettronici sono macchine che eseguono ripetutamente operazioni programmate su dati digitali, sfruttando l'elettronica dei transistor. In tutti i tipi di calcolatore elettronico, abbiamo sempre una (od eventualmente più di una) unità di calcolo (CPU, Central Processing Unit), una memoria centrale che possiamo pensare come un enorme casellario che contiene i numeri binari da elaborare dove la CPU preleva e scrive dati, e dispositivi che permettano all'utente di inserire dati e leggere risultati. Lo schema logico (Figura 1) prende il nome di architettura di Von Neumann, dal nome dello scienziato ungherese che introdusse, appunto, nei calcolatori del dopoguerra l'idea del computer a “programma memorizzato”. Vedremo tra poco un piccolo riepilogo dell'evoluzione storica dei calcolatori elettronici. Figura 1: Architettura di Von Neumann La peculiarità di questo schema sta, come accennato, nell'utilizzo di una sola memoria per contenere sia i dati da elaborare sia i programmi per elaborarli (cioè la lista di operazioni che cogliamo fare eseguire alla CPU in successione). Questo schema venne applicato per 8 Fondamenti di Informatica la prima volta nel computer EDVAC del 1950, e successivamente universalmente adottato. Ed è sostanzialmente lo stesso utilizzato nei moderni calcolatori, salvo il fatto che, in genere, la comunicazione tra le parti (CPU, memoria, periferiche di I/O) avviene attraverso dei canali condivisi che prendono il nome di bus di comunicazione (Figura 2). L'attività del computer consiste quindi, una volta caricato in memoria un programma, nel Figura 2: Architettura a bus di comunicazione trasferimento alla CPU dei suoi singoli passi, nella loro decodifica ed esecuzione e nel passaggio all'istruzione successiva. Tutto qui. L'enorme quantità di cose che possiamo fare oggi con i calcolatori elettronici dipende sostanzialmente dal fatto che: Si possano codificare con stringhe binarie, quindi elaborabili dal calcolatore dati di ogni tipo (vedi capitolo 3) L'evoluzione delle CPU abbia portato alla possibilità di effettuare quantità enormi di calcoli al secondo anche su macchine dai costi irrisori L'evoluzione dei “programmi” di base e dei sistemi operativi (capitolo 4) ha reso possibile facilitare enormemente lo sviluppo di applicazioni nuove per i calcolatori. L'evoluzione delle periferiche di Input/output (ingresso/uscita) e delle interfacce utente abbia reso possibile una facile interazione con le macchine anche da parte di utenti non esperti. Vediamo qualche dettaglio su questa architettura di base dei calcolatori, andando ad analizzare, per prima cosa, il suo “cuore”, cioè la CPU 1.2 La CPU La CPU (Central Processing Unit) è appunto il cuore del nostro sistema. Essa contiene gli elementi circuitali necessari al funzionamento dell’elaboratore, quei circuiti integrati che operano effettivamente sulle sequenze di valori binari. La CPU esegue i programmi che risiedono nella memoria centrale, e coordina il trasferimento dei dati tra le varie unità. Essa si compone di: una unità di controllo (CU) una unità aritmetico-logica (ALU) alcuni dispositivi di memoria detti registri L’Unità aritmetico-logica è costituita da dispositivi circuitali che consentono di eseguire le operazioni aritmetiche somma, sottrazione, prodotto, divisione (ADD, SUB, MUL, DIV) o logiche (AND, OR, NOT) sugli operandi memorizzati nei registri interni all'ALU, come il registro accumulatore (A), dove vengono inseriti risultati parziali, il registro operando (OP) il registro di stato (PSW) ove vengono inserite informazioni sullo stato di avanzamento dei comandi (ad esempio riporti risultati di confronti, ecc.). Una caratteristica fondamentale della CPU è quindi la dimensione dei registri che corrisponde al numero di bit che possono essere elaborati contemporaneamente. I processori attuali arrivano a 64 bit; ovviamente alla dimensione dei registri dovrà corrispondere un analoga o proporzionale ampiezza del Che cos'è un “computer”? 9 Figura 3: Schema della CPU bus di comunicazione e delle caselle di memoria. L’unità di controllo si occupa della sequenzializzazione delle operazioni cioè della corretta esecuzione in successione dei comandi. Manda i segnali di controllo e gestisce lo svolgimento del ciclo fondamentale della macchina, cioè la ripetizione continua delle fasi di lettura delle istruzioni di programma, dei dati, decodifica ed esecuzione dell’istruzione e passaggio all’istruzione successiva. Anch’essa conterrà dei registri per memorizzare lo stato delle operazioni in corso e per gestire operazioni di servizio. Registri fondamentali della CPU sono: il registro degli indirizzi di memoria (MAR Memory Address Register): in esso viene memorizzato l’indirizzo di memoria dove estrarre o scrivere il dato ed è collegato direttamente al bus indirizzi il registro dei dati di memoria (MDR Memory Data Register), che contiene una copia del dato letto o da scrivere ed è quindi collegato al bus dati il contatore di programma (PC), che in realtà non conta nulla, ma memorizza l’indirizzo di memoria dove si trova la prossima istruzione da eseguire il registro della istruzione corrente (IR), che contiene l’istruzione corrente che deve essere decodificata ed eseguita il registro delle interruzioni Il microprocessore, che integra le componenti della CPU, è realizzato unendo minuscoli transistor, cioè dispositivi a semiconduttore in grado di assumere stati diversi in funzione delle tensioni applicate (acceso/spento). La capacità di elaborazione del processore dipende ovviamente dal numero di transistor “integrati” in esso. La stupefacente crescita dipende anche dalla miniaturizzazione dei contatti dei circuiti integrati, che sono ormai giunti alla tecnologia 0.13-0.15 micron (un capello è spesso circa 100 micron) ed è sempre stata approssimata dalla legge empirica nota come “legge di Moore” (da una previsione fatta nel 1965 da Gordon Moore) secondo cui il numero di transistor raddoppierebbe ogni due anni (corretti poi in 18 mesi). Al di là del fatto che non si possano usare leggi di questo tipo per fare reali previsioni sul futuro, la legge è stata approssimativamente rispettata non solo per quanto riguarda il numero di transistor, ma anche per altre evoluzioni di componenti informatiche (velocità di calcolo, dimensioni memorie, ecc.) che seguono un trend di crescita di tipo esponenziale. In Figura 4 vediamo 10 Fondamenti di Informatica Figura 4: Evoluzione dei microprocessori della famiglia Intel l'andamento del numero di transistor per la famiglia di processori Intel. L’attività del microprocessore è quella di eseguire, a computer acceso, un ciclo di operazioni continuo (sempre attivo fino allo spegnimento fisico della macchina), che implica tre principali fasi, eseguite ciclicamente: Lettura dell’istruzione (FETCH): l’istruzione viene trasferita dalla memoria al registro istruzioni Decodifica dell’istruzione (DECODE): viene identificata l’istruzione tra quelle dell’insieme a disposizione Esecuzione (EXECUTE): vengono eseguite le operazioni previste dall’istruzione Vediamo in dettaglio l’esecuzione di queste fasi: all’inizio del ciclo l’unità di controllo fornisce alla memoria l’indirizzo della cella contenente la prima istruzione da eseguire: la richiesta di ricerca dell’istruzione viene realizzata mediante la scrittura dell’indirizzo nel registro MAR e l’attivazione di un segnale di controllo sul bus che determina l’azione di lettura. La memoria seleziona la cella contenente l’istruzione, corrispondente all’indirizzo inviato sul rispettivo bus e pone il contenuto sul bus dati cosicché può venire copiato sul registro MDR. Il comando viene copiato sul registro IR. A questo punto è completata la fase di fetch e l’unità di controllo aggiorna il registro PC al valore corrispondente al comando successivo. L’unità di controllo esamina il contenuto del registro istruzioni e determina il codice operativo, cioè le operazioni da svolgere (decode). Infine vengono eseguite le varie fasi dell’istruzione mediante i segnali di controllo, fasi che possono prevedere la lettura di altri dati dalla memoria (operandi) e il trasferimento di risultati dai registri alla memoria centrale. Finita l’esecuzione, si torna alla fase di fetch. Il tempo di ciascun ciclo dipende ovviamente dal tipo di istruzione; per velocizzare l’attività del calcolatore spesso si usa la tecnica del pre-fetch, il nuovo comando viene già letto prima che finisca l’esecuzione del precedente. Il sicnronismo delle attività di lettura, scrittura ed interpretazione dei segnali deve essere garantito da un orologio che determini la cadenza temporale delle operazioni elementari. Il “clock” della CPU è quello che svolge questo compito, ed è caratterizzato da una frequenza, cioè l’inverso della durata di ciascuna operazione elementare. Tanto più alta sarà la frequenza, tanto maggiori saranno le capacità del calcolatore di svolgere compiti velocemente, per cui nell'evoluzione dei microprocessori le frequenze sono cresciute rapidamente da pochi KHertz (KiloHertz) ai moderni valori dell'ordine dei GHz (GigaHertz), Che cos'è un “computer”? 11 cioè del miliardo di operazioni elementari per secondo. L'aumento continuo del numero di transistor e della frequenza del ciclo per migliorare le prestazioni delle macchine ha chiaramente limiti fisici dovuti anche al consumo di energia ed al calore dissipato, per cui nelle ultime generazioni di microprocessori si è passati invece allo sfruttamento del parallelismo con le cosiddette CPU multi-core. Risolvendo problemi di sincronizzazione non indifferenti, infatti, si può suddividere il calcolo richiesto al microprocessore a più unità (core) integrati sullo stesso chip e che accedono alle stesse memorie. Questa svolta verso il parallelismo che migliora le prestazioni purché i programmi utilizzino elaborazione parallela (attraverso un meccanismo che prende il nome di multi-threading), è arrivata oggi anche ai PC domestici con i recenti chip Intel e AMD. L’efficienza e le caratteristiche del microprocessore dipendono, ovviamente, dal set di istruzioni che è in grado di eseguire (che corrispondono quindi ai codici operativi) e da come queste operazioni sono implementate sui circuiti logici. La programmazione delle istruzioni viene detta “microprogrammazione”, ed è il più basso livello di programmazione presente sulla macchina. Due microprocessori che hanno lo stesso set di istruzioni possono essere compatibili anche se la loro struttura interna è differente e possono quindi eseguire gli stessi programmi, cosa non vera nel caso generale. I personal computer “IBM compatibili” attuali utilizzano processori Intel o compatibili costruiti da concorrenti come AMD. 1.3 La memoria Abbiamo parlato della memoria come di un oggetto su cui, durante il suo ciclo, la CPU scrive e legge delle “parole”, copiandole da e su alcuni suoi registri spostandole attraverso il bus. In essa sono memorizzati sia i dati da elaborare, sia il programma che li elabora, e su di essa vengono scritti i risultati dell’elaborazione. La memoria principale del calcolatore è una lista di caselle, tra le quali se ne seleziona una mediante una serie di bit (quelli che vengono trasmessi dal bus indirizzi) su cui leggere o scrivere. Essa è realizzata fisicamente mediante dispositivi a semiconduttore in grado di mantenere o variare valori di tensione in funzione di input esterni (flip-flop, condensatori). La capacità della memoria sarà pari, per quanto abbiamo detto, alle dimensioni della parola (corrispondente in genere a quella del registro della CPU) per il numero di caselle disponibili. L’unità che viene usata per l’estensione della memoria è il Byte, sequenza di 8 bit, dal momento che le dimensioni delle parole caratteristiche delle CPU sono sempre multipli di 8 bit. Multipli caratteristici del byte sono Il Kilobyte (KB) = 210 byte = 1024 byte, Il Megabyte (MB) = 220 byte = 1024 KB byte, il Gigabyte (GB) = 2 30 byte = 1024 MB, il Terabyte (TB) = 240 byte = 1024 GB che significa oltre mille miliardi di byte! Tornando alle operazioni di lettura e scrittura, la Figura X mostra come vengano “indirizzate” le caselle della memoria stessa: il bus di controllo manda il segnale che seleziona l’operazione di lettura, scrittura, il bus indirizzi posta al dispositivo di memoria il contenuto del registro MAR della CPU, ed infine viene scritta nella casella il contenuto del registro MDR che è presente nel bus dati (operazione di scrittura) oppure viene posto sul bus dati il contenuto della casella che passa al registro (operazione di lettura) Esistono vari tipi di dispositivo di memoria. Per quanto riguarda la tecnologia, possiamo avere, per esempio le memorie di tipo ROM (Read Only Memory), che possono essere solo lette; queste possono essere non modificabili o programmabili dall’utente con opportune metodologie, ma non ovviamente durante l'utilizzo del calcolatore. Esempi di memorie ROM programmabili sono PROM, EPROM, EEPROM e così via. Le memorie su cui la CPU può scrivere e leggere si chiamano ad “accesso casuale” o 12 Fondamenti di Informatica RAM (Random Access Memory, significa che si può accedere ad ogni locazione direttamente mediante l'indirizzo, senza bisogno di scorrere tutte le locazioni precedenti). Anche qui possiamo avere varie sigle a seconda della tecnologia adottata, come SRAM, DRAM, CMOS. Le RAM dinamiche (DRAM) si basano su condensatori invece che su transistor (ne basta uno usato come interruttore); dato che la carica sui condensatori si mantiene per pochissimo tempo, devono essere ”riscritte” periodicamente con un operazione che viene detta “refresh”. Le RAM statiche (SRAM) utilizzano invece un circuito con più transistor e risultano quindi molto più costose (e ingombranti), ma anche molto più veloci. Figura 5: Lettura e scrittura dalla memoria: sul bus indirizzi viene indicata la casella per la scrittura/lettura, sul bus di controllo il comando da eseguire, ed i dati vengono trasferiti sul bus dati I parametri che caratterizzano le prestazioni della memoria sono: le dimensioni cioè la capacità in numero di byte, ovviamente una grande capacità incrementa le potenzialità della macchina. il tempo di accesso (tipicamente dell’ordine delle decine di nanosecondi) che è cruciale per il calcolo ad alta velocità. la volatilità (cioè dopo quanto si cancella il segnale). Tipicamente le memorie RAM sono tutte di tipo volatile, cioè non mantengono il segnale se non alimentate da corrente, mentre ROM, Flash, dischi magnetici mantengono il dato anche a calcolatore spento. Le RAM devono essere sempre alimentate per mantenere il segnale, quelle dinamiche anche riscritte a intervalli regolari. Il costo per bit, che è un parametro cruciale per rendere un tipo di memoria preferibile per i produttori. Ogni dispositivo di memoria ha le sue caratteristiche peculiari che vengono sfruttate al meglio dai progettisti dei sistemi. La memoria principale, quella indirizzata dalla CPU e che nei moderni PC ha dimensioni di centinaia di KiloBytes, è realizzata con RAM dinamiche perché, sebbene più lente, sono più piccole ed economiche delle RAM statiche. La RAM statica per realizzare un sistema per velocizzare l’accesso ai dati, ossia la memoria cache. Essa consiste in una duplicazione su supporti ad accesso più veloce di parte del contenuto della memoria principale. Se, come si cerca di fare, questa parte di memoria contiene le locazioni più spesso utilizzate, le prestazioni del computer risultano in media molto superiori. Essendo il suo contenuto una copia della memoria principale la cache non aumenta il numero di indirizzi a disposizione della CPU. Le parti della memoria principale che vengono copiate nella cache vengono scelte Che cos'è un “computer”? 13 sfruttando il cosiddetto “principio di località” per cui è estremamente probabile che in tempi vicini il processore acceda a regioni di memoria contigui (località spaziale) e visitate di recente (località temporale). Mantenendo nella memoria cache regioni contigue di memoria utilizzate di recente dai programmi, le operazioni successive utilizzeranno dati che con grande probabilità verranno letti nella memoria veloce senza dover aspettare il tempo di accesso alla memoria principale. Nei casi in cui il dato non sia presente nella cache, si ha il cosiddetto “cache miss” e si deve accedere comunque alla memoria principale. Saranno quindi necessari opportuni algoritmi che provvedano alla gestione di questi casi, e provvedano anche a mantenere coerente il contenuto della cache con il contenuto della memoria principale e ad aggiornare via via il contenuto della cache. Il meccanismo della Figura 6: Il meccanismo della memoria cache può essere realizzato anche su più cache: parte del contenuto della memoria livelli con lo stesso concetto; nei PC si principale viene ricopiato in una memoria di distinguono in genere cache di primo e più veloce accesso secondo livello, la prima (L1) in genere integrata nel microprocessore, la seconda (L2) esterna. Memoria principale e cache non esauriscono le tipologie di dispositivi di memorizzazione nei calcolatori. Gli altri, in generale le cosiddette “memorie di massa” sono in genere considerati esterni al modello di Von Neumann e quindi considerabili in tale schematizzazione come “dispositivi periferici”. Quello più significativo è una vastissima memoria non volatile (dell’ordine dei Gigabyte) detta memoria di massa o secondaria, su cui vengono immagazzinati i dati ed i programmi non utilizzati dalla CPU. Essa ha tempi di accesso molto più lunghi rispetto alle RAM e si basa in genere su dischi magnetici. Data la non volatilità essa serve principalmente per salvare dati e programmi degli utenti e memorizzare il sistema operativo da caricare all’accensione del computer. In alcuni casi, come vedremo in seguito, può anche essere utilizzata analogamente alla memoria principale per accrescere le dimensioni del casellario visto dalla CPU per permettere l'esecuzione di programmi che allochino quantità di memoria superiori alla RAM disponibile. Figura 7: Gerarchia delle memorie sui moderni calcolatori: a sinistra abbiamo i dispositivi più piccoli e veloci, a destra quelli più lenti e capaci 14 Fondamenti di Informatica Il complesso dei dispositivi di memoria che si usano nei calcolatori definiscono la cosiddetta “gerarchia delle memorie”, in cui si ha il passaggio da memorie piccole e veloci (a sinistra in Figura 7), “vicine” alla CPU, a memorie sempre più grandi, ma lente (a destra in Figura 7). 1.4 Gestione dell’Input/output I dispositivi di Input/output sono, nella schematizzazione di Figura 2, collegati al bus di sistema. Ma come dialogano periferica, memoria e CPU attraverso il bus? Innanzi tutto nei sistemi di controllo dei dispositivi periferici o di I/O devono esserci dei registri per contenere i dati da mandare o ricevere dal bus, definire lo stato (lettura, scrittura, ecc.). Devono esserci, poi, unità di controllo ed un sistema di sincronizzazione. Deve esserci, insomma, un sistema “intelligente” di gestione dell’input/output che parli un linguaggio “concordato” (protocollo) con la CPU. Questa, a sua volta, gestisce le procedure di lettura e scrittura sui dispositivi secondo le necessità dei programmi che sta eseguendo. Due sono le strategie tipiche con le quali può essere gestito l’I/O dalla CPU: il polling, cioè la CPU a cadenze prefissate “va a vedere” se le periferiche sono attive e devono inserire o prelevare dati; l’interrupt, con la quale sono gli stessi dispositivi periferici a segnalare alla CPU la loro richiesta di inserire o prelevare dati. In questo caso, la CPU dovrà possedere un sistema di gestione delle richieste di interruzione al fine di poter mantenere il suo funzionamento, soddisfare alla richiesta del periferico e riprendere la sua attività senza perdere dati o bloccare programmi in esecuzione. Si tratta di compiti piuttosto complessi, gestiti nei calcolatori a livello di sistema operativo. L’utilizzo continuo della CPU per gestire il trasferimento dei dati rallenta in molti casi le prestazioni del calcolatore. Per evitare di coinvolgerla continuamente, può essere utile introdurre un secondo sistema di gestione detto “controller” DMA (Direct Memory Access) che fa in modo che le periferiche possano direttamente “scrivere” in memoria, mentre la CPU può continuare ad operare (senza ovviamente mettere dati in conflitto sul bus). La CPU viene interrotta solo per dare il via al trasferimento, dopodiché “lascia” il bus al DMA, che lo libera a trasferimento finito. Vedremo comunque meglio I meccanismi di gestione delle memorie quando ci occuperemo del software di base del PC, cioè dei sistemi operativi (capitolo ) 1.5 Dal modello al PC fisico Dove troviamo la struttura che abbiamo visto nei nostri PC? Quello che vediamo è, in genere, una scatola di metallo (il case) con un alimentatore e varie porte di uscita che lo collegano a tastiera, mouse e eccetera, slot per dischi, pulsanti. Dove si trova l’architettura di Von Neumann vista in teoria? Dove sono il bus, le memorie, la CPU? Per trovarli occorre aprire il case (Figura 8). Si vede subito che il cuore del PC è una grossa scheda che monta un gran numero di circuiti integrali, detta scheda madre Essa contiene uno od anche più microprocessori, i bus di comunicazione, degli alloggiamenti per la memoria, i connettori per le unità esterne e svariati altri oggetti. Le memorie RAM (Random Access Memory) che costituiscono quella che abbiamo visto essere la “memoria principale” del calcolatore sono in genere piccole schede che contengono la circuiteria adibita alla memorizzazione. Abbiamo anche visto che la Che cos'è un “computer”? 15 Figura 8: Un PC Desktop aperto mostra le parti di cui si compone e che corrispondono a quelle dello schema descritto memoria principale deve essere costituita da RAM di tipo dinamico, esistono tuttavia vari tipi anche di queste memorie, che si sono evolute negli anni: oggi si usano in genere memorie di tipo sincrono (cioè le operazioni vengono scandite da un clock periodico) e dinamico (SDRAM), dette DDR (Double Data Rate) in quanto le operazioni di lettura scrittura avvengono su entrambi i fronti (ascendente e discendente) del segnale di clock che le regola. 1.6 I dispositivi periferici Se proseguiamo nella nostra ispezione all’interno del calcolatore oltre agli elementi visti troviamo, a completamento della “materializzazione” del sistema visto prima in astratto, anche tutta una serie porte e di connessioni esterne che costituiscono la connessione con quelle che avevamo chiamato nel modello astratto unità di Ingresso Uscita (Input/Output). Nella pratica si tratta del disco rigido per la memoria di massa e di tutte le altre periferiche che ci permettono quotidianamente l’utilizzo del computer (tastiera, mouse, video, ecc.). Come si può osservare in Figura 8, tutto si collega alla scheda madre tramite i numerosi spinotti ed alloggiamenti che vi sono integrati: il bus IDE per il disco rigido, slot per le schede esterne (video, audio, ecc.), porte per tastiera, mouse, microfono, ecc. Occorre notare che l’evoluzione del calcolatore ha portato a massimizzare il disaccoppiamento tra i dispositivi “esterni” e la CPU, creando circuiterie “intelligenti” di connessione e gestione degli stessi. Infatti, se la CPU dovesse gestire completamente anche i periferici si avrebbe un degrado delle prestazioni. Nei calcolatori più moderni, i periferici contengono addirittura processori dedicati, alloggiati fisicamente al loro interno. I dispositivi periferici, come abbiamo detto, vengono in genere distinti tra: Unità di ingresso, che permettono di introdurre nel calcolatore dati, programmi o di comunicare con dispositivi normalmente non compatibili col calcolatore fungendo così da interfaccia: ad esempio unità di ingresso sono tastiera, mouse, convertitori analogico-digitali, microfoni, scanner, lettori di codici a barre, telecamere, e così via. 16 Fondamenti di Informatica Unità di uscita, che permettono di visualizzare in qualche modo i risultati di elaborazione: esempi sono ovviamente il monitor, la stampante, il plotter, ecc. Alcune unità possono essere anche bidirezionali: ad esempio i dispositivi di memorizzazione esterna, come nastri, dischi magneto-ottici, ecc. Le unità esterne sono di varia natura e sono prodotti dai più svariati costruttori. Come è possibile garantire che si adattino tutte al nostro PC? La risposta risiede nei termini: interfaccia e standard. Un’interfaccia è la connessione del computer con l’esterno. Si compone di un aspetto hardware (la connessione fisica coi suoi spinotti maschio e femmina, e i suoi piedini), e di protocolli con cui i dati sono trasmessi attraverso di essa. Standard significa che i produttori di PC e periferiche si adattano ai tipi definiti di interfaccia di modo che non dovrebbero sussistere problemi di connessione. Esistono organismi di standardizzazione (ISO, IEEE, ecc.) che definiscono le specifiche dei vari aspetti del collegamento una volta che la tecnologia viene proposta e sperimentata e una volta definito lo standard, i produttori devono adeguarsi ad esso. Come vedremo, poi, chi programma le applicazioni del calcolatore non deve utilizzare conoscenze specifiche del dispositivo per utilizzarlo, ma agire con le stesse modalità (ad esempio richiamando funzioni standard del sistema operativo) indipendentemente dalla periferica montata. Questa interfaccia che consente l'”astrazione” nell'uso delle periferiche è realizzata attraverso i cosiddetti “driver”, componenti software che sono in genere forniti direttamente dal produttore, che si integra col sistema operativo e permettono quindi allo steso di gestire correttamente l’unità utilizzando i suoi meccanismi standard (dunque un driver è specifico per un dato sistema operativo). 1.7 Bus e schede di espansione La scheda madre nelle illustrazioni viste sopra mostra connettori o “slot di espansione” che permettono di inserire schede per estendere le potenzialità del calcolatore o collegare periferiche tramite di esse. Tali slot sono collegati ai bus. Nei PC possono esistere più bus, collegati in modo opportuno tra loro, l’evoluzione ha portato al succedersi di vari standard per i bus di sistema e locali (IDE, EIDE i primi, a soli 8, 16 bit e basse frequenze, poi PCI, AGP sempre più veloci e potenti per poter smistare la grande quantità di informazione elaborata dai processori e dalle schede grafiche). Schede video, audio, dischi rigidi, dispositivi di rete, ecc., sono inserite negli appositi connettori e si interfacciano poi direttamente con le unità esterne. Le schede devono contenere l’apposita logica di controllo che faccia dialogare la periferica con il PC nei modi prescritti dal protocolli del bus scelto. Quando si inserisce una nuova periferica occorre normalmente spegnere il computer, collegarla, e installare il software che la gestisca. Tuttavia nei moderni sistemi operativi si parla di tecnologia “plug and play”, cioè il sistema “riconosce” automaticamente la periferica e installa automaticamente il driver per gestirla, per cui il dispositivo viene automaticamente configurato senza spegnere la macchina. Per fare questo intervengono il BIOS (Basic Input Output System, programma che gestisce le operazioni base su periferici e che risiede in una ROM), che verifica la presenza del nuovo dispositivo ed il sistema operativo, che deve trovare sul disco, scaricare dalla rete o chiedere l’installazione del driver corretto all’utente. Che cos'è un “computer”? 17 1.8 Porte di collegamento Sul retro dei PC esistono in genere le porte cui collegare i cavi di collegamento ad alcuni dispositivi esterni standard. Per ciascuna delle interfacce codificate esiste un opportuno connettore. Storicamente i PC hanno in genere presentato le porte seriali (RS232) e parallele (CENTRONICS). Porta parallela Come suggerisce il nome, abbiamo più canali ove i bit vengono trasmessi in parallelo (8 canali). Occorrono più fili ai due lati, e per questa complicazione la si usa in genere unidirezionalmente (es. per la stampante). I cavi di collegamento hanno anche lunghezza massima minore. Porte seriali Sono canali di comunicazione a 1 bit. I bit vengono trasmessi in serie a distanza temporale costante, che definisce il bit rate, cioè il numero di bit trasmessi nell’unità di tempo. I bit sono trasmessi in pacchetti di dimensione fissata, con possibile presenza di bit estranei al segnale utilizzati per controllo di errore (parità). Gli standard delle porte seriali di vecchia generazione, che definiscono i livelli di tensione del bit, la temporizzazione, ecc. sono l’ RS 232 e RS432. Anche per quanto riguarda le connessioni esterne c'è stata comunque un'evoluzione delle tecnologie e degli standard. Lo standard Universal Serial Bus (USB) è utilizzato da tutti i calcolatori di nuova generazione. Esso consente di collegare fino a 127 dispositivi in serie, è molto più veloce delle vecchie seriali (12 Mbps) e consente di gestire facilmente i collegamenti per tutti i dispositivi che non richiedano il trasferimento di grosse quantità di dati (dischi rigidi ed ottici). Si utilizza per mouse, stampanti, scanner, modem. Ha inoltre gli ulteriori vantaggi di utilizzare la tecnologia “plug and play” (i dispositivi collegati vengono subito individuati dal sistema), non richiedere lo spegnimento del PC per il collegamento, di utilizzare cavi sottili e di trasmettere anche la corrente per l’eventuale alimentazione della periferica. Queste caratteristiche sono condivise anche dalle porte Firewire (IEEE 1394), standard creato dalla Apple, ma anch’esso universalmente diffuso. Questa connessione è peraltro molto più potente e costosa, e viene utilizzata soprattutto per dispositivi come videocamere digitali, dischi, ecc. Può collegare fino a 63 dispositivi in serie. 18 Fondamenti di Informatica 1.9 Alcuni dispositivi periferici Monitor Per la visualizzazione di ciò che il computer elabora si utilizzano apparecchi detti “monitor”. Fino a poco tempo fa si trattava principalmente di monitor a tubo catodico CRT, mentre oggi non solo i computer portatili, ma anche i desktop utilizzano monitor a cristalli liquidi (LCD). Questi hanno eliminato alcune problematiche sanitarie legate all'uso dei monitor CRT e riguardanti le rilevanti emissioni di radiazione di questi ultimi. In passato si utilizzavano anche monitor alfanumerici (cioè in grado di visualizzare solo caratteri), in bianco e nero o monocromatici. La qualità del monitor è in genere espressa dalla Figura 9: Monitor CRT, in via di sua ampiezza (diagonale in pollici) e dal suo estinzione... dot pitch (distanza diagonale tra i fosfori) che determinano la risoluzione numero di pixel rappresentati), dalla frequenza di refresh (numero di volte in cui l’immagine viene sostituita al secondo) e da altri parametri. Per i monitor a cristalli liquidi, la corrente tecnologia detta TFT (thin film transistor) a “matrice attiva” consente di ottenere immagini stabili (l'”attivo” si riferisce a una memoria che mantiene la tensione e non fa sfumare le immagini tra un ciclo e l'altro) e di buona qualità. Siccome uno dei problemi della tecnologia LCD era la lentezza nella risposta dei cristalli, un altro parametri rilevanti per determinarne la qualità visiva su sequenze in movimento è la velocità di risposta, in genere dell'ordine della decina di ms. Altri parametri rilevanti sono la luminosità (misurata in candele/m2, cioè la luce che può emettere) ed il rapporto di contrasto (cioè il rapporto tre luminosità di pixel bianchi e neri, ad esempio 1000:1) Un altro parametro rilevante e che aveva valori limitati nei primi modelli è l'angolo di visuale (ovviamente più è ampio, e meglio è). Scheda grafica Ciò che si vede sul monitor, dipende da una scheda montata sul PC, detta scheda video o scheda grafica. Su di essa è in genere presente un convertitore digitale analogico (RAMDAC) che genera il segnale che viene trasferito poi al monitor (se il monitor ha ingresso analogico), a partire da una mappa digitale che viene “scritta” sulla memoria presente nella scheda stessa (in caso di connessione digitale, per ora non diffusissima, vengono trasferiti direttamente i bit). La dimensione di questa memoria presente nella scheda grafica determina:la risoluzione ed il numero di colori rappresentati (palette) Figura 10: Scheda grafica Ad esempio, per avere 320 x 200, 256 colori, ognuno (8,8,8) bit: occorrono 64.000 byte, 768 per la palette. Per avere 640 x 480, 16 colori: 307.200/2 = 153.600 byte. Per avere 1024 x 768, 16.777.216 colori (true color, ovvero 24 bit): 2.359.296 byte. Esistono degli standard per risoluzioni e colori, ad esempio CGA, VGA, SVGA (1024x768), XGA. Che cos'è un “computer”? 19 Mentre in origine la scheda serviva soltanto come buffer dell'immagine da visualizzare ed interfaccia con lo schermo, al giorno d'oggi è stato trasferito sulle schede tutto il peso computazionale della generazione ed elaborazione grafica, specialmente per quanto riguarda la rappresentazione di scene “virtuali” in tre dimensioni a partire da modelli. Le schede video moderne, in pratica, contengono “Coprocessori Grafici” che “calcolano” la bitmap dei colori a partire da descrizioni della scena, togliendo questo compito dalla CPU. In pratica, una scena 3D viene “descritta” alla scheda mediante i poligoni che la compongono, la posizione delle luci, ecc. La descrizione delle scene ed i comandi all'hardware della scheda grafica vengono in genere realizzati dai programmatori utilizzando opportune librerie o interfacce di programmazione specificatamente create, le due interfacce standard si chiamano OpenGL e DirectX. La potenza e la quantità di memoria gestita dalle recenti schede video e l'architettura parallela delle stesse (che permette di realizzare contemporaneamente calcoli su un'intera matrice di dati) fa sì che tali schede vengano ormai utilizzate non solo per la grafica, ma anche per compiti di calcolo generico. La scheda grafica è in genere collegata al monitor per via analogica, con un connettore parallelo che trasporta le componenti video ed audio (VGA). I moderni monitor e schede grafiche tuttavia supportano spesso la connessione digitale (DVI), che permette di riprodurre esattamente il segnale di uscita della scheda sul monitor senza rischi di distorsioni od errori dovuti alla trasmissione sul cavo. Tastiera È un insieme di tasti, connessi ad interruttori. La circuiteria individua il tasto premuto ed invia il codice al sistema, che determina il carattere ASCII. E' possibile modificare la tabella di conversione via software per adattarsi a diverse lingue e convenzioni. La tastiera ha anche dispositivi di memoria (buffer) per risolvere problemi di ripetizione di tasti e di rimbalzo. Una curiosità: la disposizione “qwerty…” dei tasti non è, come si potrebbe pensare, studiata per accelerare la battitura, ma la si deve ai problemi meccanici delle prime macchine per scrivere, che presentavano problemi di tasti che si incastravano nel caso di battitura consecutiva di tasti vicini. Il produttore (Remington) decise allora di utilizzare una disposizione di tasti atta ad evitare, appunto, l’utilizzo consecutivo di tasti contigui. Quando il problema meccanico fu risolto, non era più possibile passare a tastiere più efficienti, nonostante esse fossero note a causa dell’ormai capillare diffusione delle tastiere “qwerty” ed all’adattamento ad esse dei dattilografi. Sistemi di puntamento Sono unità di input per sistemi grafici; differiscono per la tecnologia utilizzata e la differente ergonomia dell'interazione con l'operatore umano. Il più diffuso è sicuramente il mouse. Esso trasmette la variazione di posizione (coordinate x e y) e mediante la pressione di tasti invia prefissate sequenze di caratteri Esistono mouse di differenti tipi, a pallina di gomma a LED e fotorivelatore su tavoletta tramata, a LED senza tavoletta tramata. Quest’ultimo tipo si basa sull’acquisizione dell’immagine che sta sotto il mouse stesso da parte di un minuscolo sensore CCD (in Figura 11: Mouse a pratica una telecamera). Il LED serve per illuminare la regione due tasti ripresa. Sulla pallina di gomma che muove due rulli si basa anche la trackball, utilizzata da particolari applicazioni (es. postazioni pubbliche, alcuni vecchi portatili e alcuni 20 Fondamenti di Informatica videogiochi. Anche il joystick si usa soprattutto per i videogiochi, e si basa su una leva che preme dei pulsanti quando inclinata, fornendo le indicazioni di spostamento. Il touchscreen è un monitor sensibili al tocco del dito, ma ha risoluzione in genere modesta, basandosi sul fatto che il dito interrompe due fasci ortogonali di luce infrarossa tra fotoemettitori e fonorivelatori. Si usa in ambito industriale e per postazioni dimostrative o servizi per il pubblico. Stampante Mentre per i primi personal computer erano disponibili stampanti lente rumorose e costose, la tecnologia moderna consente di trovare ottime stampanti a prezzi bassi. Ciò ha fatto in modo che, curiosamente, l’era dell’elettronica che si supponeva portare verso una riduzione nell’utilizzo di carta e documenti stampati, abbia invece portato un costante incremento nell’utilizzo di carta come è emerso da un recente studio commissionato da un noto produttore di stampanti. Tornando ai dispositivi, esistono varie tecnologie di stampa: Ad impatto: martelletto su nastro inchiostrato: qualità buona, ma lenta; pochi colori. Ad aghi: insieme di aghi; la qualità dipende dal numero di aghi, dalla loro distanza e precisione; lente ma grafiche; monocromatiche; costi bassi, ormai desuete come le precedenti. A getto d'inchiostro: gli aghi sono sostituiti da ugelli che spruzzano gocce di inchiostro; qualità migliore; possibilità del colore Termiche: comprendono diversi tipi: aghi che bruciano carta termo-sensibile, calore che fa evaporare sostanze che si depositano sulla carta Laser: un raggio laser forma l'immagine della pagina su un cilindro fotosensibile che si carica elettrostaticamente nei punti colpiti da maggior intensità. Sul cilindro si deposita il toner, che viene trasferito a caldo sulla carta. I parametri che caratterizzano le prestazioni della stampante sono la risoluzione (dot per inch) e la velocità (pagine per minuto). Il plotter Si basa su un meccanismo che muove una o più penne su un foglio. Serve più che altro per cartografia e disegno architettonico, progetti, permettendo un elevata risoluzione delle linee. Lo scanner Serve per acquisire immagini raster. Ve ne sono di manuali, da passare sul foglio di carta e piani, dove il foglio viene posto sul piano dove sotto un vetro il sensore scorre linearmente. Ormai non esistono più scanner a passate multiple, come si usava una volta per migliorare la risoluzione. La risoluzione ottica è la reale densità di punti generati dal sensore; la risoluzione interpolata aumenta artificialmente la densità dei punti con un algoritmo matematico. Gli scanner vengono di solito associati a programmi per riconoscere i caratteri di testo (OCR) in modo da trasformare documenti cartacei in documenti elettronici. Figura 12: Scanner piano Modem Il modem (modulatore/demodulatore) collega il computer alle reti mediante conversione D/ A (A/D) e collegamento a provider attraverso la rete telefonica. La velocità tipica dei modem attuali è di 56 Kbit/s. Per i collegamenti via ISDN e ADSL si utilizzano schede che Che cos'è un “computer”? 21 sono spesso chiamate impropriamente modem, in quanto non operano una modulazione del segnale, ma trasmettono e ricevono segnali digitali. Scheda audio Genera gli effetti sonori: si occupa di convertire un flusso di dati digitali in un segnale analogico riproducibile da altoparlanti. Contengono spesso anche sistemi di acquisizione per convertire l'input analogico di un microfono in uno stream di bit. Le architetture moderne contengono un sintetizzatore di suoni (solitamente usato per generare suoni in tempo reale senza usare la CPU e chip sonori per migliorare la qualità del suono stesso. Parametri caratteristici delle schede audio sono il numero di canali (segnali distinti) che sono in grado di gestire (es. 1 = mono, 2.0 = stereo, 2.1 = stereo + subwoofer, dolby 5+1, ecc) Memorie a supporto magnetico Quasi tutti i sistemi di memorizzazione precedenti al CD si basavano sulle proprietà di un materiale ferromagnetico come l’ ossido di ferro depositato su un supporto inerte. Una corrente positiva o negativa orienta il materiale che costituisce le areole. La lettura della polarizzazione si ottiene facendo transitare le areole sotto una spira. Si arriva a centinaia di bit per mm2. La memorizzazione rimane in assenza di alimentazione. Si differenziano attraverso la forma del supporto : dischi flessibili, dischi rigidi, Figura 13: Disco rigido nastri. Il floppy disk ha supporto flessibile, il disco rigido ha supporto metallico. Entrambi hanno tracce concentriche e ogni traccia è suddivisa in settori mediante la formattazione Si può accedere in lettura o scrittura solo ad un intero settore, pertanto il trasferimento avviene a blocchi. I Floppy hanno dimensioni tipiche 5"1/4 o 3"1/2, e contengono fino a 1.44 Mb; hanno un elevato tempo di accesso, capacità limitata Gli hard disk sono immersi in gas pressurizzato, hanno alta velocità ed alto tranfser-rate; in un PC possono esserci anche più dischi in parallelo, collegati al bus di sistema. I dischi rigidi hanno particolare importanza perché vengono in genere utilizzati per la memorizzazione off line di tutti i dati e programmi dei PC (memoria di massa). La loro capacità di memorizzazione è cresciuta notevolmente negli anni fino agli attuali centinaia di Gigabytes. Per accedere ai dati devono prima posizionare il braccio nella posizione corretta (tempo di ricerca) e poi girare per portare la testina sul settore esatto, questo implica un tempo di latenza. Il dato da valutare complessivamente è il tempo medio di accesso, dipendente dai parametri precedenti, indice del tempo necessario per ciascun accesso a settore contenente dati (ogni apertura di file ne implica molte). Negli hard disk Ide-Ata i tempi di accesso sono attorno agli 8 millisecondi (ms) mentre le unità di tipo SCSI raggiungono anche i 5 ms. Il transfer rate descrive poi la velocità di trasferimento dati in MB/s, che è proporzionale alla velocità di rotazione (tipicamente 7200 rpm). Abbiamo detto che l’unità di memoria trasferibile coincide con la dimensione del settore. 22 Fondamenti di Informatica Se la quantità di dati dell’unità logica di informazione (che può essere un testo, un programma, un immagine, ecc.) da trasferire supera la capacità del settore, i programmi di gestione del sistema operativo devono spezzettare i dati e concatenarli. Una catena si dice file. In Windows esiste un indice del disco (FAT) che contiene le informazione sui settori allocati e liberi. Per i sistemi server, poiché i dischi rigidi sono delicati e possono rompersi in caso di urto o spegnimento/accensione brusca, si usa duplicare l’informazione (mirroring, RAID) su più dischi. Sui nastri magnetici il materiale magnetico è disposto su nastri di plastica avvolti su bobine e le informazioni memorizzate in blocchi intercalati da zone non magnetizzate. L’accesso è sequenziale, per cui molto lento. Per questo le applicazioni tipiche sono backup o archiviazione dati Memorie di tipo ottico I dischi ottici sono derivati dai CD usati per riproduzioni audio. La tecnologia si basa su deformazioni permanenti della superficie del supporto (materiale plastico) prodotte da raggi laser. Le variazioni di tensione accumulata su un fotorivelatore consentono di ricostruire l'informazione. Ne esistono di varie tipologie. I tipici CD/R sono memorie WORM (Write Once Read Many), esistono però anche I CD/RW, riscrivibili. La tipica capacità è 640 Mbyte, che corrisponde, per i CD audio, a 74 minuti. Oggi sono la forma di memorizzazione su mezzo rimovibile più diffusa per l’elevata affidabilità, la grande capacità ed il costo irrisorio. Negli apparecchi di scrittura/lettura si indica in genere la velocità con cui possono essere letti/scritti in funzione dei primi modelli (4x, 16x, 32x). La moderna tecnologia laser ha consentito di realizzare su supporti simili i DVD, che possono contenere fino a 17 Gb e vengono utilizzati anche per la memorizzazione di film. Anche in questo caso esistono differenti standard, quelli oggi introdotti sui PC consentono di memorizzare e leggere tipicamente 4.7 Gb. Memorie a stato solido Recentemente sono diventati di largo uso oltre che di basso costo e di notevole capacità le memorie permanenti e riscrivibili basate sulla fisica dei semiconduttori, generalmente riferite come memorie “flash”, evoluzione di diversi tipi di dispositivi di memoria programmabile a stato solido. Utilizzando principi della meccanica quantistica, questi dispositivi possono essere scritti e letti permanentemente, conservano i dati senza alimentazione e sono di dimensioni contenute. Sono per questo molto adatte per l'interscambio di dati (per cui hanno sostituito i vecchi dischetti magnetici) ed i dispositivi portatili come macchine fotografiche, cellulari, media player, ecc. Esistono vari formati di scheda di memoria Attualmente esistono varie tipologie di flash memory card che si differenziano per il consorzio di produttori e standard di dimensioni, collegamenti e capacità: Compact Flash, SmartMedia, MultiMediaCard, Memory Stick ,Secure Digital, TransFlash, xD-Picture Card. Particolare interesse per il personal computing hanno le cosiddette USB memory Flash, ovvero le ben note “chiavette USB” che sono appunto accessibili dal pc in lettura/scrittura mediante l'interfaccia USB. Calcolatori che non hanno necessità di grosse quantità di memoria di massa possono addirittura sostituire l'hard disk con memorie flash (solid state disks), come accade per esempio nei recenti ultraportatili (Asus EEE, Acer Aspire One). Che cos'è un “computer”? 23 1.10 Storia del calcolatore Come abbiamo visto il moderno computer non è altro che una sofisticata macchina per il calcolo automatico, che è in grado di eseguire ripetutamente operazioni aritmetiche e logiche. Le prime macchine per il calcolo automatico furono apparecchiature meccaniche. Il primo esempio che si ricorda è quello costruito nel 1642 dal matematico e filosofo francese Blaise Pascal, la cosiddetta Pascaline. Essa era in grado di eseguire le addizioni tenendo Figura 14: Pascaline conto automaticamente dei riporti ed eseguiva sottrazioni e moltiplicazioni. Negli anni seguenti altri studiosi proposero modifiche o nuove macchine, ma spesso solo da un punto di vista teorico, ricordiamo Leibnitz (1671) e Poleni (1709). Il primo progetto in qualche modo definibile come antenato del calcolatore moderno fu la macchina analitica (Analytical Engine) progettata dal matematico inglese Charles Babbage nel 1832. Essa poteva, infatti, risolvere teoricamente qualsiasi problema descrivibile come una sequenza d’operazioni matematiche. Teoricamente, perché Babbage non riuscì a realizzarla in pratica a causa delle limitazioni della tecnologia del tempo, soltanto dopo la sua morte il figlio ne realizzò alcune parti. Il primo calcolatore prodotto in serie risale al 1810 ad opera di Charles Thomas, ne furono costruiti circa 1.500 esemplari. La prima applicazione pratica del calcolo automatico risale invece al 1890, per il censimento di New York e Baltimora quando lo statistico americano H. Hollerith utilizzò schede perforate per registrare i dati; le schede venivano lette da dispositivi ed elaborate meccanicamente. L’uso di questa macchina ridusse il tempo di elaborazione delle schede dai sette anni del censimento precedente a due anni e mezzo, nonostante l’aumento dei dati. La scheda perforata era stata introdotta da Jacquard per comandare i telai di tessitura. Figura 15: Il calcolatore ENIAC Hollerith fondò anche una società per la produzione dei lettori di schede perforate; la società prese il nome di IBM (International Business Machine). Un altro grosso passo avanti nella storia delle macchine di calcolo lo si deve all’ingegnere tedesco Konrad Zuse che che realizzò nel 1938, calcolatrice meccanica in cui introdusse l;uso del sistema binario ed il primo calcolatore elettromeccanico: lo Z3 (1941) ottenuto sostituendo i dispositivi meccanici con relais. Lo Z3 era in grado di eseguire le quattro operazioni elementari e di estrarre la radice 24 Fondamenti di Informatica quadrata con tempi di esecuzione delle operazioni dell’ordine del secondo. Nel 1944 venne realizzato all’Università di Harvard il Mark1, calcolatore elettromeccanico capace di eseguire un’addizione in 300 millisecondi e di calcolare alcune funzioni quali quelle trigonometriche, il logaritmo decimale e l’esponenziale. Solo nel 1946 fu realizzato il primo calcolatore elettronico presso l’Università di Pennsylvania: chiamato ENIAC (Electronic Numerical Integrator and Calculator), si basava su valvole termoioniche (per la memoria dati) ed era mille volte più veloce dei suoi predecessori. Sull’ENIAC i programmi erano costituiti da un insieme di connessioni tra fili; era quindi molto difficile programmare compiti piuttosto complessi. Da notare che ENIAC pesava 30 tonnellate e occupava una superficie di oltre 100 metri quadri, nonostante ciò la memoria era di 20 numeri di 10 cifre. Nel 1950 Fu realizzato il primo calcolatore a programma memorizzato, l’EDVAC (Electronic Discrete Variable Automatic computer) ove furono applicate l’ idea di John Von Neumann, matematico ungherese, secondo cui il programma poteva essere posto nella memoria dati del calcolatore. I computer che seguono questa architettura, cioè tutti I calcolatori moderni vengono anche chiamati macchine di Von Neumann e il ciclo di esecuzione delle istruzioni viene chiamato ciclo di Von Neumann. Il primo calcolatore prodotto su scala industriale fu l’UNIVAC1(1951), Nel 1955 l’ IBM presenta il modello IBM-704 con 32000 byte di memoria e la possibilità di programmare anche in un linguaggio di alto livello (Fortran). La cosiddetta seconda generazione dei calcolatori, risale alla fine degli anni 50 è caratterizzata dalla sostituzione delle valvole con i transistor, frutto delle ricerche dei Bell Labs alla fine degli anni 40. I transistor consentirono di ottenere computer più piccoli, affidabili e potenti. In questo periodo cominciarono a nascere ed evolversi I “sistemi operativi”, per rendere semplice ed efficiente l’uso dei calcolatori. La terza generazione dei calcolatori vede invece l’introduzione dei circuiti integrati (chip). Il circuito integrato fu inventato da J. St. Clair Killey della Texas Instruments nel 1958, il primo calcolatore commerciale a circuiti integrati fu l’IBM serie 360. In questo periodo vengono introdotti alcuni concetti base dei moderni sistemi operativi (vedi Capitolo 4) come la multiprogrammazione e il time-sharing. La quarta generazione inizia nel 1971 con il primo microprocessore, il 4004, realizzato dall’italiano Federico Faggin presso la INTEL. Un microprocessore è una unità di elaborazione centrale (CPU) realizzata in un unico chip, di costo molto basso. In questo periodo vengono introdotte anche le memorie a semiconduttori meno ingombranti, più veloci e meno costose delle precedenti memorie a nuclei. Nel 1976 nasce il primo personal computer: l’Apple I, che utilizzava il microprocessore 6502 della MOS Technology. Nel 1980 L’ IBM introdusse sul mercato il PC-IBM (Personal Computer) con microprocessore 8088 Intel e 64 Kbyte di memoria. Il PC-IBM utilizzava il sistema operativo DOS che divenne poi uno standard mondiale per i personal computer. Che cos'è un “computer”? 25 Nel 1981 venne annunciato il primo laptop computer, l’Epson HX-20 della Epson, di peso inferiore a un chilo e mezzo, dotato di un piccolo display a cristalli liquidi. Da allora la potenza dei calcolatori e la complessità dei sistemi operativi non ha smesso di crescere, anche se non ci sono state, in realtà, rivoluzioni clamorose nelle architetture di calcolo. Vi è stata una netta convergenza nell’evoluzione di workstation scientifiche e professionali e computer domestici, che ormai sono sostanzialmente indistinguibili. Dal punto di vista Figura 16: Apple I, il primo Personal dell’utilizzo del calcolatore la più grande Computer rivoluzione la si e avuta con l’avvento dell’era di internet, in cui I calcolatori sono collegati in una rete mondiale di comunicazione e possono scambiarsi dati e programmi. Nonostante ciò l’annunciato avvento del “network computing” con calcolatori privi di memoria a lungo termine che utilizzano solo programmi scaricati dalla rete, non si è verificato. Le tendenze più recenti riguardano l’evoluzione dei PC portatili, ormai paragonabili alle macchine desktop, ed all’evoluzione delle tecnologie wireless, che sta portando ad una convergenza tra i sistemi di elaborazione e quelli di telefonia. Inoltre sta assumendo importanza sempre più rilevante il paradigma del cosiddetto “Grid Computing”, consistente nel consentire l’utilizzo di dati e risorse di calcolo distribuite in luoghi diversi a ciascun utente, che resta ignaro di dove queste si trovino, ma potendo così avere a disposizione risorse enormi per il calcolo. 26 Fondamenti di Informatica 2 Calcolo automatico, algoritmi, programmi Pur avendo visto come è fatta la macchina, almeno per quanto riguarda l'hardware (l'insieme dellle componenti fisiche) siamo ancora ben lontani dal capire come sia possibile che essa consenta tutte quelle incredibili applicazioni che abbiamo oggi a disposizione. Per il momento, infatti, come era per i primi calcolatori, l'utilizzo di questa architettura si limiti all'esecuzione di una serie di operazioni elementari, aritmetiche e logiche sui dati memorizzati che avvengono secondo un programma prestabilito. Tutto molto distante dai problemi che risolviamo con i nostri computer. Per trasformare il nostro sistema in qualcosa che ci serva nella vita reale, abbiamo da compiere alcuni fondamentali passi: codificare i dati che ci interessa elaborare in numeri binari ed implementare le operazioni che dobbiamo fare su di essi a partire da quelle fondamentali del mircroprocessore. E, ovviamente, sapere come quali siano le metodologie ed i limiti dell'elaborazione automatica dell'informazione cosa che viene studiata dalla teoria degli algoritmi. 2.1 Algoritmi e programmi Per quanto abbiamo visto il calcolatore è un elaboratore automatico d’informazione, che esegue operazioni su oggetti (dati) per produrre altri oggetti (risultati). L'esecuzione di azioni viene richiesta all'elaboratore attraverso opportune direttive, dette istruzioni. Il calcolatore che abbiamo descritto è detto “elettronico” in quanto gli oggetti che riceve in ingresso, elabora e fornisce in uscita sono segnali elettrici, livelli di tensione e la loro elaborazione avviene mediante circuiti elettronici a semiconduttore. Si parla anche di elaboratori digitali: il significato che viene dato a questi livelli di tensione non è legato, infatti, al loro valore assoluto, ma al loro essere superiori od inferiori a una determinata soglia, nel qual caso al livello di tensione si attribuisce il valore 1 o 0. I dati in ingresso ed in uscita nei calcolatori elettronici sono quindi sequenze di valori 0 o 1 (bit, da BInary digiT). Al di là della complessità raggiunta da problemi e soluzioni che stanno alla base del software che utilizziamo oggi, anche le macchine che usiamo quotidianamente lavorano facendo sequenze di operazioni su dati binari. Uno degli scopi dell'informatica consiste quindi nel cercare di capire quali siano i problemi affrontabili dalle macchine e lo studio di come si possa impostare la loro soluzione suddividendola in passi fondamentali eseguibili dalla macchina. Si parla in questo caso di studio degli algoritmi: ne riassumiamo nel seguito gli aspetti principali. Supponiamo di avere un determinato problema e di volerlo fare risolvere automaticamente alla macchina calcolatrice che abbiamo a disposizione. Per far questo dovranno essere verificate alcune condizioni: La soluzione del problema deve essere nota. I passi che la compongono debbono poter essere tradotti in un linguaggio comprensibile dal calcolatore. I dati in ingresso devono essere codificati in dati adatti al calcolatore (in generale numeri binari). Se ciò è vero, possiamo trovare opportuno metodo di elaborazione che mettendo in sequenza “azioni elementari” eseguibili dalla macchina trasformi i dati iniziali nei corrispondenti risultati finali desiderati. La “sequenza di azioni elementari” così definita è detta anche algoritmo. Calcolo automatico, algoritmi, programmi 27 Non tutti i problemi, neppure tutti quelli, ben definiti, della matematica o della geometria possono essere risolti o tradotti per il calcolatore. Questo può essere dovuto al fatto che non si conosce neppure la soluzione del problema (ad esempio trovare tutte le coppie contigue di numeri primi) oppure perché non esiste un metodo automatizzabile. Questo non è stato certo limitante per il diffondersi delle applicazioni del calcolo automatico: con il calcolatore è stato comunque possibile risolvere problemi molto complessi ed oggigiorno i personal computer non si limitano a risolvere qualche semplice problema matematico o logico, ma sono programmati per simulare o riprodurre operazioni complesse e sostituiscono l’attività umana in una serie di compiti sempre più rilevante. Tutto questo non deve farci però dimenticare che tutte le attività svolte dal calcolatore nascono sempre dalla scrittura di algoritmi in opportuni linguaggi descrittivi (quella che si chiama “programmazione”), che vengono poi “tradotti” nei linguaggi a basso livello del calcolatore mediante quelle che vengono chiamate “compilazione” o “interpretazione”. Dunque non deve stupire che magari qualche volta i programmi che utilizziamo falliscano o si blocchino, o magari ci siano errori nelle elaborazioni, la colpa, contrariamente a quanto viene talvolta detto da non addetti ai lavori, non è mai del computer, ma di errori nella scrittura degli algoritmi, nella programmazione o nella selezione dei dati. Il lavoro degli informatici cerca di ridurre questi errori e quindi discipline fondamentali per chi studia l’informatica sono sicuramente lo studio degli algoritmi, dei linguaggi e delle tecniche di programmazione. Senza addentrarci in queste materie, ricordiamo soltanto le proprietà principali degli algoritmi. Il concetto di algoritmo (termine che deriva dal nome di un matematico arabo, Al Khowarizmi, che contribuì alla fondazioni dell’algebra) non è legato necessariamente al calcolatore elettronico, ma ad un qualunque “esecutore”. Quest’ultimo è un entità che, in generale, dovrà essere in grado di compiere “azioni elementari” e di interpretare un linguaggio con cui queste azioni gli sono ordinate. Per il resto, l’esecutore di un algoritmo può benissimo essere una persona, una sistema meccanico o di qualunque altro tipo. Se, per esempio, istruisco un mio conoscente ad andare a pagare una bolletta al mio posto, spiegandogli dettagliatamente dove deve andare, cosa deve scrivere, eccetera, sto facendo null’altro che istruire un esecutore a eseguire una serie di operazioni elementari che lui sa eseguire, cioè gli sto fornendo un algoritmo. L’importante, ai fini dell’ottenimento dello scopo (nell’esempio avere la bolletta pagata) è che la mia descrizione dell’algoritmo possieda alcune proprietà fondamentali, cioè, ad esempio: Non ambiguità: le istruzioni devono essere univocamente interpretabili dall’esecutore Eseguibilità: l’esecutore deve essere in grado di operare ciascun passo in tempo finito Finitezza: l’esecuzione deve terminare per ogni configurazione dei dati in ingresso Queste proprietà sono necessarie sia nel caso della bolletta, sia per la programmazione del computer. Se le proprietà sono rispettate, cosa peraltro non facilmente dimostrabile nei problemi reali, posso mandare tranquillamente il mio compito in esecuzione. Nello studio teorico si considerano, per semplicità, delle macchine “astratte” che in qualche modo modellano le macchine calcolatrici reali; le più note sono Macchina di Turing e la Macchina RAM (con memoria ad accesso casuale). Dall’analisi di tali modelli di esecutore si possono ricavare teoremi riguardanti la calcolabilità di determinate 28 Fondamenti di Informatica espressioni, e quindi sulla risolubilità di problemi. Fu per esempio l’analisi di un famoso problema sulla macchina di Turing a mettere in evidenza che nella logica matematica esistono classi problemi “non decidibili”, per i quali non si può trovare soluzione. Una congettura comunemente accettata è che la classe di problemi matematici risolubili con una macchina astratta sia comune per tutte le macchine di questo tipo. Non ci addentreremo nello studio di queste problematiche, per le quali rimandiamo a testi specifici, e andiamo invece ad analizzare come si possa passare da un problema risolubile alla sua esecuzione automatica, cioè analizziamo un attimo quello che gli analisti e programmatori fanno nella pratica del loro lavoro. 2.2 Analisi ed implementazione degli algoritmi L’analisi del problema deve mettere in evidenza quali siano i dati, quale la soluzione da ottenere e con quali vincoli. Si definiscono cioè le precondizioni rispettate dai dati e le postcondizioni che devono rispettare le soluzioni. A questo punto si passa alla sintesi dell’algoritmo, che può essere libera o eseguita secondo ben codificati metodi progettuali. Una volta nota la soluzione la si dovrà descrivere in maniera chiara e comprensibile all’uomo per permettere ad altri di analizzarla e modificarla, per poi, in un secondo tempo “tradurla” in un linguaggio comprensibile al calcolatore. Il passaggio dalla descrizione dell'algoritmo alla scrittura e traduzione del programma viene spesso chiamato “implementazione”. Facciamo un esempio: supponiamo di voler scrivere un programma che calcola la media dei voti riportati da uno studente. Dovremo, oltre a fare in modo di codificare in bit i numeri reali e i caratteri che compongono il nome, saper risolvere il problema di calcolare la media (banale: somma diviso numero di esami) e scrivere le operazioni che portano ad essa in modo da farle eseguire al calcolatore. Tutto qui, anche se, ovviamente, se dovessimo realizzare tutto noi avendo a disposizione soltanto l'hardware della macchina sarebbe complicatissimo. Figura 17: Dal problema allo sviluppo di programmi Un calcolatore elettronico, di per sé, comprende soltanto serie di istruzioni per il microprocessore scritte in quello che viene detto “linguaggio macchina”, cioè una serie di codici di operazioni (una sequenza di byte) e di operandi (dati scritti anche essi in binario). Ed è in grado di lavorare su dati numerici di tipo e dimensione limitati. Abbiamo visto che in un calcolatore elettronico la CPU ha un set di istruzioni a ciascuna delle quali corrisponde un codice: questo vuol dire che un programma eseguibile lo è soltanto per quella determinata CPU, o per una CPU con le stesse operazioni e gli stessi codici. Un Calcolo automatico, algoritmi, programmi 29 programma eseguibile, in linguaggio macchina, è eseguibile solo su un calcolatore con una determinata CPU e consiste quindi in una sequenza di codici operativi (numeri binari che corrispondono a una determinata operazione della CPU) e di operandi (dati codificati in codice binario. Poiché una simile sequenza non è molto comprensibile, la si indica con un linguaggio simbolico in cui stringhe di caratteri indicano le operazioni e le locazioni di memoria (es. ADD R1 R3 significa addizione dei contenuti di due registri). Programmare un applicazione moderna lavorando a questo livello avrebbe comunque sempre una complessità proibitiva. Fortunatamente i programmatori, al giorno d’oggi, non hanno bisogno di conoscere neppure questo linguaggio, in quanto esistono linguaggi evoluti attraverso i quali si possono scrivere gli algoritmi che poi vengono trasformati in linguaggio macchina dai compilatori, oppure controllati e interpretati linea dopo linea da programmi che vengono detti “interpreti”. Questi linguaggi di programmazione vengono detti “di alto livello” (Pascal, Basic, C, C++, ecc) e ricordano più il linguaggio naturale umano che il linguaggio macchina. Utilizzando questi linguaggi i programmatori lavorano a livelli “alti” del sistema operativo (vedi capitolo 4) e danno istruzioni a “macchine virtuali” in cui l'hardware è utilizzato indirettamente attraverso le funzioni del software di sistema. Il compito dei programmatori di oggi è facilitato anche dall’avere a disposizione ulteriori strumenti, come ambienti di sviluppo, sistemi di “debugging” (per trovare facilmente gli errori), “editor” per scrivere il codice in maniera assistita, eccetera. Inoltre moltissimi tipi di dati, anche immagini, suoni, ecc possono essere codificati in modo standard per essere elaborati dalla CPU e le librerie di programmi di sistema (incluse nei cosiddetti sistemi operativi) si occupano di gestire le parti del computer a basso livello (memoria, input/output, ecc.) Insomma generazioni di programmatori hanno fatto sì che chi vuole realizzare applicazioni per il computer possa farlo ad alto livello, scrivendo liste di comandi complessi su dati di ogni genere e questo ha facilitato moltissimo lo sviluppo di applicazioni varie per l'utente generico. Le macchine che oggi utilizziamo non si caratterizzano quindi soltanto per un'architettura hardware, ma anche per vari tipi di programmi di gestione che costituiscono i cosiddetti sistemi operativi (ci si riferisce a hardware + sistema operativo con il termine piattaforma di sviluppo). Questi sistemi operativi forniscono l'interfaccia all'utente per interagire con le risorse della macchina in maniera astratta ed intuitiva, ed ai programmatori la possibilità di scrivere i programmi che realizzano applicazioni complesse mediante metodologie di sviluppo semplici ed organizzate. 30 Fondamenti di Informatica 3 Codifica dell'informazione Abbiamo stabilito che un calcolatore elettronico è una macchina per eseguire sequenze di operazioni elementari che risolvono problemi ben formulati (algoritmi). Esso si basa su circuito a semiconduttori ed all’ingresso accetta dati digitali cioè sequenze o insiemi di stati di alta/bassa tensione, in pratica numeri binari. L’unità fondamentale di informazione, cioè un singolo valore 0 o 1, prende il nome di BIT (BInary digiT). Sui questi dati tutte le operazioni eseguite vengono realizzate a partire da operazioni booleane (AND, OR, NOT…) implementati mediante circuiti a transistor. Tutte le informazioni introdotte nei calcolatori devono quindi essere trasformati in sequenze binarie prima delle elaborazioni. In generale non lo sono. All’interno dell’elaboratore rimangono sempre memorizzate in forma binaria (valore alto/basso di tensione, interruttore aperto/chiuso, zona magnetizzata/non magnetizzata, riflettente/non riflettente, ecc.). Le memorie dei calcolatori immagazzinano sequenze binarie sotto queste forme. Per dare gli ordini di grandezza della quantità di informazione si utilizzano i vari multipli del bit, ad esempio, nell’ordine: Byte: 8 bit Kbyte (Kilo)= 210byte = 1024 byte Mbyte (Mega)= 1024 Kbyte Gbyte (Giga)= 1024 Mbyte Tbyte (Tera)= 1024 Gbyte Numeri, lettere, immagini e tutte le informazioni che vogliamo elaborare automaticamente vengono anch’esse comunemente rappresentate mediante sequenze di simboli (che in termini tecnici prendono il nome di stringhe) appartenenti ad un alfabeto di dimensioni però ben maggiori di 2 (il caso dei simboli binari rappresenta semplicemente il caso minimale, cioè il numero minimo di simboli sufficiente per rappresentare informazione). La codifica dei dati in binario consisterà quindi nel creare una corrispondenza biunivoca tra l'alfabeto da codificare e stringhe di “bit” 0 e 1. poiché con N bit si possono creare 2N stringhe differenti, vorrà dire che per codificare con stringhe binarie un insieme di simboli (alfabeto) di C elementi (C prende il nome di cardinalità dell'alfabeto) dovremo utilizzare un numero di bit tali che 2 N sia maggiore o uguale a C. Se 2N = C la codifica si dice non ridondante, altrimenti la si dice ridondante. La ridondanza (cioè l'uso di un numero di bit maggiore dello stretto necessario) non è necessariamente uno spreco, ma può servire per rilevare o correggere errori. In effetti sia nelle memorie che nelle trasmissioni in rete di dati digitali, può accadere che il segnale di tensione che codifica lo 0 o l'1 possa essere errato a causa di qualche difetto. Se si usano bit di controllo o si duplicano dati il rischio che questi errori possano causare problemi è ridotto. Un metodo di rilevazione di errori molto usato, ad esempio nelle memorie è il controllo di parità. Ai bit necessari (cioè non ridondanti) per codificare si aggiunge un ulteriore cifra binaria tale che il numero di ‘1’ sia pari (parità pari) o dispari (parità dispari). Un eventuale cambiamento di valore di un bit dovuto a malfunzionamento della memoria potrebbe essere quindi rilevato. Facciamo un esempio: il valore in memoria è 1101101 (7 bit). Aggiungo il bit di controllo: deve essere “1” se voglio che il numero di uno sia pari: lo aggiungo in fondo e il mio dato diventa 11011011. Se ora un bit cambiasse valore, per esempio il quarto per cui il mio numero diventa 11001011, quando faccio una verifica noto che il numero di “1” è dispari, c’è quindi stato un errore. Ovviamente il controllo di parità definito così rileva, ma non Codifica dell'informazione 31 permette di correggere gli errori. Accorgersi però del problema può essere sufficiente per evitare danni. 3.1 Codifica dei caratteri alfabetici Un esempio di codifica consistente nella semplice corrispondenza simbolo-stringa binaria è quello dei caratteri dell’alfabeto. 32 33 34 35 36 37 38 39 ! " # $ % & ' 40 41 42 43 44 45 46 47 ( ) * + , - / 48 49 50 51 52 53 54 55 0 1 2 3 4 5 6 7 56 57 58 59 60 61 62 63 8 9 : ; < = > ? 64 65 66 67 68 69 70 71 @ A B C D E F G 72 73 74 75 76 77 78 79 H I J K L M N O Tabella 1: Codice ASCII Nei calcolatori essi vengono spesso rappresentati mediante sequenze di 7 bit, utilizzando il codice ASCII (American Standard Code for Information Interchange), riportato in Errore: sorgente del riferimento non trovata. 7 bit corrispondono a 128 simboli diversi, che spesso non bastano a rappresentare tutti i simboli (ci sono caratteri particolari dipendenti dal paese, ecc.) per cui esiste un ASCII esteso (8bit) ove peraltro l’ottavo bit può essere usato anche per il controllo di parità. Per gestire vocabolari più ampi s' è passati ad una codifica a 16 bit che consente di rappresentare molti caratteri speciali (e per esempio alfabeti con migliaia di caratteri come il cinese). Questo sistema di codifica detto UNICODE, può creare qualche problema di compatibilità all'indietro, dato che magari utilizzando editor differenti o programmi diversi a volte capita di vedere che i caratteri speciali non sono rappresentati correttamente. 3.2 Sistemi numerici Per quanto riguarda la rappresentazione dei numeri per l'elaborazione al calcolatore, se ci potessimo limitare ai numeri naturali basterebbe convertire decimale in binario e potremmo lavorare. Decimale e binario sono, lo ricordiamo, notazioni posizionale in base 10 e 2;. notazione posizionale in base r significa che il numero è espresso da stringhe di un alfabeto di r cifre (che formano un insieme d={0,1,…,r-1}) nelle quali la posizione delle cifre è determinante: scrivere cioè: N = xyz significa che N = x*r2+yr+z 32 Fondamenti di Informatica dove x, y, z corrispondono a cifre dell’insieme d={0,1,…r-1}. È importante notare che qualsiasi sistema posizionale a base fissa è irridondante in quanto ad ogni combinazione di cifre diversa corrisponde effettivamente un numero diverso. La numerazione che utilizziamo comunemente è semplicemente una notazione posizionale in base 10, cioè con r=10, d={0,1,2,3,4,5,6,7,8,9}. Il sistema binario usato all’interno del calcolatore è un caso particolare di notazione posizonale,con r=2 d={0,1}. Altri sistemi usati in informatica sono l’ottale (r=8, d ={0,1,2,3,4,5,6,7}) e l’esadecimale: (r=16,d= {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}) Nel caso dei numeri interi, quindi, i numeri in base 10 devono essere convertiti in e da base 2 per l’elaborazione al calcolatore. L’operazione è molto semplice: ad esempio, utilizzando la definizione: 10102 = (1*8 + 0*4 + 1*2 + 0*1)10 = (8+2)10 = 1010 Un poco più complesso, ma sempre molto semplice è il passaggio inverso. Un metodo consiste nel dividere il numero per 2, mettere il resto come prima cifra del valore binario, dividere il risultato ancora per 2 e mettere il resto come cifra più significativa del risultato e dividere ancora il resto, e così via, finché il risultato non è 1. Provare per credere. Nel rappresentare i numeri interi sul calcolatore, occorre tenere conto del fatto che le macchine hanno vincoli spaziali: esiste quindi un massimo valore rappresentabile, dipendente dal numero di bit utilizzati. Con n bit si può rappresentare al massimo il numero 2n-1. Al contrario, se si vuole rappresentare un numero intero X, è necessario avere a disposizione un numero di bit pari a n = INT( log2 (X+1) ). Nel sistema binario, le operazioni aritmetiche si fanno esattamente come nel sistema decimale,. Ad esempio la somma si fa cifra a cifra con il riporto alla posizione successiva: 0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 0 con riporto di 1 1 + 1 + 1 = 1 con riporto di 1 Nell'esempio sotto vediamo la stessa operazione eseguita in binario e decimale: 10010110 15010 +11011010 +21810 _________ ______ 101110000 36810 Abbiamo detto che i numeri interi rappresentati in binario sul calcolatore hanno limiti, superiore ed inferiore. Se le operazioni che facciamo devono generare numeri al di fuori da questi limiti, il risultato del calcolo automatico sarà errato: gli errori di questo tipo si chiamano Overflow e Underflow, a seconda del fatto che il risultato sia maggiore del limite superiore o inferiore al limite più basso. Si può avere overflow se il risultato delle operazioni richiede un numero maggiore di bit di quanto disponibile: ad esempio se abbiamo 4 bit, ed eseguiamo la seguente operazione, otteniamo un risultato errato: 1100 + 0111 = 1011 che in decimale significa Codifica dell'informazione 33 12+7=11 Per avere il corretto risultato occorrerebbe un bit in più: 01000 + 00111 = 110011 Gli errori di overflow e underflow vanno chiaramente tenuti in conto dai programmatori per evitare di ottenere risultati completamente errati e devono quindi essere sempre prevenuti. Per passare dai numeri interi ai naturali (negativi compresi, quindi), esistono diverse possibilità: la più intuitiva è utilizzare modulo e segno: Il bit più significativo non conta per il numero ma solo per il segno: positivo (0) e negativo (1). Ad esempio con 5 bit: 10011 = -3 00011 = +3 Questo metodo ha un problema evidente:esistono due rappresentazioni per lo ‘0’: ad esempio con 5 bit 10000 e 00000. Inoltre la realizzazione delle operazioni non è banale: addizionando bit a bit +3 e –3 si otterrebbe 10110, che è interpretato come –6. Conviene usare il complemento a 2: se il numero di bit a disposizione è n, col complemento a 2 si rappresentano i numeri tra –2(n-1) e 2 (n-1) –1. Come? I numeri positivi nel range di interesse (cioè inferiori a 2 (n-1) –1) si rappresentano normalmente, invece si sostituisce -B con (2n -B). La cosa interessante è che così la differenza tra due numeri positivi A e B, si esegue sommando con le regole del calcolo binario A+(2n -B) La sottrazione si esegue mediante una somma. Nel caso precedente, per +3 e –3 avremmo 00011 e 11101, sommano bit a bit otteniamo 00000, come volevamo. La codifica dei numeri diventa ovviamente problematica quando si tratta di rappresentare nel calcolatore i numeri reali. E’ evidente che non si possono rappresentare numeri che variano nel continuo con stringhe binarie, per cui quello che normalmente si rappresenta sono in realtà numeri frazionari che approssimano con un errore noto il numero reale interessato. L’idea più semplice sarebbe di usare un bit per il segno, un numero fisso N per il numeratore ed un numero D di bit per il denominatore. Questa soluzione presenterebbe il problema di limitare molto o il massimo numero rappresentabile o il numero di cifre significative del numero espresso in forma decimale, a seconda che si utilizzino più bit per il denominatore o per il numeratore. La soluzione al problema è stata trovata con l’utilizzo della rappresentazione in virgola mobile (floating point). In questa rappresentazione i numeri espressi nella forma: A= M*BE dove M viene detta mantissa, B: base ed E esponente. Sono necessari un segno sia per la mantissa che uno per l’esponente (esponenti negativi=numeri frazionari): si sceglie arbitrariamente una forma normalizzata ove 0 ≤ M < 1, l’esponente è espresso in complemento a 2 (in binario), la mantissa è espressa in modulo e segno. Effettuare le operazioni aritmetiche su questi numeri è abbastanza semplice: per moltiplicazione si moltiplicano o si dividono le mantisse in modo consueto si sommano o si sottraggono gli esponenti e si normalizza. Per somma e sottrazione: si uguagliano gli esponenti, si sommano le mantisse. Si noti che la precisione del numero è data dal numero di cifre della mantissa e si utilizzano in genere due tipi di floating point: a singola precisione, e doppia precisione, cioè con doppia lunghezza della mantissa (range invariato, precisione raddoppiata). Lo standard di rappresentazione dei reali sui calcolatori si chiama IEEE 754 Floating point, ed ha 34 Fondamenti di Informatica mantissa di 23 bit (52 per doppia precisione), 1 bit di segno ed esponente a 8 bit (11 doppia precisione) 3.3 Altri tipi di informazione In molte delle applicazioni che usiamo sul calcolatore, non lavoriamo su caratteri o numeri, ma elaboriamo informazione più complessa come immagini, suoni, misure fisiche, mappe geografiche e così via. Sono dati che