Indice Gli Albori ...................................................................................... 4 Le prime macchine.................................................................................5 Macchine astratte – Una storia lounga un secolo............................ 10 I calcolatori di prima generazione 1940-1955....................................12 I calcolatori di seconda generazione 1956-1963...............................16 I calcolatori di terza generazione 1964-1970..................................... 17 I calcolatori di quarta generazione 1971-oggi ...................................18 I calcolatori di quinta generazione. Il futuro…..................................21
Rappresentazione posizionale................................................. 22 Codifica dell’informazione, numeri binari e caratteri Ascii .............23 Sistemi di numerazione binario ottale ed esadecimale ..................25 Codifica delle informazioni - Rappresentazione dei numeri ..........25 Rappresentazione di caratteri ............................................................30 Rappresentazione dei segnali audio .................................................33 Rappresentazione delle immagini ..................................................... 34 Rappresentazioni ipertestuali.............................................................35 Compressioni delle informazioni ...................................................... 36
Premessa.................................................................................... 39 Formalismi di codifica......................................................................... 40 Diagrammi di flusso.............................................................................40 Pseudocodifica.....................................................................................45
Premessa.................................................................................... 47 Hardware............................................................................................... 47 La microprogrammazione................................................................... 49 Le unità periferiche.............................................................................. 49 Software................................................................................................ 68
Funzionalità di un calcolatore.................................................. 71
La macchina di von Neumann........................................................... 71 Il funzionamento della macchina di von Neumann ......................... 72 Le macchine convenzionali moderne................................................ 74 L'interconnessione Bus...................................................................... 75
I Linguaggi formali .................................................................... 85 Linguaggi di alto e di basso livello.................................................... 86 Le Categorie .........................................................................................87
Introduzione............................................................................... 89 L'installazione ......................................................................................91 Il Copyright........................................................................................... 92 Introduzione ai sistemi operativi........................................................ 94 Il Bootstrap........................................................................................... 95 Sistema operativo e microprocessore...............................................96 Struttura di un Sistema Operativo......................................................99 Monolitica..............................................................................................99 Client-Server.......................................................................................100 Buccia di cipolla.................................................................................101
Premessa ................................................................................. 102 Il Modello OSI......................................................................................103 Il Modello TCP/IP................................................................................ 105 Criteri generali dell'architettura del TCP/IP .....................................107 Gli Apparati di Rete............................................................................107 Tipologia Della Rete...........................................................................109 Internet ............................................................................................... 111
Premessa.................................................................................. 112 I Protocolli...........................................................................................112 Internet Protocol (IP)..........................................................................115 User Datagram Protocol (UDP).........................................................116 Transport Control Protocol (TCP).................................................... 117
Limiti e dimensioni riguardanti la trasmissione dei dati...............118 Posta Elettronica (Simple Mail Transfer Protocol)......................... 119 FTP (File Transfer Protocol)..............................................................120 HTTP (HyperText Transfer Protocol)................................................120 Data Streaming...................................................................................121
Il World Wide Web. Introduzione ai formati dei dati multimediali. Introduzione all'uso dei motori di ricerca.......122 Premessa.................................................................................. 122 I motori di ricerca............................................................................... 124 Trucchi.................................................................................................125
Sitografia.................................................................................. 127 BIBLIOGRAFIA......................................................................... 127
CAPITOLO I Cenni di Storia dell’Informatica Gli Albori La ricerca di sistemi che facilitassero il calcolo (dopo l’uso delle dita), iniziò con l’ABACO, un quadro con perline mobili inventato a Babilonia circa 5000 anni fa. L’abaco rimase il principale sistema di calcolo fino al XVII secolo quando John Napier creò un metodo, che utilizzava piastre ed asticciole dette bastoncini (o ossi) di Nepero, che permetteva di effettuare la moltiplicazione, la divisione e l'estrazione delle radici quadrate e cubiche. Nello stesso periodo Henry Briggs crea le prime tavole logaritmiche in base 10. Successivamente, stimolato da un incontro con il matematico Napier, calcolò le tavole logaritmiche con quattordici cifre decimali dei numeri da 1 a 20.000 e da 90.000 a 100.000(pubblicate nel 1618).
Figura 1 ABACO
Le prime macchine Il vero punto di partenza che ha condotto ai moderni elaboratori è rappresentato da un calcolatore meccanico ad ingranaggi (la macchina di Pascal –“la pascalina”), ideato per eseguire somme e sottrazioni dal diciannovenne Blaise Pascal (1623-1662) , matematico francese (che inventerà anche il calcolo delle probabilità). Figura 2 Blaise Pascal
Figura 3 Pascalina di Blaise Pascal Al limite della "pascalina" pose rimedio il matematico tedesco Gottfried Wilhelm Leibniz(1646-1716), che nel 1671 costruì una macchina in grado di fare anche moltiplicazioni e divisioni. Il principio della moltiplicazione era relativamente semplice: sommare successivamente il moltiplicando per un numero di volte pari al moltiplicatore. Tuttavia, la sua più grande invenzione fu quella della rappresentazione binaria dei numeri (0 e 1). Purtroppo però essa cadde nel vuoto e solo nel 1847 verrà riscoperta, grazie al matematico inglese C. Boole, che aprirà l'orizzonte alle grandi scuole di logica matematica del '900 e soprattutto alla nascita Figura 4 del calcolatore elettronico. L'ingegnere matematico Giovanni Poleni (1685-1761) docente di "Astronomia e meteore" all'Università di Padova, realizza un prototipo funzionante di una macchina calcolatrice in grado di eseguire le quattro operazioni su numeri massimo di tre cifre. La descrizione della calcolatrice è riportata nel suo saggio "Miscellanea" del 1709 in cui confluiscono i risultati delle sue ricerche giovanili. Nel secondo capitolo dell'opera si legge che la "macchina aritmetica" ha una grande ruota a tre settori su ciascuno dei quali ci sono nove denti che muoFigura 5 vono rotelle totalizzatrici. Per la divisione, la macchina richiede un procedimento complicato e non completamente sicuro. Mentre le calcolatrici di Pascal e Leibeniz erano azionate con una manovella, quella di Poleni dispone un contrappeso. Poleni distruggerà la sua macchina quando verrà a sapere che un austriaco ne aveva costruito un esemplare migliorato. Nel 1959, per i 250 anni dalla pubblicazione del saggio "Miscellanea" una ricostruzione della macchina di Po-
leni sarà realizzata negli stabilimenti IBM di Milano. La macchina è esposta al Museo della Scienza di Milano. Nel 1804, l'imprenditore francese Joseph Marie Jacquard (17521834) pensò d'introdurre nei telai di legno della sua azienda di Lione, che produceva stoffe, delle lunghe schede di cartone forato: ad ogni scheda corrispondeva un preciso disegno, formato da forellini. Sembrava si potesse finalmente dare ordini a una macchina perché eseguisse da sola un lavoro ripetitivo. Il dispositivo Figura 6 di lettura delle schede era costituito da file di aghi che potevano attraversare solo dove c'erano i fori: i fili venivano così alzati automaticamente permettendo il passaggio della trama e il lavoro procedeva molto più in fretta, aumentando la produzione. La reazione degli operai fu immediata: i telai di Jacquard rischiavano di gettare in miseria i 4/5 della popolazione di Lione. Il Consiglio della città gli ordinò di distruggerla. Tuttavia, nel 1812 operavano in Francia già 11.000 telai a scheda perforata. Dieci anni dopo la macchina era diffusa in Inghilterra, Germania, Italia, America e persino in Cina.
Figura 7 - Telaio di Jacquard Sul modello della macchina di Leibniz, il francese Thomas de Colmar (1785-1870) costruì nel 1820 l'aritmometro, un apparecchio finalmente pratico, portatile, di facile uso e, soprattutto, correttamente funzionante. Essa fu la prima calcolatrice commercializzata con vero successo: ne furono venduti più di 1500 esemplari in trent'anni. Figura 7
La macchina era progettata in modo da poter essere costruita in piccola serie dalle nuove macchine utensili perfezionate con la Rivoluzione Industriale. L’Aritmometro, così venne chiamata, ottenne una medaglia d'oro all'esposizione di Parigi del 1855. Era in grado di eseguire le quattro operazioni, con risultati fino a 12 cifre; ma non poteva essere programmata per svolgere calcoli in successione, né era capace di conservare in memoria un risultato parziale, per riprenderlo in una successiva fase di calcolo. Per fornire queste prestazioni alle calcolatrici occorrerà aspettare i progressi tecnologici di un settore in grande sviluppo in quel periodo. La macchina inventata da de Colmar conobbe un successo ininterrotto per parecchie decine di anni, finché il progresso nelle tecniche di fabbricazione dei pezzi meccanici permise di ottenere un rendimento migliore. Nel 1834 l’inglese Charles Babbage(1791-1871) presenta l’idea di una macchina analitica (Analythical Engine) le cui caratteristiche sono molto simili a quelle dei moderni calcolatori. La macchina non fu mai realizzata se non in tempi recenti, Babbage aveva conosciuto il telaio di Jacquard nei suoi studi sulle manifatture e da questa invenzione aveva ricavato alcuni concetti che gli furono utili nell' ideazione della sua seconda macchina; quella analitica. Per questa macchina, precorrendo i tempi, aveva immaginato la possibilità Figura 8 di introdurre da un lato le operazioni (gli algoritmi) e dall'altro i valori (le variabili e le costanti). Il modo più semplice di fare questo consisteva nell' utilizzo di schede perforate o nastri perforati in tutto simili a quelli dei telai di Jacquard. La macchina doveva essere in grado di eseguire operazioni ricorrenti nel calcolo delle tavole e, per questo, dovevano esserci varie schede, una per ogni operazione da compiere, che venivano unite in un nastro nella opportuna sequenza. Questo era di fatto il programma di calcolo (operation cards). Altre schede perforate contenevano i dati, variabili e costanti, e venivano a costituire un secondo nastro (variable cards). Egli realizzò anche una "macchina alle differenze" in grado di svolgere calcoli più specializzati. La macchina analitica era costituita da due parti: lo store (memoria) che immagazzinava variabili e costanti e nella quale erano conservati anche tutti i risultati intermedi dei calcoli. Il mill (unità di calcolo) che conteneva il programma vero e proprio. Babbage non vedrà mai funzionare la sua Macchina Analitica. Mentre la Macchina alle differenze sarà completata solo nel 1989 ed ora è esposta al Museo della Scienza di Londra. Ma lo schema generale del suo calcolatore è talmente simile a quello dei computer moderni che la tardiva riscoperta dei suoi scritti invalidò alcuni brevetti dell’IBM.
Gorge Boole(1815-1864) matematico inglese, inventa l’ Algebra di Boole nella quale esistono solo i numeri 1 e 0 (senza nessun valore intermedio) e le operazioni NOT,AND,OR, in ordine di priorità, da priorità alta a priorità bassa. Talvolta, al posto di 1 e 0 vengono utilizzati T (True, vero in inglese) e F (False, falso in inglese) per significare che 1 e 0 non rappresentano numeri nel senso comune del termine, ma solamente uno stato, una cosa che esiste oppure non esiste: T e F possono sostituire completamente, senza Figura 9 nessun limite, 1 e 0. L'Algebra di Boole richiede e definisce le seguenti proprietà (solo se sono soddisfatte tutte si può parlare di Algebra di Boole): poniamo * per rappresentare la funzione PROPRIETÀ DELL'ASSORBIMENTO: AND a * ( a + b ) == a + per rappresentare la funzione OR a + ( a * b ) == a ! per rappresentare la funzione NOT PROPRIETÀ COMMUTATIVA: PROPRIETÀ DISTRIBUTIVA: a * b == b * a a * ( b + c ) == ( a * b ) + ( a * c ) a + b == b + a a + ( b * c ) == ( a + b ) * ( a + c ) PROPRIETÀ ASSOCIATIVA: ALTRE PROPRIETÀ: a * ( b * c ) == ( a * b ) * c a * 0 == 0 a + ( b + c ) == ( a + b ) + c a * !a == 0 IDEMPOTENZA: a + 1 == 1 a * a == a a + !a == 1 a + a == a PRINCIPIO DI DUALITÀ: Se una uguaglianza è corretta, è corretta ed uguale anche l'uguaglianza ottenuta sostituendo da tutte e due le parti 1 con 0 e 0 con 1, AND con OR, OR con AND. La seconda si chiama duale della prima. Da qui deriva il concetto di NOT applicato ad una formula (e non semplicemente ad una variabile o costante). Tabella 1 Nel 1884 l'industriale di Chicago Dorr Eugene Felt(1862-1930) realizzò la 'Macaroni box', prototipo di una calcolatrice a tastiera per applicazioni contabili ,così chiamata perché allestita in una scatola di legno per spaghetti .Lo spunto venne preso dal movimento alternato di una piallatrice. Nel prototipo i tasti sono costituiti da spiedini
da macellaio di lunghezza diversa ,le guide dei tasti da chiodi e le molle da elastici .E' la prima calcolatrice (dopo quella di Tito Gonella) ad essere azionata con tasti anziché da manovella. Dopo tre anni di perfezionamenti, nel 1887 venne commercializzata nella versione in serie col nome di 'comptometer'. Nel 1905, la Marina degli Stati Uniti se ne servì per la progettazione delle proprie navi. Verso la fine del 1800 la rivoluzione industriale aveva sconvolto il panorama geografico delle nazioni: le città e le fabbriche cominciarono ad essere sempre più importanti, mentre le campagne si spopolavano. L’equilibrio sociale diventava sempre più complesso, anche a causa delle immigrazioni, e i governi dovevano essere in grado di conoscere, attraverso censimenti,la composizione delle Figura 10 società per poter prendere decisioni adeguate al momento giusto. Il governo degli Stati Uniti si rese ben presto conto che non poteva seguire le trasformazioni in corso senza avere alcun strumento di calcolo a disposizione: questa fu la prima volta che un uomo si rese conto che le sue sole capacità mentali non sarebbero bastate ma era necessario un aiuto meccanico. Per questo Herman Hollerith(1860-1929) ingegnere meccanico, nel 1884 propose l’utilizzo di un macchinario elettrico da lui elaborato, basato sull’utilizzo di schede di cartone perforate, sull’esempio di Jacquard(telai). Ogni scheda rappresentava un individuo e ogni foro rappresentava una risposta positiva o negativa ad una certa domanda. Le schede venivano preparate su macchine speciali dette perforatrici pantografiche, che traducevano le risposte dei moduli del censimento in buchi sulle schede di cartone. Terminato il lavoro di perforazione le schede venivano raggruppate e inserite nel lettore di schede, nel quale un congegno elettromeccanico verificava la presenza o l’assenza dei buchi. Contando i buchi sulle schede, il lettore fu in grado di generare i risultati del censimento del 1890 in circa 2 anni, contro i sette occorsi per la precedente rilevazione. Hollerith sfruttò economicamente il successo ottenuto, estendendo l’utilizzo delle schede perforate anche nel settore commerciale e dando avvio alla cosiddetta meccanografia, che si occupa di registrare le informazioni anziché eseguire calcoli; nel 1896 fondò la Tabulation Machine Company, confluita nel 1911 insieme ad altre compagnie nell C-T-R-Calculation and recordings Co., che nel 1924 prese il nome di International Business Machine, meglio conosciuta come IBM. Ad Hollerith è dovuta anche la standardizzazione dei formati delle schede perforate; tale formato è sopravvissuto alla definitiva scomparsa delle schede perforate, intorno al 1980. Contrariamente a quello che è successo in Italia, le schede perforate sono state usate, soprattutto negli Stati Uniti, anche prima dell’invenzione dei computer elettromeccanici ed elettronici; gli elaboratori semmai hanno approfittato di questa tecnologia consolidata.
Figura 11 Macchine astratte – Una storia lounga un secolo Alla base dei concetti teorici dei calcolatori elettronici del 900 troviamo le teorie di David Hilbert (1862-1943) sulla costruzione di un unico sistema che ricomprendesse e organizzasse tutta la matematica ponendo la questione della completezza e della coerenza, esso è completo se tutti gli enunciati veri della matematica sono derivabili (‘ottenibili’ e ‘dimostrabili’) al suo interno; è coerente , o non-contraddittorio, se non possono derivarsi al suo interno enunciati contraddittori, vale a Figura 0.14 dire una proposizione e la sua negazione. Una questione di questo tipo rientra nella metamatematica, poiché è un’indagine matematica sulla matematica. Nel 1931 Kurt Gödel (1906-1978) pubblicò il "Teorema di incompletezza" che mostrava l'impossibilità dell'impresa proposta da Hilbert. Il teorema afferma che in un qualsiasi sistema assiomatico (costruito cioè su un gruppo di assiomi, come l'aritmetica o la geometria euclidea) è sempre possibile trovare una proposizione che fa parte di questo sistema, la cui validità non è tuttavia dimostrabile con i mezzi logici (assiomi, definizioni, regole di deduzione) offerti dal sistema stesso: per effettuare questa dimostrazione, è necessario ricorrere a un sistema più ricco di mezzi logici del pri- Figura 12 mo.
Figura 13
Nel 1936 il matematico inglese Alan Mathison Turing (19121954) progettò una macchina ideale che fosse in grado di risolvere problemi. Questa macchina, nota come macchina di Turing, si compone di un nastro, che possiamo immaginare di carta e di una testina di lettura/scrittura (TLS) che scorre sopra il nastro. La macchina funziona su intervalli discreti di tempo; ad ogni istante il suo stato dipende dallo stato precedente; la sua struttura è: a. Il nastro è suddiviso in singole celle nelle quali può essere scritto un simbolo appartenente a un alfabeto predefinito; il nastro è da considerarsi infinito a destra e a sinistra.
b. La TLS deve essere in grado di leggere i simboli scritti in una cella, di scrivervi un nuovo simbolo, di muoversi in entrambi i versi lungo il nastro. c. La macchina che comanda la testina è definita istante per istante da una quintupla di elementi: 1. s: lo stato della macchina all'istante presente; 2. i: il simbolo letto all'istante presente; 3. S(s, i): lo stato della macchina all'istante successivo; è funzione dei primi due parametri. 4. I(s, i): il simbolo scritto dalla macchina all'istante successivo; è funzione dei primi due parametri. 5. V(s, i): il verso (movimento) della macchina (destra/sinistra); è funzione dei primi due parametri. Questa macchina, concettualmente semplice, è in grado di risolvere una classe di problemi molto vasta; un esempio semplice ma non banale è quello di stabilire se una sequenza di parentesi è ben formata. Nello stesso anno Alonzo Church (1903-1995), sviluppa la teoria del “λ calcolo” (1936) che mostra l'esistenza di un "problema indecidibile". Questo risultato precedette il famoso lavoro di Turing sul problema della fermata (o halting problem) che inoltre mostra l'esistenza di un problema irrisolvibile mediante un procedimento meccanico. Church e Turing, mostrarono altresì che il λ calcolo e la macchina di TuFigura 14 ring, utilizzata dallo stesso Turing nel problema della fermata, sono equivalenti in capacità, e successivamente dimostrarono una varietà di "processi di computazione meccanica" alternativi aventi le medesime abilità computazionali. Questo risultato è la tesi di Church–Turing. Successivamente Turing studiò la cosiddetta macchina universale, una macchina di Turing in grado di imitare una
qualsiasi particolare macchina di Turing. La macchina universale di Turing ha costituito il primo modello del futuro computer programmabile. In un certo senso gli odierni computer programmabili sono macchine universali di Turing. I calcolatori di prima generazione 1940-1955 I primi grandi calcolatori furono concepiti allo scopo di semplificare e accelerare i calcoli scientifici in ambito ingegneristico e soprattutto militare. Erano principalmente costituiti da valvole termoioniche e tubi a vuoto. Tre grandi tipi di calcolatori sono stati costruiti negli anni '40, essenzialmente in università o centri di ricerca:
I calcolatori numerici elettromeccanici: Benché siano stati rapidamente superati in seguito questi calcolatori hanno rappresentato un notevole progresso. Le loro prestazioni nel calcolo e, in particolare, la velocità nell'esecuzione delle operazioni ne fecero delle macchine moderne per la loro epoca, che superavano ampliamente i calcolatori d'ufficio. Inoltre faranno da banco di prova per alcune tecniche impiegate più tardi nei computer, in particolare per quanto riguarda l'uso del calcolo binario e il principio del registro interno o memoria. Esempi di questo tipo di calcolatore sono: lo Z1 (1941,evoluto fino allo Z4) di Zuze, primo calcolatore universale binario governato da programma, la cui memoria era costituita prima da una serie di ripiani mobili, poi (dallo Z2) da relé telefonici; queste macchine vennero usate per calcoli aeronautici connessi all'impiego delle bombe volanti, lanciate dagli aerei. il Model1 di Stibitz che si basava su principi tecnici simili allo Z3 ma che diede vita al primo esempio di calcolo a distanza grazie al collegamento con telescriventi via rete telegrafica
I calcolatori analogici: I capostipite di questi calcolatori fu l'analizzatore differenziale di Vannevar Bush (1890 - 1974) costruito per risolvere le equazioni differenziali che complicavano e rallentavano notevolmente il lavoro degli ingegneri civili. Tuttavia l'esempio più significativo di calcolatore analogico fu il MARK 1(1944), elaborato nell'Università di Harvard nel 1937 da Howard H. Aiken (1900-1973). Il suo progetto fu quello di costruire un calcolatore universale (servendosi del principio delle macchine a schede perforate), che avrebbe dovuto eseguire i calcoli nell'ordine delle sequenze matematiche e non dalle sequenze imposte dalle limitazioni meccanografiche. Il meccanismo di trasferimento di una determinata quantità d'informazione da
una parte all'altra della macchina funzionava grazie a un sistema di ruote dentate, mosse da impulsi elettrici, che effettuavano una rotazione ogni dieci impulsi. Il programma era inserito su un nastro di carta perforata e un orologio sincronizzava le operazioni eseguite dalla macchina.
I calcolatori numerici elettronici: L'avvenire apparteneva all'elettronica anche se molti durante gli anni '40 stentavano a rendersene conto. Il vantaggio principale dell'elettronica era sicuramente la rapidità di commutazione: si poteva azionare un circuito aperto/chiuso parecchie centinaia di migliaia di volte al secondo grazie all'assenza di qualunque attrito meccanico. Si trattava della migliore prestazione mai ottenuta da una tecnologia di elaborazione dei segnali, ma c'era un inconveniente: il solo modo di utilizzare le risor- Figura 15 se dell'elettronica all'epoca era costituito da fragilissimi tubi a vuoto. Di conseguenza i calcolatori numerici elettronici annoverarono sia sostenitori che oppositori:
Primo dei calcolatori fu il COLOSSUS (1943) di T. H. Flowers, W. W. Chandler e altri. Era un grande calcolatore elettronico, con una memoria composta di1500 valvole. Usava cinque processori paralleli e poteva leggere un nastro perforato alla velocità di 5000 caratteri al secondo. Il più importante di questi calcolatori fu senza dubbio l'ENIAC (1946), uno degli ultimi dinosauri del periodo che ha preceduto la comparsa del computer. La sua costruzione ebbe inizio alla Moore School dell'Università della Pensylvania nel giugno del 1943 e rimase nascosta per lungo tempo al grande pubblico in quanto segreto militare. Molte delle idee che servirono a realizzare l'ENIAC vennero da Atanasoff: l'uso dei tubi elettronici era già stato sperimentato sull'ABC (un precedente calcolatore elettronico), ma questa volta furono impiegati su scala molto più ampia. Atanasoff aveva anche realizzato la sincronizzazione delle operazioni interne della macchina con un orologio elettronico, le cui pulsazioni permettevano che le differenti operazioni della macchina avessero luogo simultaneamente. Questa importante innovazione sarà ripresa con l'ENIAC che in tal modo cambierà stato 200 volte al secondo. EDSAC (Electronic Delay Storage Automatic Computer, 1949) di M. Wilkes, W. Renwick, D. J. Wheeler e collaboratori. Il primo calcolatore elettronico general purpose con programma memorizzato
BINAC (Binary Automatic Computer, 1949) di J. P. Eckert e J. W. Mauchly. Era di tipo general purpose, il primo calcolatore costruito da privati fuori da centri di ricerca.
Figura 16 - l’ENIAC (1946)
I calcolatori degli anni ‘50 sfruttano progressivamente l’utilizzo dei neonati transistor (di maggior affidabilità, minor potenza, minori dimensioni) creati nei laboratori Bell nel 1947, memorie a nuclei di ferrite(magnetici), memorie di massa a nastro magnetico, sistema operativo, linguaggi ad alto livello.
Linguaggio formale Sembra ragionevole introdurre la definizione di linguaggio formale in quanto nasce in questo periodo storico ed e’ alla base dello sviluppo dell’ intelligenza artificiale, dello studio della correttezza dei linguaggi di programmazione e quindi dell’ informatica teorica. In matematica, logica, informatica e linguistica, per linguaggio formale si intende un insieme di stringhe di lunghezza finita costruite sopra un alfabeto, cioè sopra un insieme finito di oggetti tendenzialmente semplici che vengono chiamati caratteri, simboli o lettere. Si può parlare di linguaggio formale anche in senso non strettamente tecnico in vari contesti (scientifici, legali, amministrativi, di progetto, di normativa, ...), per intendere un linguaggio che si serve di termini e di espressioni scelte con cura maggiore di quella impiegata nel parlare comune, al fine di eliminare o ridurre ogni ambiguità di interpretazione. Un criterio per distinguere un linguaggio formale consiste nel valutare se si possa sottoporlo ed elaborazioni automatiche Nei primi anni ’50 uno studente di Church, Stephen Kleene (1909-1994) coniò il termine espressione regolare. Diede un grosso contributo allo studio della teoria ricorsiva inventando le espressioni normali, fornendo i metodi di determinazione su quali problemi sono risolvibili e quali funzioni sono computabili. Creò la stella di Kleene per caratterizzare e determinare automazioni. John Von Neumann (1903-1957) , entrò nel gruppo di lavoro dell’ ENIAC modificandone la programmazione, che fino ad allora richiedeva una manipolazione diretta ed esterna dei collegamenti, era così ridotta ad un'operazione dello stesso tipo dell'inserimento dei dati. L’ENIAC diveniva la prima realizzazione della macchina universale inventata da Alan Turing nel 1936: in altre parole, un computer programmabile nel senso moderno del termiFigura 17 ne. Nel frattempo un nuovo modello di computer, l'EDVAC(1951), era in cantiere, e von Neumann ne assunse la direzione. Nel 1945 egli scrisse un famoso rapporto teorico, che divenne un classico dell'informatica: in esso la struttura della macchina era descritta negli odierni termini di memoria, controllo, input e output. Si dedicò alla progettazione di un nuovo calcolatore, producendo una serie di lavori che portarono alla definizione di quella che oggi è nota come “architettura von Neumann”: in particolare, la distinzione tra memoria primaria (ROM) e secondaria (RAM) e lo stile di programmazione mediante diagrammi di flusso. Debutta l'IBM 650 (1953), conosciuto anche col nome di calcolatore a tamburo magnetico e diventa il primo computer prodotto industrialmente. Con questa macchina si può affermare che è nato il primo minicomputer. Ne verranno venduti
450 già nel primo anno di produzione. Nei successivi 15 anni ne saranno prodotti e venduti più di 1500, che per questo periodo è un record assoluto. Come il 701, anche il 650 può leggere e scrivere sia da nastro magnetico che da schede perforate. Le schede perforate sono anche usate per introdurre il programma da eseguire ed ogni scheda rappresenta una istruzione a tre indirizzi, comprendendo cioè anche quello dell'istruzione successiva. Un grande passo in avanti viene effettuato da, John W. Backus che imposta il linguaggio di programmazione scientifica FORTRAN (FORmula TRANsalot) per il sistema IBM 704. Ingegneri e scienziati sceglieranno definitivamente questa strada per la programmazione dei computer, abbandonando il metodo di modificare il cablaggio interno delle macchine per cambiarne il programma da eseguire. 1956 : l'IBM introduce e inizia le installazioni dei sistemi RAMAC 305 (RAMAC = Random Access Method Of Accounting And Control). Sarà questo il primo passo per trasferire i dati (records) dal supporto delle vecchie e ingombranti schede perforate, alle unità a dischi magnetici. I calcolatori di seconda generazione 1956-1963 Vengono definitivamente abbandonate le valvole per lasciare posto ai transistor un dispositivo a stato solido composto da un materiale semiconduttore ( il germanio che poi fu sostituito con il silicio), che funge da rettificatore e amplificatore per la corrente e che sostituisce presto le fragili e ingombranti valvole. L'introduzione dei transistori al posto delle valvole, all'interno del computer, aumenta notevolmente la velocità di elaborazione dei dati e permette di ridurre notevolmente le dimensioni, non ché i guasti. Nascono i “chip”.
Differenza Transistor-Valvola Figura 18
Alla fine del 59 nascono più di 200 linguaggi di programmazione, tra cui il COBOL (Common Business Oriented Language). La DEC l’anno successivo introduce il PDP-1 il primo computer commerciale con monitor e tastiera per l’input. 1963: L'American National Standards Institute (ANSI) accetta l'ASCII (American Standard Code for Information Interchange) con codice a 7 bit per lo scambio d'informazioni, che diventa così uno standard mondiale, ancora in uso oggi. Prima di allora ogni computer usava un suo sistema di rappresentazione dei dati, per cui per scambiare informazioni tra macchine diverse bisognava sempre utilizzare tavole di conversione. 1963 Douglas Engelbart inventa il mouse, come dispositivo di puntamento, allo Stanford Research Institute, nell'ambito di una ricerca di un sistema per gli ipertesti. Lo stesso anno la IBM mise in vendita il primo programma di "Word processor" (elaboratore di testi) del mondo. I calcolatori di terza generazione 1964-1970 I computer di questa generazione differiscono da quelli della precedente per l’utilizzo di circuiti integrati a scapito dei transistor. La IBM ormai azienda leader adotta linguaggi di programmazione Assembler, RPG (Report Program Generator) e COBOL. Il sistema operativo può essere memorizzato su nastro (TOS) oppure su disco (DOS). In particolar modo sul IBM System/360, il primo elaboratore a circuiti integrati. La novità di questa macchina risiedeva nella possibilità di essere potenziata aumentando la capacità della memoria o addirittura aggiungendo altri elementi.
Figura 19
La costruzione del primo Floppy Disk da 8 pollici da parte della IBM risale al 1967, anno in cui vengono sviluppati i linguaggi ADA e SIMULA (il primo linguaggio object-oriented). L’ IBM rilascia il primo 360/91, una macchina che introduce il concetto di "pipeline", per incrementare le prestazioni del computer anche del 33%, inventato da Robert Tomasulo. La serie 360 usa una cache memory super veloce. Questa memoria ha mostrato infatti d'essere fino a 12 volte più veloce della standard magnetic core memory, con tempo medio d'accesso di 80 nano secondi.
Nel 1968 nasce la INTEL Inc. (INTegrated ELectronics) che si evidenzia per aver rivoluzionato il mondo dei computer con l’introduzione di nuovi dispositivi, produsse la prima RAM ("Random Access Memory" ), la memoria a semiconduttori da 1 Kbyte, che fu adottata immediatamente nella costruzione di nuovi computer al posto delle vecchie memorie a nuclei magnetici di ferrite.
Ritchie Dennis e Thompson Ken nel 1969 iniziano allora a lavorare su una loro idea di sistema operativo, che anziché essere orientato alla multiutenza si dirigerà ad un unico utente. Per questo (e scherzando sul nome Multics) lo chiameranno UNIX. La prima versione girerà su un PDP-7 della Digital Equipment Co. (DEC) e sarà completata entro lo stesso anno. Il programma è scritto in assembler PDP-7. UNIX diventerà una potenza nel mondo dei sistemi operativi. In questo anno diventa uno standard mondiale l’interfaccia seriale RS-232-C, che consente le comunicazioni tra qualsiasi tipo di computer e periferica. Il Dipartimento della Difesa USA commissiona ARPANET (Advance Research Projects Agency Net) per ricerche sulle reti e i primi 4 nodi diventano operativi all'UCLA, UC Santa Barbara, SRI e all'Università dello Utah. L'esperimento servirà a connettere vari centri di ricerca negli USA, tramite un sistema di comunicazione a commutazione di pacchetti (packet-switching network). Diventerà la più grande rete mondiale, con milioni e milioni di persone collegate e si chiamerà INTERNET. Nel 1970 la IBM propone sul mercato il IBM System/370 in cui compare l’innovazione della memoria virtuale, che consente una gestione totalmente automatica di carico/scarico di parti di programma, non richieste in un determinato momento, da disco a memoria centrale. Inoltre e’ previsto un sistema di virtual storage, che consente di caricare in memoria parti di dati di cui il sistema prevede il prossimo utilizzo. Nello stesso anno nasce il PASCAL che consente ai programmatori di dividere un programma in vari blocchi chiamati "funzioni" e "procedure". Rende il codice programma più facile da capire e da manutenere. Il PASCAL sarà il linguaggio scelto da molte università e college nei successivi 20 anni. I calcolatori di quarta generazione 1971-oggi Lo sviluppo tecnologico ha fatto passi da gigante e i computers diventano un fenomeno di massa, ciò è dovuto ad un abbattimento dei costi e una miniaturizzazione e affidabilità delle componenti. Il 1971 fu un altro anno importantissimo per la storia dei computer, quando gli ingegneri elettronici della Intel, l'italiano Federico Faggin e gli americani Marcian Edward Hoff jr. e Stanley Mazer, diedero vita al "motore" dei futuri "Pc", il microprocessore. I tre riuscirono a concentrare su una piastrina di quattro millimetri per tre un "supercircuito integrato" contenente ben 2.250 transistor, la futura CPU ("Central Processing Unit" ) che costituivano tutti i componenti di un'unità centrale di elaborazione: in breve, il "cervello" e la "memoria" di entrata e uscita. L'anno successivo, sempre Faggin e Hoff jr. realizzarono il microprocessore "8008", il primo "chip" da 8 bit di uso universale. L’unoco inconveniente di questa macchina era di possedere una memoria statica capace di memorizzare dati solo in presenza di alimentazione. Il problema fu risolto dall’IBM che sopperì a questo inconveniente con l’uscita dell’ IBM
3340 che adottava la tecnologia di memoria su Hard Disk (dischi di alluminio magnetizzati). La Commodore è il primo produttore che mette sul mercato un calcolatore elettronico compatto, come prodotto di massa. Sino ad oggi i calcolatori erano pesanti, complicati e molto costosi per la media delle persone.
Figura 20 I processori 4004 -8008 Nel 1972 Dennis Ritchie riscriverà il "B" e battezzerà il nuovo linguaggio con la lettera "C". Questo linguaggio sarà utilizzato l’anno successivo per riscrivere UNIX. 1975, forse la più importante di tutta la storia dell'informatica. E' l'anno, infatti, in cui due studenti universitari, William "Bill" Gates e Paul Allen, diedero vita a una piccolissima azienda che elaborava linguaggi per "computer" , la Microsoft .La fortuna di questa piccola società fu la creazione del linguaggio Basic. Quasi in concomitanza, esattamente nel luglio 1976, a Palo Alto, in California, due giovani dal passato " hippie", Stephen Jobs e Stephen Wozniak, costruirono l'"Apple I", dando vita all'omonima azienda, battezzata come la casa discografica creata quasi dieci anni prima dai Beatles. Sarà proprio la Apple la grande rivale della Microsoft, soprattutto per il fatto che entrambe hanno usato fin dall'inizio un linguaggio di programmazione completamente diverso. Nel corso degli anni ’70 escono sul mercato una serie importante di processori tra queste ricordiamo della intel gli 8086 e 8088, della Zilog lo Z-80. Entrando nel mercato dei PC (1981), l’IBM adotta come sistema operativo l’MSDOS ( Microsoft - Disc Operating System ) con il quale sono cresciuti e hanno appreso i rudimenti dell'informatica milioni di persone.
Il completamento del protocollo TCP/IP nell’ 1983 segna la creazione di Internet globale. Nello stesso anno nei laboratori AT&T Bell, Bjarne Stroustrup lavora sul C++, un'estensione Object Oriented del linguaggio C. Nel 1984 in gennaio viene annunciato dalla Apple il personal computer Macintosh. Si tratta finalmente di una macchina interamente grafica, abbordabile come prezzo, anche se più cara di un PC IBM, Il monitor (rigorosamente in bianco e nero) è integrato con la CPU, la tastiera è povera di tasti, ma efficace al tocco, come il mouse, che presenta un solo tasto. L'interfaccia grafica è semplice e completa, simulando una scrivania, con le varie cartelle (in forma di icone), dispositivi di memorie (floppy e disco fisso) e cestino per i documenti da buttare. Viene fornito già corredato di scheda grafica e qualche semplice programma come editor di testi e di disegno. La Sony e Philips introducono i primi CD-ROM, che forniscono una enorme capacità di registrazione dei dati (fino a 640mb). Negli anni ’80 il mercato propone i seguenti processori l’ MC68020(250.000 transistor,Motorola) , Intel 80286(16 bit), 80386(32 bit), 80486(32 bit,1.2 milioni di transistor). Questo decennio vede lo sviluppo di Windows 1.0 che introduce gli aspetti tipici del Macintosh nei computer DOS compatibili, infatti la Apple accusa la Microsoft di aver creato un software che ricorda troppo il sistema operativo Macintosh. Gli anni ’80 si concludono con il Tim Berners-Lee propone il progetto World Wide Web (WWW) al CERN che svilupperà il prototipo nel 1990 .Quattro anni dopo, l’uscita del primo browser della Netscape crea il boom di navigatori del Web. Un personaggio molto significativo è Robert Milner ha aperto nuove frontiere in almeno due importanti aree di ricerca in informatica: la teoria della programmazione funzionale e la teoria della programmazione concorrente. Nel primo campo il risultato delle sue ricerche pluriennali si è concretizzato nel linguaggio di programmazione Standard ML, oggigiorno largamente usato, specialmente nel mondo accademico, come linguaggio introduttivo alla programmazione per la sua semplicità d'uso Figura 21 e rigorosa chiarezza di progetto. Forse ancora maggior impatto ha avuto però la sua proposta di una moderna teoria di modellazione di sistemi concorrenti, teoria che ha avuto un significativo seguito in tutto il mondo. Frutti di questi studi sono i linguaggi CCS e pi-calcolo, che sono oggi usati in moltissimi contesti, anche industriali. Tipiche aree applicative per questi linguaggi sono, ad esempio: - specifica e verifica di protocolli di comunicazione (tra questi, quelli che quotidianamente usiamo, ad esempio, per la posta elettronica); oppure la - verifica di correttezza del progetto di circuiteria hardware. Un derivato di CCS, il linguaggio LOTOS, è lo standard internazionale ISO per specificare protocolli di comunicazione; e in un certo senso dobbiamo anche a Milner se oggi questi protocolli sono più sicuri, affidabili e, in generale, corretti.
La definitiva consacrazione della Microsoft grazie all’ uscita sul mercato di diverse versioni sistemi operativi Windows(95,98,CE,2000,ecc.), è completa. In competizione con i sistemi operativi offerti dalla Microsoft nasce Linux dall’ideatore Linus Benedict Torvalds. Questo sistema ha Figura 22 Figura 23 come particolarità l’ Open Source, l’idea della condivisione del software libero (non gratuito) formalizzata da Richard Stallman nel “manifesto GNU”, nel quale traccia la linea di pensiero secondo cui il software deve essere libero e condiviso tra gli utenti interessati potendo così essere anche modificato. Contemporaneamente si sviluppano uno dei più grandi siti di e-commerce Amazon, il linguaggio di programmazione Java (piattaforma indipendente per lo sviluppo di applicazioni Object Oriented) e viene rilasciato un nuovo standard di porta comunicazione per PC, denominato USB, questo nuovo tipo di connessione semplificherà la connessione di innumerevoli dispositivi collegabili al PC: mouse, scanner, fotocamere, webcam, drive portatili, ecc. Oltre alla praticità, la nuova porta di connessione (plug'n play) risulta particolarmente veloce, soprattutto quando verrà fornita la versione USB 2. I calcolatori di quinta generazione. Il futuro… Rappresentano i computer di domani dove l’interazione uomo macchina non sarà più eseguita dall’ uso di strumenti come mouse e tastiere , bensì tramite comandi vocali e sistemi di apprendimento tipici dell’ intelligenza. Queste innovazioni ad oggi si pensa saranno possibili tramite lo sviluppo dell’ intelligenza artificiale
Grafico 0.1
CAPITOLO II Rappresentazione delle Informazioni Rappresentazione posizionale La rappresentazione posizionale in primo luogo, permette di scrivere in modo efficiente numeri anche molto grandi. Con i sistemi precedenti, ad esempio il sistema di numerazione romano (M,C,V,I), questo è, in teoria, possibile, ma certamente non pratico. Potremmo, ad esempio, scrivere qualsiasi numero usando solo il simbolo I, ripetuto a sufficienza (dieci volte per il numero dieci, mille volte per il numero mille, e cosÏ via), ma è chiaro che non andremmo molto lontano.
La notazione decimale posizionale, cui siamo abituati, è quella in cui il significato di uno dei dieci simboli di base (le cifre 0,1,2,3,4,5,6,7,8,9) dipende dalla posizione di questo all' interno della sequenza di cifre. Il numero 361 va interpretato come: 3 centinaia + 6 decine + 1 unità . Ovvero: 3 102 + 6 101 + 1 100 Se invece di usare le dieci cifre usuali ne usiamo solo due (0,1 rappresentabili in un circuito mediante tensione alta e tensione bassa) avremo la possibilità di una rappresentazione posizionale in base due in cui un numero è costituito unicamente da una sequenza di 0 e 1. Il numero 11010 2 va interpretato come 1 24 + 1 23 + 0 22 + 1 21 + 0 20 Ovvero: 110102 = 2610 dove si indica sul basso del numero il tipo di base che si mantiene Codifica dell’informazione, numeri binari e caratteri ASCII (Unità d’informazione: Bit, Byte, Word)
Bit: quantità minima di informazione che può valere solamente 0 od 1. Byte: unità di misura dell'informazione che corrisponde sempre a 8 bits. Parola(word): unità di misura dell'informazione che può corrispondere ad un numero variabile di bits, usualmente corrispondente ad un multiplo di un byte. Valori tipici sono 16, 32, 64, 128 bits. Questo può variare da un sistema ad un altro. Quanta informazione sta in un byte? è facile verificare che la quantità di oggetti numerabili con un certo numero di bits, per esempio , è pari a . Per esempio con un bit si possono rappresentare numeri compresi fra e 1 e con un byte numeri compresi fra e . Nella seguente tabella riportiamo i numeri rappresentabili dato il numero di bit disponibili. Abbiamo visto che con 8 bit possiamo rappresentare numeri compresi fra e tuttavia è bene osservare che il concetto è generale e non concerne solo la rappresentazione di numeri. Infatti, più in generale possiamo parlare di numero di oggetti rappresentabili nel senso che ad ogni configurazione di bit possiamo pensare di associare un oggetto. Per esempio, questo è quello che si fa con la codifica ASCII ove ad ogni configurazione di bit in un byte corrisponde un simbolo; poiché i caratteri ASCII sono codificati in un byte possiamo rappresentare un numero massimo di 256 simboli.
Numero di bit
Numero di oggetti rappresentabili
Tabella 2 Per quantificare varie quantità di uso comune (per esempio capacità di memorizzazione dei dischi, velocità di trasferimento dei dati) il bit ed il byte sono ormai troppo piccoli. È quindi diventato usuale avvalersi di multipli, in modo analogo a quello che si fa con altre unità di misura. È usuale e conveniente utilizzare le potenze della base numerica in cui si lavora per definire i multipli delle unità di misura. Così accade che per esempio il chilogrammo ( 1Kg=103=1000g ). I multipli delle unità di misura delle informazioni sono un po' diversi a causa del fatto che viene naturale lavorare con le potenze di due. Succede quindi che l'unità di misura che esprime il "migliaio di byte" non corrisponda esattamente a 1000 byte bensì alla potenza di 2 che più si avvicina a 1000 byte: =1024. Analogamente per gli altri multipli che riportiamo nella tabella seguente. Multiplo di byte
Numero effettivo di byte
KiloByte (KB) MegaByte (MB) GigaByte (GB) TeraByte (TB) PetaByte (PB) HexaByte (HB) Gli stessi multipli possono essere applicati ai bit ma si usa in tal caso la lettera "b" minuscola: Kb, Mb e via dicendo. È comune utilizzare questi multipli per le velocità di trasferimento dati. Per esempio le reti locali consentono oggi una velocità di trasferimento di 100 Mb/s, 100 MegaBit al secondo.
Sistemi di numerazione binario ottale ed esadecimale I sistemi di numerazione presuppongono la determinazione di una base, che chiamiamo N. Per esempio nel sistema decimale N=10. In generale, un numero per esempio di 4 cifre che indichiamo con abcd, si esprime mediante la seguente espressione : aN3+bN2+cN1+d dove le singole cifre a, b, c, d assumono N valori nell'intervallo: 0,…,N-1 ; Il nostro sistema decimale è quello indio-arabico ma non è l'unico ad essere stato utilizzato. I Babilonesi usavano un sistema sessagesimale in base . I computers ragionano in termini del sistema binario ( ). Gli informatici talvolta usano volentieri i sistemi ottale ( ) o esadecimale ( ) perché sono facilmente convertibili nel sistema binario. Codifica delle informazioni - Rappresentazione dei numeri Numeri interi è quella che utilizza la rappresentazione decimale/binaria posizionale. Numeri con la virgola I numeri del sistema decimale con la virgola mobile (floating point) sono i numeri reali rappresentati in base 10 mediante notazione "scientifica" ovvero moltiplicati o divisi per un opportuna potenza di 10 in modo da poter essere scritti in modo standardizzato come: x.yxwt *10e oppure 0.xyxwt *10 e+1 . Il coefficiente della potenza di 10 viene chiamato mantissa del numero. Nel primo caso la mantissa è x.yxwt , mentre nel secondo è 0.xyxwt. La rappresentazione mediante virgola mobile offre due principali vantaggi: Rende più semplice automatizzare le operazioni aritmetiche e permette di eliminare qualsiasi ambiguità tra zeri significativi e posizionali. Per illustrare quest' ultimo punto cerchiamo di capire come interpretare il valore delle cifre del numero 15000. Chiaramente, si tratta di un numero in cui ci sono 1 decina di migliaia e 5 migliaia. Però, non e' chiaro se i tre zeri che seguono vadano interpretati come " esattamente zero centinaia, zero decine e zero unità" oppure come indicatori del valore di decine di migliaia e migliaia delle cifre precedenti ma senza per questo implicare che il numero in questione corrisponda ad una conoscenza esatta anche di centinaia, decine e unità. Nel primo caso, diremo che si tratta di zeri "significativi" e che le cifre significative del numero sono in tutto 5. Nel secondo caso, gli zeri servono solo ad attribuire il giusto valore posizionale a 1 e 5 ma il numero di cifre significative è 2. Con la rappresentazione in virgola mobile si definiscono significative tutte le cifre (zeri inclusi) che siano a destra della prima cifra diversa da zero.
In notazione binaria il concetto di numero a virgola mobile si estende in modo diretto. Inoltre, poiché le cifre possono essere solo 0 oppure 1, se si opta per la forma "normalizzata" 1.xyzt *2e, in cui la mantissa 1.xyzt inizia sempre per 1, possiamo omettere di indicare l'1 prima del punto risparmiando un simbolo per rappresentare la mantissa. Per standardizzare la rappresentazione di numeri binari floating point è necessario decidere quanti bit utilizzare e come ripartirli tra mantissa ed esponente. Esistono moltissime possibili soluzioni e, in principio, i linguaggi di programmazione dovrebbero essere "neutri" rispetto alle convenzioni di rappresentazione. Di fatto, negli ultimi 10 anni si è imposto lo standard IEEE 754 che prevede almeno due rappresentazioni: una "corta" che utilizza 4 bytes, ovvero 32 bit ripartiti in: 1 bit per il segno della mantissa, 23 bit per la mantissa, senza il primo 1 (bit nascosto), ed 8 bit per l' esponente espresso come intero binario nella forma con bias 127. Una "più lunga" o "a precisione doppia" che utilizza 8 bytes (64 bit) ripartiti in: 1 bit per il segno della mantissa, 52 bit per la mantissa, senza il primo 1 (bit nascosto), ed 11 bit per l' esponente espresso come intero binario nella forma con bias 1023. Inoltre, due dei possibili valori dell' esponente sono in realtà riservati per esprimere dei valori speciali risultanti da possibili operazioni aritmetiche mal definite come divisioni per zero o rapporti del tipo 0/0, nonché per rappresentare lo zero e un insieme di numeri "denormalizzati" per cui non vale la convenzione del bit nascosto. In dettaglio, per numeri a 32 bit la codifica è la seguente. Indichiamo con S, M ed E i campi di 1, 23 e 8 bit riservati alla codifica di segno (della mantissa), mantissa ed esponente. Il campo "esponente", E, dei floating assume valori tra 0 e 255. I valori di E da 1 a 254 permettono di esprimere numeri normalizzati in cui il primo bit (nascosto, cioè non rappresentato esplicitamente) della mantissa è 1 (a sinistra del punto) e gli esponenti vanno da -126 a +127. In altre parole, il valore del numero rappresentato da S,M ed E sarà (-1)S 1.M 2E-127 . Percio' il più piccolo numero normalizzato è 1.000...000 2 -126 che corrisponde approssimativamente a 10 -37 , mentre il più grande ( 1.111...111 2 +127 ) corrisponde a circa 10 +38 . Se il campo E è zero e M è zero, si ha lo zero, di cui esiste un valore positivo ed uno negativo a seconda del valore di S (0 o 1). Zero positivo e zero negativo devono essere trattati dai linguaggi di programmazione come perfettamente equivalenti. Se il campo E e' zero mentre M è non nullo si tratta di numeri in cui la mantissa va interpretata come 0.M e la potenza di 2 come -126. Questi numeri "denormalizzati" permettono di rappresentare valori compresi tra circa 1045 e 10-37 al prezzo di un crescente perdita di precisione (diminuzione delle cifre significative) man mano che ci si avvicina allo zero. Se il campo E è 255 e M è 0 si considera il valore come segnale di un "overflow" ed il valore viene indicato come + o - infinito a seconda del segno. Infine, se il campo E è 255 ed M è non nullo, si attribuisce a tale sequenza il valore NaN ( Not a Number ) che solitamente sta a segnalare il risultato di operazioni aritmetiche non definite come per esempio il calcolo del rapporto 0/0. In modo analogo per floating a 64. In questo caso il campo esponente e' di 11 bit (e la rappresentazione è mediante interi con bias 1023) mentre quello mantissa diviene di 52 bit (con in più il bit nascosto per i numeri normalizzati). Da
notare che i valori speciali NaN ( o nan ) e +/- infinito dello standard IEEE non sono intesi come elementi dell' insieme dei numeri reali ma come valori speciali da utilizzare nella programmazione per avviare eventuali procedure di manipolazione delle condizioni di errore. Talvolta un compilatore può generare automaticamente codice di gestione delle condizioni di errore nascondendo al programmatore la possibilità di accedere ai valori speciali dello standard IEEE-754. Tuttavia, normalmente, esistono opzioni del compilatore che permettono di evitare la gestione automatica. Numeri con segno: Nella notazione decimale, i numeri negativi vengono espressi con il segno -. In una rappresentazione binaria questo potrebbe essere ottenuto tramite un bit aggiuntivo che porti l'informazione sul segno (un bit può rappresentare due possibilità). Per esempio i numeri compresi tra -3 e 3 potrebbero essere rappresentati con tre bit (2 per il valore assoluto, uno per il segno) come segue: -3 -2 -1 -0 0 1 2 3
111 110 101 100 000 001 010 011
Tabella 3 Questa rappresentazione ha tuttavia lo svantaggio di avere due diverse rappresentazioni per lo zero, sprecando quindi una possibile combinazione (si ricordi che con n bits è possibile rappresentare 2n possibili combinazioni). In pratica si utilizza una diversa codifica per i numeri interi con segno. In questa codifica, chiamata complemento a due, il bit più significativo indica ancora il segno (1 per indicare numero negativo), ma i rimanenti bit non codificano direttamente il valore assoluto del numero. La seguente tabella indica la codifica in complemento a due dei numeri rappresentabili con 4 bits.
-4 -3 -2 -1 0 1 2 3 Tabella 4
100 101 110 111 000 001 010 011
Formalmente, un numero espresso in complemento a due tramite la sequenza di cifre binarie (pari a 0 o a 1) anan-1...a1a0 ha il seguente significato: -an2n + an-12n-1 + ... + a121 + a020 Si osservi la differenza rispetto alla semplice codifica binaria in cui il termine piÚ a sinistra appare col segno positivo. Con n bits si possono rappresentare in complemento a due i numeri compresi tra -2n-1 e 2n-1-1. Una caratteristica molto utile dei numeri in complemento a due è data dalla possibilità di seguire operazioni di somma di numeri negativi e positivi. A tal scopo è sufficiente eseguire la somma con le stesse regole della somma in colonna, ricordando che in binario si ha:
Tabella 5. La somma Binaria
Esempio: 0101+0010=0111 ;5 + 2 = 3 Nel caso si avesse un riporto al di fuori della cifra più significativa (più a sinistra) questi può essere ignorato, a patto che non si ottenga come risultato un numero che non può essere rappresentato con il numero di bits a disposizione. Tale condizione viene chiamata overflow. Esempio: somma con 4 bits senza overflow 0101 + 5 + 1110 = -2 = 10011
3
In questo caso il risultato può essere rappresentato con 3 bits Esempio: somma con 4 bits con overflow 0101 + 5+ 0011 = 3 = 1000
-8 !!
In questo caso infatti il risultato corretto (8) non può essere rappresentato con 4 bits (che possono rappresentare i numeri compresi tra -8 e 7). E' possibile determinare quando si ha una condizione di overflow verificando i riporti che si hanno dalla cifra più significativa e dalla cifra immediatamente precedente (a destra). Se non si ha nessun riporto a partire da queste due cifre, o si ha riporto in entrambi i casi, non si ha overflow. Se invece si ha riporto in una sola delle due cifre si ha overflow. Esaminando l'esempio precedente senza overflow si può verificare che si è avuto riporto in entrambe le cifre, mentre nell'esempio con overflow si è avuto un solo riporto a partire dalla cifra immediatamente precedente la più significativa. E' possibile invertire il segno di un numero in complemento a due invertendo tutti i bits (da 0 ad 1 e viceversa) e sommando 1. In questo modo è possibile eseguire operazioni di sottrazione con la stessa circuiteria logica necessaria per eseguire le somme: basta invertire il segno del termine da sottrarre e quindi eseguire un'operazione di somma.
In tutti i calcolatori attuali i numeri interi vengono rappresentati in complemento a due. Dimensioni tipiche sono le seguenti:
byte (8 bits), può rappresentare i numeri compresi tra -128 e 127 word (16 bits), può rappresentare i numeri compresi tra -32768 e 32767 longword (32 bits), può rappresentare i numeri compresi tra -2.147.483.648 e 2.147.483.647
Rappresentazione di caratteri I caratteri ASCII (American Standard Code for Information Interchange). La codifica ASCII associa ad ogni carattere una particolare sequenza di 0 ed 1 in un byte. Esistono varie versioni dei caratteri ASCII. Le due più importanti sono la tabella ASCII standard che usa solo 7 bits che serve solo per i caratteri inglesi e la tabella ASCII estesa (ISO-Latin-8859) che usa tutti gli 8 bits e che può rappresentare i caratteri di tutte le lingue occidentali. La maggior parte dei programmi di elaborazione di testo in circolazione utilizza questo tipo di codifica. Potete vedere una tabella dei caratteri ASCII di seguito.
Tabella 6 ASCII
Caratteri Unicode. Esiste uno standard di codifica piÚ ampio, denominato Unicode, che impiega 2 bytes per ogni carattere ed è in grado di codificare i caratteri di tutte le lingue conosciute. Questo standard tuttavia non si è ancora diffuso. I caratteri in verde nella tabella ASCII sono una particolare estensione dovuta a Microsoft. Il codice relativo ad un certo carattere si ricava sommando il valore in ordinata a quello in ascissa, per esempio per il carattere 40+E=4E abbiamo , risultato espresso in esadecimale. è veramente facile convertire i numeri esadecimali in binario. Basta sostituire ad ogni cifra decimale il corrispondente gruppo di 4 cifre binarie dedotto dalla tabella 7. Esadecimale Binario 0
0000
1
0001
2
0010
3
0011
4
0100
5
0101
6
0110
7
0111
8
1000
9
1001
A
1010
B
1011
C
1100
D
1101
E
1110
F
1111 Tabella 7
Quindi l'espressione binaria del numero esadecimale 4E, che rappresenta il codice ASCII del carattere e, sarà 01001110. La codifica ASCII è l'ingrediente essenziale di qualsiasi testo. è tuttavia opportuno distinguere i testi scritti in semplice ASCII dagli altri. I testi scritti in ASCII non sono altro che una sequenza di byte ognuno dei quali rappresenta un simbolo alfanumerico secondo la tabella ASCII che abbiamo appena visto. Questo tipo di testo viene prodotto su di un PC ed eventualmente modificato con i cosiddetti editori di testo. Alcuni esempi di editori di testo sono Edit nel sistema DOS, Notepad nel sistema Windows (Notepad è sempre disponibile in Windows, lo potete cercare nel menu avvio, programmi, accessori), Vi, Pico, Emacs nel sistema Linux; ve ne sono tantissimi altri. Sapete tuttavia che esistono molti altri programmi per la produzione di testi che sono comunemente noti come elaboratori di testo o word processor. Questi usano come ingrediente base il codice ASCII ma in realtà usano anche altre codifiche che servono a manipolare i testi e ad arricchirli esteticamente, cosa impossibile con i soli caratteri ASCII. Se per esempio scrivete un testo e lo salvate in un file con uno dei vari programmi Word disponibili, in quel file non vengono memorizzati solo i caratteri ASCII corrispondenti alle varie lettere e numeri che voi avete scritto bensì tante altre informazioni che descrivono il tipo di cartteri usati (si chiamano font: Courier, Time Roman, Helvetica e via dicendo), la loro dimensione, effetti speciali quali grassetto, corsivo, sottolineato e così via, modo in cui si presentano i paragrafi (rientro iniziale, spazio fra un paragrafo e l'altro ...), interlinea ed una miriade di altre possibili caratteristiche. Tutte queste informazioni che vanno oltre alla mera rappresentazione dei caratteri ASCII (che producono gli editori di testo) va sotto il nome di formattazione. Per inciso, questa formattazione non c'entra nulla con la formattazione che concerne lo schema di logico di suddivisione della superficie di un disco magnetico, è evidente che due file contenenti lo stesso identico testo, uno scritto con un editore di testo in caratteri ASCII semplici e l'altro scritto con un word processor (e quindi ``formattato''), hanno dimensioni molto diverse. Chiunque può sperimentare che scrivendo un testo semplicissimo, pippo tanto per cambiare, prima con un editore di testo e poi con un word processor: Si nota che il file con i caratteri ASCII sarà fatto di 5 byte (corripondenti ai 5 caratteri della parola ``pippo'') mentre quello formattato sarà lungo circa 20000 byte! Il testo pippo scritto in ASCII è 70 69 70 70 6f
pippo
Essere coscienti di cosa si impiega per scrivere un testo è utile in funzione di quello che si vuole fare in seguito. La formattazione di un testo può essere estremamente utile per metterne in debito rilievo alcune parti ma a volte ci interessa esclusivamente il suo contenuto. In questo secondo caso l'abitudine di scrivere sempre tutto in modo
formattato può condurre ad un'esagerata occupazione dello spazio su disco dove vengono memorizzati i file che contengono i testi. Oppure nel caso in cui i testi debbano essere trasmessi attraverso la rete si può causare un inutile sovraccarico della medesima. In questo senso è una cattiva abitudine quella di allegare qualsiasi cosa in modo formattato ai messaggi di posta elettronica anziché scrivere semplicemente il testo dentro al programma di posta elettronica: spedire pippo in ASCII anziché in modo formattato è 20000/5=4000 volte più veloce! Questo tipo di riguardo nell'uso della rete prende il nome di netiquette. è un concetto che concerne la coscienza che si sta usando uno strumento che serve a tutti e che un uso accorto lo può rendere più efficiente per tutti, quindi alla fine anche per se stessi(ne parleremo avanti ). Rappresentazione dei segnali audio La rappresentazione dei segnali audio richiede due passi: il campionamento dei segnali e la quantizzazione. o
o
Campionamento. Il campionamento consiste nella estrazione di un insieme di campioni da un segnale continuo. Usualmente i campioni sono equispaziati nel tempo ma non è una condizione necessaria. Esiste un teorema, dovuto a Nyquist, che stabilisce la frequenza minima alla quale bisogna campionare un segnale per essere sicuri di non perdere informazione. Questo teorema si rifà alla descrizione di un segnale in termini delle frequenze che lo compongono. Una comprensione completa di questo concetto richiederebbe la nozione di trasformata di Fourier. Ci limitiamo qui a dire che in virtù della teoria di Fourier, qualsiasi segnale è scomponibile in una varietà di componenti che sono delle semplici oscillazioni costanti, ognuna caratterizzata da una ben precisa frequenza di oscillazione. Nella realtà i segnali sono sempre caratterizzati da una frequenza massima. Il teorema di Nyquist dice che la frequenza minima alla quale un segnale deve essere campionato per non perdere informazione è pari al doppio della massima frequenza presente nel segnale. Quantizzazione. Ogni valore campionato deve essere trasformato in un numero digitale. Questo è un processo che prende il nome di conversione analogico-digitale ed è svolto da un componente che prende il nome di ADC (Analog to Digital Converter).
Rappresentazione delle immagini Con l'estensione dell'utilizzo delle applicazioni multimediali nei Personal Computers, diventa sempre più diffuso l'utilizzo delle immagini, statiche ed in movimento nei calcolatori. Memorizzare un'immagine in formato binario richiede la "discretizzazione" dell'immagine in un certo numero di componenti, detti pixels, corrispondenti ai singoli punti sullo schermo quando l'immagine venga visualizzata su video. Risoluzioni tipiche degli schermi (pixels per riga x pixels per colonna) sono 640x480, 800x600, 1024x864, 1152x864, 1280x1024. Se si tiene conto che è necessario associare un colore ad ogni pixel richiedendo uno o due bytes (definendo rispettivamente 256 e 65536 toni di colore), ci si può rendere facilmente conto della quantità di memoria necessaria per immagazzinare le immagini. Per questo motivo le immagini non vengono normalmente immagazzinate come una semplice sequenza di colori associati ad ogni pixel, ma vengono utilizzati dei formati che consentano una compressione, ovvero una riduzione della memoria richiesta per le immagini. I due formati utilizzati più frequentemente sono il formato gif ed il formato jpeg. Nel formato gif viene eseguita una compressione, tuttavia è possibile ricostruire esattamente l'immagine di partenza. Gli algoritmi di compressione si basano di norma sull'osservazione che non è necessario memorizzare una sequenza di bits tutti uguali, ma è sufficiente, ad esempio, memorizzare il numero di tali bits nella sequenza. Nel formato jpeg, invece, vengono memorizzati i coefficienti della trasformata bidimensionale di Fourier dell'immagine. Di conseguenza, a fronte di una maggiore compressione operabile, non è possibile ricostruire la stessa sequenza originaria di pixels. La qualità dell'immagine risulta tuttavia perfettamente accettabile all'occhio umano. Riportiamo le sigle di alcuni dei più diffusi formati TIFF Tagged Image File Format GIF
Graphics Iterchange Format (Formato concepito per l'invio di immagini in rete)
JPEG Joint Photographers Experts Group (Per immagini fotografiche) BMP Bitmap (formato tipico di Windows) PCX
PC Paintbrush (formato di questo popolare programma Windows)
PICT Formato Macintosh (anche vettoriale) Tabella 8
Oltre alle immagini statiche, e' possibile immagazzinare sequenze di immagini, ovvero filmati. Un formato molto utilizzato per memorizzare sequenze di immagini è il formato mpeg, che rappresenta un'estensione del formato jpeg. In mpeg, la compressione viene eseguita andando a memorizzare non la semplice sequenza di immagini, ma soltanto le differenze tra l'immagine (frame) corrente ed il frame precedente. Come il formato DVD che consente di immagazzinare interi films compresa la colonna sonora. Rappresentazioni ipertestuali Il successo e la diffusione di Internet è la conseguenza della diffusione di strumenti informatici (browsers) che consentono di visualizzare non solo testi ed immagini, ma anche formati più complessi e che consentano la "navigazione", ovvero il collegamento ad altre pagine di informazione attraverso un semplice click del mouse. Utilizzando un browser per visualizzare un testo si può osservare che non solo vengono visualizzate le singole lettere e parole del testo, ma il testo stesso è anche formattato. Ad esempio, si può osservare che i titoli utilizzano un font più grande, alcune parole sono sottolineate, sono definite alcune tabelle, etc. Tutto ciò richiede un'informazione aggiuntiva rispetto alla codifica ASCII del semplice testo, e viene ottenuto inserendo delle parole chiave (tags), normalmente racchiuse tra parentesi angolari. I tags vengono riconosciuti dal browser che provvederà a rimuoverli dal testo, ed ad utilizzarli per una corretta formattazione. Tale codifica prende il nome di HTML (Hyper Text Markup Language) ed è normalmente utilizzata per la visualizzazione di pagine Web. Ad esempio, se si sta usando Internet Explorer e si prova a selezionare la voce visualizza->HTML , si potrà visualizzare il sorgente HTML, ovvero il formato originale del testo fornito dal Web server al browser. Tra i vari tags definiti in HTML, il tag <A> viene definito per specificare un link. A tale tag sarà associata l'informazione che specifica l'indirizzo della nuova pagina Web cui il browser si collegherà quando verrà fatto click sull'elemento corrispondente. Gli indirizzi Web sono specificati come URL (Uniform Resource Location) e specificheranno il tipo di protocollo, l'indirizzo IP del Web server e l'indicazione (opzionale) del file da accedere. Ad esempio l'URL http:://www.uniroma2.it/didattica specifica la locazione: la prima parte (http::) specifica il protocollo di comunicazione http (a sua volta basato su TCP/IP, il protocollo di internet), la seconda parte indica l'indirizzo http:://www.uniroma2.it/didattica del server Web, e l'ultima parte didattica/.. specifica la directory ed il file contenenti il testo HTML. In maniera analoga vengono specificate le immagini inserite nel testo, tramite il tag <img> e specificando l'URL del file contenente l'immagine (normalmente in formato gif o jpeg).
Oltre a testi, links ed immagini possono essere inserite funzioni più sofisticate all'interno di una pagina Web. Ad esempio è possibile far eseguire al browser un applet, ovvero un programma Java eseguito dal browser, la cui uscita grafica viene inserita nella pagina ed il cui codice viene fornito dal Web server. Questo approccio consente una completa flessibilità nella definizione delle funzioni della pagina Web. Compressioni delle informazioni Tecniche di compressione conservative Con queste tecniche l'infomazione compressa viene recuperata in maniera completa senza alcuna forma di degradazione. Le più note sono la codifica RLE (Run Legth Encoding) che sfrutta le ripetizioni di bytes uguali, la codifica LZW (Lempel Ziv Welch) che impiega le ripetizioni di stringhe di caratteri uguali e la codifica di Huffman che utilizza codici di rappresentazione piú brevi per i caratteri che appaiono piú frequentemente in un testo. I più popolari programmi di compressione quali WinZip utilizzano questo tipo di metodi. è evidente che il grado di compressione dipende dal contenuto dell'oggetto da comprimere. Se si tratta di un testo con molte ripetizioni il livello di compressione sarà maggiore. Per quanto riguarda le immagini, la presenza di larghe aree uniformi favorisce la compressione. Tecniche di compressione non conservative Oggi vi è una grande necessità di elevate quantità di informazioni. Trasmettere in rete files molto grandi significa amplificare i tempi di trasmissione. Questo problema ha stimolato lo sviluppo di tecniche di compressione ancora più potenti che sfruttano il fatto di potere assumere che una parte delle informazioni siano irrilevanti per l'utente finale. Queste tecniche si chiamano non conservative perché non consentono un recupero completo delle informazioni originali. I segnali audio e le immagini sono esempi tipici di applicazione di tali metodi. Il formato MP3 La digitalizzazione dei segnali audio richiede l'impiego di una grande quantità di bytes. Per esempio un segnale audio può essere campionato in 44100 campioni/secondo ove ogni campione richiede 2 bytes (16 bits) ed usualmente vi sono 2 canali per la riproduzione stereo. Poiché lunghe sequenze si dati si trasformano in lunghi tempi di trasmissione sono molto importanti le tecniche di compressione. Nel mondo dei segnali audio è diventato molto importante lo standard di compressione MP3. Si tratta di uno standard che agisce in modo differenziato sulle varie componenti in frequenza tenendo conto della sensibilità dell'orecchio alle diverse frequenze e trascurando
componenti di ampiezza minore quando esse sono contemporanee ad altre frequenze caratterizzate da ampiezza molto maggiore. Con il formato MP3 si ottengono fattori di compressione compresi fra 10 e 14. Si tratta di una tecnica di compressione non conservativa in quanto non rende una riproduzione perfetta del segnale. Il formato JPEG Il formato JPEG è in realtá un formato di codifica delle immagini che include una sofisticata architettura di compressione che si articola addirittura in 4 passi: 1. DCT (Discrete Cosine Transform). La DCT é una trasformazione matematica che fa capo ad una famosissima teoria di Fourier e che trasforma i segnali in una loro rappresentazione fatta di una moltitudine di componenti ognuna delle quali caratterizzata da una precisa frequenza di oscillazione. Mediante tale trasformazione ci si sposta in quello che potremmo chiamare il mondo di Fourier dove diventa facile alterare (filtrare) informazioni di tipo diverso: per esempio diventa facile eliminare ciò che varia molto velocemente e lasciare ciò che varia lentamente. Applicando questo metodo alla digitalizzazione (ottenuta per esempio mediante uno scanner) di una fotografia molto ingrandita nella quale si vede la grana della pellicola si può pensare di ripulire l'immagine dalla struttura dettagliata della grana. Questa operazione di filtraggio di certe componenti viene eseguito nel passo 3 successivo. 2. Compressione RLE (che abbiamo menzionato poco prima). 3. Quantizzazione. Con questo processo si filtrano le componenti ottenute con la DCT applicata nel primo passo. 4. Infine viene applicato il metodo di Huffman. Per il recupero dell'immagine originale i quattro passi vengono applicati in senso inverso. Con il formato JPEG si possono arrivare a ridurre certe immagini anche di un fattore 50. Tuttavia é necessario verificare se il risultato é soddisfacente. Potete vedere qualche esempio. Vediamo prima una fotografia a colori di un formato jpeg con un modesto fattore di compressione e quindi con un buon fattore di qualità.
Figura 24 18,6 Kb Vediamo ora la stessa immagine con un fattore di compressione molto elevato.
Figura 25 2,86 Kb La seconda immagine richiede molto meno spazio rispetto alla prima, questo comporta una notevole efficienza su Web ma una bassa qualitĂ .
CAPITOLO III Definizione di Algoritmo e Programma Premessa Con il termine algoritmo si intende la descrizione precisa di una sequenza finita di azioni, definite passo per passo, in modo tale da poter essere eseguite meccanicamente e tali da produrre un determinato risultato. Da questa definizione si capisce che il concetto di algoritmo non è necessariamente legato al mondo dell’informatica o della matematica, ma può essere esteso anche ad altri contesti. Un semplice esempio è rappresentato dalla descrizione delle azioni necessarie a preparare un caffè: Algoritmo prepara Caffè 1) Svita la caffettiera 2) Riempi d’acqua il serbatoio della caffettiera 3) Inserisci il filtro 4) Riempi il filtro con la polvere del caffè 5) Avvita la parte superiore della caffettiera 6) Metti la caffettiera, così predisposta, su un fornello acceso. 7) Spegni il fornello quando il caffè è pronto 8) Versa il caffè nella tazzina Da quanto descritto si evince che ogni giorno, anche se inconsapevolmente, tutti noi eseguiamo degli algoritmi e quello appena illustrato, è stato scritto in linguaggio naturale in modo tale da poter essere interpretato da un essere umano. Sappiamo che un calcolatore elettronico, non usando il linguaggio naturale, non riuscirebbe a comprendere l’algoritmo precedente così come è stato scritto. Per fare in modo che un algoritmo risulti comprensibile ad un calcolatore, bisognerà descriverlo tramite un programma. Un programma è la rappresentazione di un algoritmo utilizzando istruzioni e costrutti propri dei linguaggi di programmazione. Il potere dell’algoritmo sta nel fatto che esso prescinde dal linguaggio di programmazione che verrà usato. In tal modo, un generico algoritmo è buono per qualsiasi linguaggio.
Formalismi di codifica Dopo questa premessa sarà bene soffermarsi sugli strumenti che si hanno a disposizione per scrivere un algoritmo(e quindi un programma). Prima di tutto occorre affermare che un algoritmo può avere tra i suoi dati delle costanti, delle variabili, che possono essere di tipi differenti (caratteri, interi, reali, stringhe,ecc) e delle espressioni, derivate dalla composizione di variabili,costanti con il set di operazioni messo a disposizione. Le costanti sono rappresentazioni simboliche di un numero, stringa ecc. che non cambia nel corso del programma. Una variabile è un nome simbolico che indica una determinata cella di memoria. L’uso di variabili è comodo perché evita al programmatore di dover utilizzare direttamente gli indirizzi fisici della memoria. I nomi simbolici delle variabili verranno tradotti in indirizzi fisici direttamente dal compilatore. Come è stato già detto, un algoritmo può anche essere scritto in linguaggio naturale, questo però non è molto conveniente, soprattutto se si ha a che fare con la programmazione informatica. Per ovviare a questo problema sono stati costruiti diversi formalismi di codifica, i principali, quelli che verranno presi in considerazione in questa sede sono i diagrammi di flusso e la pseudocodifica. Diagrammi di flusso Sono una forma grafica di rappresentazione degli algoritmi. Si collocano tra il linguaggio matematico e quello naturale. Prima di entrare nello specifico dei diagrammi di flusso, è bene definire le istruzioni base come segue: Assegna: Assegna ad una variabile (locazione di memoria) il valore di una espressione Leggi: Legge in input dall’esterno un valore che memorizza in una varabile (una locazione di memoria) Scrivi: Scrive in output l’espressione o il valore di una variabile (locazione di memoria) Se…allora…altrimenti: Sulla base del valore di una espressione logica, modifica il “flusso” del programma Vai al passo…: Modifica il “flusso” di un programma incondizionatamente Fermati: Termina l’esecuzione di un programma
Tutte le istruzioni verranno così codificate in una veste grafica che verrà ora illustrata: Assegna :
A=5
Questa istruzione assegna alla variabile A il valore 5 Leggi/Scrivi:
Leggi B
Questa istruzione permette di leggere un valore da input ed inserirlo nella variabile B. N.B.: Nel caso di scrittura, la forma geometrica non cambia, cambia soltanto il testo all’interno che ovviamente sarà “Scrivi B”
NO Se…allora…altrimenti:
C> 3
SI
Questa istruzione permette di effettuare una scelta in base al valore dell’espressione logica all’interno del rombo. A seconda di questo valore, il flusso del programma verrà indirizzato su una o sull’altra parte, eseguendo istruzioni differenti. Vai al passo…: Si indica semplicemente con una freccia e permette di saltare incondizionatamente al blocco di istruzioni desiderate Fermati: STOP! Questa istruzione indica quando è finito un programma I diagrammi di flusso sono costituiti da tre tipi diversi di strutture di istruzioni ed è stato dimostrato (teorema fondamentale della programmazione strutturata di Jacopini e Bohm) che ogni programma può essere codificato attenendosi esclusivamente a queste tre strutture fondamentali:
Struttura Sequenziale
A=5
B=3 In questa struttura le istruzioni vengono eseguite una dietro l’altra. Esempio: Svita la caffettiera
Riempi d’acqua il serbatoio della caffettiera
Inserisci il filtro
Riempi il filtro con la polvere del caffè
Struttura Iterativa
A=5
B=5
NO
C> 3 SI
Permette di eseguire un ciclo (ovvero la ripetizione delle stesse operazioni più volte) condizionato dal valore di un’espressione. Esempio: Avvita la parte superiore della caffettiera
Metti la caffettiera su un fornello acceso
NO
E’ pronto il caffè? SI
Struttura Condizionale NO
SI
C> 3
Permette di intraprendere due strade differenti. La scelta è condizionata dal valore dell’espressione.Esempio: NO
Versare il caffè nella tazzina
E’ pronto il caffè?
SI
Controllare più tardi
Come si sarĂ potuto notare, le tre strutture derivano direttamente dalla composizione delle istruzioni descritte in precedenza e possono essere componibili tra loro, ovvero le strutture iterative, ad esempio, possono contenere al loro interno altre strutture iterative o di altro tipo, come quella condizionale. Come esempio di diagramma di flusso, viene presentato quello riferito a calcolo della media di 5 numeri.
Grafico 0.2
Pseudocodifica L’altro formalismo è la pseudocodifica. Questo formalismo ha la particolarità di essere molto legato al linguaggio naturale e permette, ad un programma scritto in pseudocodifica, di essere tradotto facilmente in un qualsiasi linguaggio di programmazione. Anche la pseudocodifica, come i diagrammi di flusso, è basata sulle tre strutture sopraccitate. Struttura sequenziale INIZIO Istruzione 1 Istruzione 2 . . Istruzione n FINE Esempio INIZIO Svita la caffettiera Riempi d’acqua il serbatoio della caffettiera Inserisci il filtro . . . FINE
Struttura Iterativa RIPETI <corpo dell’iterazione> FINCHE’ <condizione> Esempio RIPETI <Controlla se è pronto il caffè> FINCHE’ <non è uscito tutto dal serbatoio della caffettiera> Struttura Condizionale SE <condizione> ALLORA <set di istruzioni A> ALTRIMENTI <set di istruzioni B> Esempio SE <è pronto il caffè> ALLORA <Versalo nella tazzina> ALTRIMENTI <Attendi che esca > Come per i diagrammi di flusso, verrà ora presentato il medesimo esempio generico sulla media di 5 numeri in pseudocodifica INIZIO Poni s=0 Poni n=0 RIPETI Leggi a Poni n=n+1 Poni s=s+a FINCHE’ (n<5) Poni m=s/5 Scrivi m FINE
CAPITOLO IV Hardware e Software Premessa Componenti fondamentali di ogni computer sono l’hardware e il software. L’hardware è composto dalla componentistica visibile a occhio nudo (hard disk, mouse, ecc.). Il software è la parte "intelligente" del computer. E' un insieme di programmi che indicano alle parti meccaniche le operazioni da eseguire. Hardware Il modo migliore per capire l’hardware è descrivere i vari componenti. Nel farlo, verrà preso in considerazione il più comune dei computer, il PC. Microprocessore (Unità Centrale) L'unità centrale dell'elaboratore (microprocessore) è costituita da sottili piastrine di silicio su ciascuna delle quali vengono creati più collegamenti semplici che realizzano dei circuiti complessi. L'insieme di queste piastrine ha la capacità di contenere centinaia di migliaia di informazioni nello spazio di pochi centimetri quadrati.
Figura 26-Processori
Velocità elaborativa La velocità elaborativa di un processore è determinata dagli impulsi di un clock, e viene misurata in hertz. L’ hertz è l’unità di misura della frequenza, l’inverso del tempo. La velocità di calcolo di un processore è quindi determinata dalla frequenza (hertz) di impulsi al secondo. La memoria principale (RAM) La memoria principale dell'elaboratore è costituita da circuiti integrati che hanno una capacità che facilmente supera parecchi milioni di "byte". Il "byte", è la quantità di memoria necessaria a contenere un carattere sia esso alfanumerico che speciale. Tale memoria prende il nome di RAM (Random Access Memory), cioè memoria ad accesso casuale. Durante il funzionamento del computer, le istruzioni e le informazioni elaborate vengono conservate nella RAM e scambiate con il processore. Questa è una memoria volatile, cioè funzionante fino a che è alimentata elettricamente, pertanto i dati che essa riceve verranno perduti allo spegnimento del sistema. La memoria RAM ha la funzione di servire al processore come supporto per contenere dati che momentaneamente non occorrono al processore stesso, e a restituirli quando necessitano nuovamente. Questa funzione di “appoggio” detta paginazione permette al processore di svolgere queste operazioni alla velocità di nanosecondi (miliardesimi di secondi), mentre se non avesse o non fosse sufficiente questo supporto dovrebbe utilizzare la memoria magnetica dell’hard disk la cui velocità di accesso è più lenta. Ciò rende comprensibile la funzione determinante della RAM nelle prestazioni di un computer, è senza dubbio meglio avere un medio processore e una RAM capace che un processore velocissimo con scarsa RAM. E’ importante quindi nella scelta di un computer bilanciare in modo corretto potenza elaborativa e RAM ed in ogni caso è meglio privilegiare quest’ultima.
Figura 28-Memoria RAM
La microprogrammazione La microprogrammazione è la tecnica con cui ogni istruzione di macchina di un elaboratore elettronico viene realizzata con una sequenza di operazioni sub-elementari governate da programmi memorizzati su una apposita memoria. Queste operazioni sub-elementari si dicono più propriamente microoperazioni. I vari programmi sono memorizzati su una micromemoria che in genere è solo in lettura e che prende il nome di ROM (Read Only Memory), cioè memoria di sola lettura. Tale memoria ha la caratteristica di essere conservativa in quanto le informazioni in essa contenute non vengono cancellate allo spegnimento dell'elaboratore. All'accensione del sistema è questa memoria che attiva automaticamente l'elaboratore e lo rende disponibile all'utilizzatore. Le unità periferiche Le unità periferiche sono apparecchiature collegate all'elaboratore, alcune di esse sono normalmente contenute nel rack (lettore di floppy, hard disk, lettore di CDRom, masterizzatore, modem) mentre altre sono collegate ad esso ma sono esterne al rack (stampante, video, scanner, modem, tastiera, casse acustiche, cuffie, microfono, ecc.). Monitor (Video) E' il dispositivo che permette di vedere le operazioni che il sistema ha effettuato. Visualizza i messaggi che vengono generati per richiedere interventi da parte dell'utente e i risultati delle operazioni che sono state richieste. Mostra i caratteri che sono stati digitati sulla tastiera. Il video oggigiorno è ormai solo a colori, ed può avere varie dimensioni, queste dimensioni si indicano in pollici. Importante , nella scelta del video, è la risoluzione, ovvero il numero di “pixel” per pollice, cioè di celle che costituiscono l’area dello schermo. Maggiore è il numero dei pixel per pollice, migliore sarà la definizione delle immagini rappresentate sullo schermo. Questo fattore, unito alla proprietà di refresh (ovvero il numero di fotogrammi al secondo) determina il costo dell’apparecchiatura. Attualmente i video hanno frequenze di refresh pari a 56,60,72 e 80 hertz. A frequenze più elevate corrisponde una maggiore fluidità di movimento. Questo valore non dipende dal monitor, bensì dalla scheda video, quindi il video deve solo essere in grado di supportare il carico di lavoro imposto dalla scheda video. Le principali tecnologie con cui sono realizzati i monitor sono:
Tubo a raggi catodici L'immagine viene prodotta sulla superficie interna del tubo da uno o più fasci elettronici che colpiscono il rivestimento costituito da una superficie fosforescente. La scansione avviene velocemente, abbastanza velocemente da dare l'impressione che si tratti di una immagine fissa. Ogni pixel di un monitor CRT è in realtà costituito da tre minuscoli punti di materiale fosforescente che non è possibile vedere individualmente ad occhio nudo. Si tratta dei tre fosfori (niente a che fare con l'elemento chimico fosforo), uno rosso (red, R), uno verde (green, G) e uno blu (blue, B). I tre cannoni elettronici (rispettivamente per il rosso, verde e blu) emettono tre fasci di elettroni che spazzano progressivamente l'intero raster. Quando i tre fasci colpiscono un pixel, un particolare meccanismo magnetico-meccanico con l'uso di una maschera forata (shadow mask) fa in modo che il primo fascio colpisca il fosforo R, il secondo colpisca il fosforo G e il terzo quello B. I fosfori sono sistemati in terne circolari (Preci sion InLine) o in striscie verticali (Trinitron). I tre fosfori del pixel vengono eccitati dai tre fasci di elettroni che li rendono fosforescenti (l'aggettivo "fosforescente" significa letteralmente, "produttore di luce"). I fosfori sono molto vicini per cui è impossibile distinguerli a occhio nudo, e la mescolanza dei loro colori avviene, in effetti, nell'occhio dell'osservatore (tecnicamente si tratta del processo di sintesi additiva spaziale). Cristalli liquidi La tecnologia CRT è sostituita dalla tecnologia dei cristalli liquidi (LCD, liquid cristal display). I cristalli liquidi sono composti organici che possono avere sia le proprietà dei liquidi sia le proprietà dei cristalli: come i liquidi possono essere versati ma come i cristalli mantengono una struttura molecolare ordinata. I monitor a cristalli liquidi hanno numerosi vantaggi: alta risoluzione, uniformità nello spazio e nel tempo (perché ogni singolo pixel può essere indirizzato separatamente e non viene influenzato dai pixel adiacenti). Inoltre sono sottili (1-2 centimetri) e leggeri, necessitano di una potenza elettrica molto bassa, non espongono l'utente ai pericoli dei raggi catodici. Presentano tuttavia anche alcuni difetti: una risoluzione temporale molto bassa (problemi con le immagini dinamiche); bassa luminanza e basso contrasto cromatico; gamut di colore ridotto rispetto ai monitor CRT (soprattutto a causa del primario blu). I principali tipi di monitor a cristalli liquidi sono a matrice passiva: TN, twisted nematic; STN, supertwisted nematic;
DSTN, dual scan twisted nematic; CSTN, color twisted nematic; HPD, hybrid passive display; a matrice attiva: TFT, thin film transistor. Il monitor a matrice attiva (TFT, thin film transistor) è il più moderno. In questo monitor l'indirizzamento di ogni singolo pixel avviene tutto alle spalle del display stesso e i pixel sono attivati da un apposito transistor. Quindi non è più necessario porre davanti al video una serie di elettrodi: è sufficiente la presenza di una unica lastra trasparente con funzioni di "terra". Il contrasto è quattro volte maggiore rispetto agli STN e l'angolo di visuale è più ampio. Plasma La tecnologia al plasma si basa sulla luce fluorescente. In ogni cella del display si trova il gas, normalmente una miscela di Neon e Xenon, che in un campo elettrico modifica le proprie caratteristiche. Applicando una tensione il gas ionizza e diventa un plasma che cede luce ultravioletta non visibile. La parte esterna del pannello è ricoperta con fosfori RGB che rendono visibile la luce. Tre celle adiacenti costituiscono un pixel. Un clock di 30 kHz è sufficiente a visualizzare una immagine senza sfarfallio. Questa caratteristica ha tuttavia effetto anche sulla visualizzazione di immagini mobili. Mentre un colore viene già acceso, l'altro non è ancora illuminato. Per minimizzare questo problema i diversi costruttori utilizzano metodi diversi.
Figura 27 - Video
Unità di lettura floppy disk E' un dispositivo che generalmente trova posto nel rack da cui è costituito il computer ed è composto da un piatto ruotante ed una testina che permette la lettura/scrittura su un supporto magnetico chiamato floppy o minidisco .Sono state prodotte delle unità di lettura/scrittura ad alta densità che possono utilizzare i normali floppy da 1,44 Mb ma possono accogliere e registrare anche floppy speciali da 100Mb. Queste unità hanno quindi una doppia funzione.
Figura 28-Unita lettura Floppy
Floppy Disk (minidisco) E' una supporto magnetico su cui è possibile sia la scrittura che la lettura dei dati che sono stati registrati. Si compone di un leggero disco di materiale plastico ricoperto da una leggera superficie magnetica contenuto in un involucro di plastica rigida con una apertura rettangolare sul lato superiore e due fessure contrapposte sul lato inferiore. L'apertura superiore, protetta da una copertura metallica mobile permette l'inserimento della testina di lettura/scrittura. Le due fessure inferiori permettono rispettivamente, quella destra il riconoscimento da parte dell'elaboratore il tipo di disco inserito (di capacità 0,720Mb o 1,44Mb), quella sinistra se è chiusa permette solo la lettura dei dati, se è aperta ne permette anche la registrazione. Consta di 90 tracce registrabili concentriche di cui la prima verso il centro contiene l'indirizzario dei file contenuti sul floppy. Come indicato nel paragrafo precedente sulle unità di lettura floppy, sono in commercio supporti speciali di capacità 100Mb atti al trasporto ed alla conservazione di notevoli quantità di dati.
Hard Disk (disco fisso) Il disco fisso è l'unità magnetica su cui risiede il sistema operativo, i dati, i programmi per la videoscrittura, in sostanza tutto il "software" utilizzato per le elaborazioni. E' una unità magnetica che ha generalmente grande capacità di memorizzazione, i più utilizzati variano attualmente da 40G a 300Gb, ha un'alta velocità di lettura/scrittura e tempo di accesso al dato di circa 10 ms a seconda del modello e della marca e per hard disk ad alte prestazioni (15000 giri) può arrivare a 3/4 ms. Le caratteristiche principali di un hard disk sono:
capacità tempo di accesso velocità di trasferimento
Capacità E’ espressa in gigabyte (Gb). Gli hard disk in commercio generalmente hanno una capacità compresa tra 40Gb e 300Gb. Tempo di accesso E’ il tempo medio necessario affinché un dato posto in una parte a caso dell’hard disk , possa essere reperito. Il tempo di accesso tipico per un hard disk consumer è attorno ai 10 ms e per hard disk ad alte prestazioni (15000 giri) può arrivare a 3/4 ms. Velocità di trasferimento E’ la quantità di dati che l’hard disk è teoricamente in grado di leggere o scrivere sul disco in un determinato tempo. Oltre alle 3 caratteristiche sopraccitate esisto altri due fattori che condizionano le prestazioni dell’hard disk e sono il buffer e la velocità dell’interfaccia. Buffer E’ una piccola memoria cache (in genere di alcuni megabyte) posta a bordo dell'hard disk. Ha il compito di memorizzare gli ultimi dati letti o scritti dal disco. Nel caso che un programma legga ripetutamente le stesse informazioni, queste possono essere
reperite nel buffer invece che sul disco. Essendo il buffer un componente elettronico piuttosto che meccanico, la velocità di trasferimento è molto maggiore. Interfaccia E’ il collegamento tra l'hard disk e la scheda madre (o, più specificatamente, il controllore) può influenzare le prestazioni perché specifica la velocità massima alla quale le informazioni possono essere trasferite da o per l'hard disk. Le moderne interfacce tipo ATA133, Serial ATA o SCSI possono trasferire centinaia di megabyte per secondo, molto più di quanto qualunque singolo hard disk possa fare, e quindi l'interfaccia non è in genere un fattore limitante. Il discorso può cambiare nell'utilizzo di più dischi in configurazione RAID, nel qual caso è importante utilizzare l'interfaccia più veloce possibile, come per esempio la Fibre channel da 2 Gb/s.
Figura 29-Disco fisso Hard disk
Tastiera (keyboard) La tastiera è il mezzo per comunicare con l'elaboratore. Oltre ai normali tasti per scrivere contiene una serie di tasti "funzione" (F1,...,F12) che permettono di eseguire funzioni specifiche che generalmente sono inserite nei prodotti realizzati per la videoscrittura, basi dati ecc. Vi sono inoltre tasti per la cancellazione (Canc), per lo spostamento in alto , in basso , a destra e a sinistra .
Ed ancora tasti Pag , Pag , Ins, Fine (o End), che vengono utilizzati insieme ad altri tasti per permettere o funzioni particolari o la digitazione di comandi in assenza o in caso di guasto del mouse Alcune tastiere, attualmente le più utilizzate, hanno sul lato destro una tastierina numerica che, in alcuni prodotti, viene utilizzata per l’inserimento di dati numerici e facilita quindi l'utilizzo dei numeri somigliando alla tastiera di una calcolatrice. Per facilitare la posizione ergonomica sono in commercio tastiere con "design" particolari studiati appositamente per evitare l'affaticamento sia delle mani che dell'avambraccio obbligando l'utilizzatore ad assumere un posizione corretta. Alcuni modelli hanno inserite nella struttura le casse acustiche ed alcune il mouse a sensori.
Figura 30- Tastiera
Mouse E' un dispositivo di puntamento che consente, premendo uno dei tasti di cui è dotato (generalmente il sinistro) di selezionare un dato, attivare un comando, aprire o chiudere una finestra relativa ad un programma che utilizza elementi grafici (ad es. Word o Excel). Per esigenze personali è possibile modificare la funzionalità dei tasti. Ci sono mouse che hanno tre tasti, tre tasti e un pulsante, alcuni sono incorporati nella tastiera e funzionano con il solo sfregamento di un dito su una superficie piana ed ancora altri la cui sofisticata struttura permette di soddisfare qualsiasi esigenza. Attualmente è stato aggiunto lo skroll, una rotella nella parte anteriore che facilita l’interazione con i fogli di lavoro tipo word excel, ecc.
Esistono 3 principali tipologie di collegamento ovvero: seriale, PS2, USB
Figura 31-Mouse
Stampante (printer) La stampante è la periferica di output che trasferisce su carta le informazioni digitali contenute in un computer. L'operazione comporta perdita di informazioni, in quanto dato un testo o un'immagine stampati è pressoché impossibile ricostruire perfettamente il file originale con il processo inverso, ovvero la scansione o il riconoscimento ottico dei caratteri OCR(Optical Character Recognition). I parametri che caratterizzano una qualunque stampante sono essenzialmente: Interfaccia: il tipo di collegamento al computer, che può essere una porta parallela, seriale, USB ad infrarossi, bluetooth ecc. Formato carta: la dimensione, lo spessore, il tipo di supporti di stampa che la stampante è in grado di accettare (carta, buste ecc). Il più diffuso è il formato A4, ma alcuni modelli usano formati minori, in genere per le foto, oppure formati superiori, A3, A2 ecc., fino ai rotoli da 92cm. Numero di colori primari: ovvero quanti inchiostri sono utilizzati e quindi quanti colori può riprodurre la stampante; le monocromatiche impiegano un solo colore, di solito il nero. Le tricromatiche usano giallo, ciano e magenta per produrre i colori per sintesi sottrattiva, compreso il nero. Le quadricromatiche hanno i tre colori base già detti più il nero, utilizzato per le stampe bianco e nero e per comporre colori scuri più verosimili. Le esacromatiche hanno in più due tinte chiare di ciano e magenta, per rendere meglio le mezzetinte. Risoluzione massima: il numero di punti stampabili sulla carta per unità di lunghezza, che può differire tra il senso orizzontale e verticale. Di solito si esprime in punti per pollice lineare, "dot per inch" (DPI). La densità di pixel dell'immagine non corrisponde necessariamente alla densità dei punti di stam-
pa, poiché a ciascun pixel possono corrispondere diversi punti di colore diverso affiancati. Per ragioni di marketing viene spesso indicata la densità di questi ultimi, che è più alta. Velocità: il numero di pagine (normalmente A4) che può essere prodotta per unità di tempo, di solito espressa in pagine al minuto. Questo parametro differisce molto a seconda che si stampi un testo bianco e nero oppure una fotografia, ed anche in funzione della qualità e risoluzione impostate. Tempo per la prima stampa: il tempo che intercorre tra l'invio dei dati e l'avvio della prima stampa. È un valore poco considerato ma che può arrivare a molte decine di secondi. Costo per copia stampata: quando si ha un uso intensivo della macchina, più importante del costo di acquisto è il costo di gestione, dovuto a inchiostri o toner, tamburi, testine, elettricità e quanto altro è necessario per stampare un singolo foglio. Esistono diversi tipi di stampanti che differiscono principalmente per la tecnologia utilizzata. Stampante ad Aghi Una serie di aghi (da 7 a 24 o più) mossi da elettromagneti battono sulla carta attraverso un nastro inchiostrato mentre si spostano lateralmente sul foglio. La sequenza dei colpi è generata da un circuito elettronico per comporre i pixel che costituiscono i caratteri o parte di una immagine. La stampa può avvenire in entrambi i sensi di spostamento del carrello, con una aumento della velocità complessiva (stampa bidirezionale). Alcuni modelli di stampanti ad aghi possono riprodurre il colore, impiegando oltre al nero anche tre nastri con i colori fondamentali giallo, magenta e ciano. Questa tecnologia di stampa è ancora richiesta in alcuni settori poiché permette di imprimere anche i moduli copiativi a più fogli.
Figura 32-Stampante ad aghi
Stampante a getto d’inchiostro È la tecnologia che ha avuto il maggiore successo presso l'utenza privata ed i piccoli uffici, principalmente a causa del basso costo di produzione, della silenziosità e buona resa dei colori. Una schiera di centinaia microscopici ugelli spruzzano minuscole gocce o bolle di inchiostro a base di acqua sulla carta durante lo spostamento del carrello. Il movimento dell'inchiostro è ottenuto per mezzo di due distinte tecnologie: pompe piezoelettriche che comprimono il liquido in una minuscola camera, resistenze elettriche che scaldano bruscamente il fluido facendolo schizzare dall'ugello. Entrambi veri prodigi di fluidodinamica sono realizzate con tecnologie di fotoincisione simili a quelle per la produzione di massa dei circuiti integrati, che consentono costi per quantità molto contenuti. La risoluzione e la qualità di stampa di queste testine raggiunge livelli paragonabili alla fotografia tradizionale, ma solamente utilizzando carta la cui superficie sia stata opportunamente trattata per ricevere l'inchiostro. Il problema più grave di questa tecnica è l'essiccamento dell'inchiostro nelle testine, che è frequente causa di malfunzionamenti. Un altro svantaggio è dato dall'elevato costo per copia stampata se confrontato con le altre tecnologie. Stampanti a getto di cera Tecnologia simile alla precedente, ma che offre anche su carta comune immagini dall'aspetto fotografico, grazie alla lucidità della cera. L'impiego di queste stampanti è ormai estremamente limitato a causa della loro complessità e ai tempi di utilizzo elevati dovuti alla necessità di mantenere costantemente fusa la cera. Stampanti laser Questa tecnologia deriva direttamente dalla xerografia comunemente implementata nelle fotocopiatrici analogiche. In sintesi, un raggio laser infrarosso viene modulato secondo la sequenza di pixel che deve essere impressa sul foglio. Viene poi deflesso da uno specchio rotante su un tamburo fotosensibile elettrizzato che si scarica dove colpito dalla luce. L'elettricità statica attira una fine polvere di materiali sintetici e pigmenti, il toner, che viene trasferito sulla carta (sviluppo). Il foglio passa poi sotto un rullo riscaldato che fonde il toner facendolo aderire alla carta (fissaggio). Per ottenere la stampa a colori si impiegano quattro toner: nero, ciano, magenta e giallo, trasferiti da un unico tamburo oppure da quattro distinti. Per semplificare la gestione, nelle stampanti laser moderne il toner e il tamburo fotosensibile sono incluse in una cartuccia usa e getta (o meglio, rigenerabile). Il costo
più elevato di queste stampanti è ampiamente compensato da un minore costo per copia, una maggiore velocità di stampa e maggiore affidabilità nel tempo dovuta all'assenza di inchiostri liquidi. Stampanti led Tecnologia molto simile alla precedente, impiega al posto del laser una barra di LED disposti per tutta la larghezza di una pagina e in numero uguale al numero di pixel da stampare. Consente una risoluzione massima inferiore al laser. Stampante a carta termica Impiega un rotolo di carta speciale, trattata chimicamente in modo da annerirsi se scaldata. Una testina larga quanto la pagina, costituita da una schiera di resistenze elettriche che si scaldano per effetto Joule, impressiona l'immagine sul foglio mentre questo vi scorre sotto. Era impiegata nei primi apparecchi telefax, ma i documenti stampati tendevano ad ingiallire e diventare illeggibili in breve tempo. La tecnica è largamente impiegata nelle stampanti di registratori di cassa, bilance, parchimetri ecc. Stampanti a trasferimento termico Questa tecnologia deriva direttamente dalla precedente, ma invece di impiegare carta speciale, utilizza una pellicola di plastica rivestita da un pigmento che viene trasferito su carta comune dal calore. Esistono anche modelli a colori, impieganti quattro pellicole con i colori fondamentali. Non offrono però risoluzioni molto elevate. Stampante braille Queste macchine non impiegano inchiostri ma imprimono nella carta i simboli caratteristici dell'alfabeto Braille per non vedenti. Dispongono di una serie di punzoni mossi da elettromagneti che perforano o imbutiscono la carta. Modem (modulatore/demodulatore) Il modem (acronimo di modulatore e demodulatore) è una periferica per la ricezione ed invio dati, capace, in fase di invio, di tradurre (modulare) il segnale digitale in partenza da un computer attraverso una linea analogica, o in ricezione di tradurre (demodulare) il segnale in arrivo al computer sempre tramite la linea analogica. È comunemente collegato al computer tramite una porta seriale RS-232 oppure una porta USB.
I modem più comuni sono quelli che utilizzano la comune rete analogica PSTN (Public Switched Telephone Network) e ADSL (Asymmetric Digital Subscriber Line). Viene comunemente chiamato con lo stesso nome un analogo dispositivo capace di comunicare attraverso la linea digitale ISDN (Integrated Services Digital Network), tuttavia questo dispositivo non è propriamente definibile modem, in quanto la linea che utilizza è digitale come il segnale in arrivo dal computer (e non analogica).
Figura 35-Modem router ADSL
Scanner (analizzatore) Lo scanner è la periferica in grado di acquisire immagini da superfici piane (fogli di carta, libri) per poterle elaborare mediante appositi software di fotoritocco, o di riconoscere testi mediante OCR. Il suo funzionamento è basato su un lettore ottico che "scandaglia" l'oggetto da digitalizzare trasformandolo in una sequenza di dati interpretabile come immagine dal computer. Gli scanner sono gli strumenti principali necessari per una corretta Gestione Elettronica dei Documenti (GED). Esistono scanner in grado di processare anche centinaia di pagine al minuto, richiamando automaticamente le pagine da un apposito contenitore, così come avviene usualmente per una stampante.
Figura 36-Scanner
Unità CD-Rom E’ l’unità atta a leggere i compact disk. Un Compact Disc, o CD, è un supporto di memorizzazione digitale composto da un disco di resina termoplastica trasparente, generalmente di 12 centimetri di diametro, ricoperto da un sottile foglio di materiale metallico sul quale sono memorizzate le informazioni come "buchi" (in inglese "pits") successivamente letti per mezzo di un laser. Il disco viene fatto ruotare per mezzo di un getto d'aria quindi un raggio laser provvede alla lettura dei dati. La velocità di lettura è indicata con "1x" se il drive legge a velocità singola, "2x" a doppia velocità e così via. Oggi sono sul mercato drive che leggono a "64x" e più. Il CD deve la sua popolarità al mercato musicale.. E’ in tale contesto che trova la sua prima applicazione superando in qualità e longevità il vecchio formato MC. Oggi lo ha praticamente sostituito. In ambito informatico ha un largo utilizzo. Ciò è dovuto alla possibilità di memorizzare fino a 800 Mb. Sono da tempo presenti sul mercato CD-RW che permettono di poter riscrivere più volte sullo stesso supporto. La popolarità di questo supporto va scemando a causa dell’arrivo sul mercato di altri supporti quali Pendrive ed il sempre maggiore utilizzo di DVD che offrono maggiori prestazioni. Figura 37-Lettore di CD-Rom
DVD E’ un supporto di memorizzazione simile al CD-RROM, ma con una capacità notevolmente superiore. La nascita del DVD è dovuta all’idea di avere a disposizione un supporto che potesse memorizzare grandi quantità di dati, principalmente video digitali. Oggi è largamente utilizzato per i video, infatti ha sostituito il vecchio standard delle videocassette VHS. Nell’ambito dei computer si appresta a sostituire i CDROM, vista la maggiore capacità di memorizzazione ed il progressivo abbassamento dei prezzi. Da qualche tempo sono presenti sul mercato DVD-RW, ovvero riscrivibili, che permettono agli utenti di poter utilizzare più volte lo stesso DVD proprio come avviene da tempo per i CD-ROM. Le dimensioni dei DVD di produzione industriale sono di quattro tipi:
DVD-5: 4.7 GB Lato unico e singolo strato DVD-9: 8.5 GB Lato unico e doppio strato DVD-10: 9.4 GB Due lati e singolo strato DVD-18: 17 GB Due lati e doppio strato La memorizzazione delle informazioni avviene sullo "strato di incisione", tramite un laser, focalizzato su esso, che ne modifica la riflettività, riproducendo la sequenza 0, 1. Ogni strato è suddiviso in tracce circolari e concentriche di 0,74 micron. In lettura, la luce laser, viene riflessa dallo strato di memorizzazione in modo diverso a seconda dell'indice di riflessione e conoscendo la velocità di rotazione del disco e la traccia su cui si sta leggendo, si può risalire alla sequenza 0,1. La minima velocità di trasmissione dati da un DVD è quasi otto volte maggiore di quella di un CD, cosicché un lettore DVD da 1x è quasi equivalente ad un lettore CD da 8x. Più precisamente, 1x per un lettore DVD equivale a 1350 KBps, mentre 1x per un lettore CD equivale a 150KBps. Masterizzatori Il masterizzatore è un dispositivo hardware atto a creare o duplicare compact disc (cd) o dvd di dati, audio e/o video. E' possibile utilizzare tali dispositivi per: masterizzazione di Cd-R/Dvd-R/Dvd+R, in cui la scrittura sul supporto è definitiva e come tale non più modificabile; masterizzazione di Cd-RW/Dvd-RW/Dvd+RW, o supporti riscrivibili, sui quali è possibile effettuare operazioni di cancellazione dei dati presenti all'interno degli stessi e quindi riutilizzo per nuove scritture. Nel mercato dei masterizzatori vi è un'ulteriore ramificazione: interni oppure esterni. I masterizzatori esterni non occupano alloggiamenti (slot da 5 pollici e 1/2) all'interno del computer e si collegano mediante due tipi di porte, connessioni proprietarie a parte: USB o Firewire. La prima soluzione è molto diffusa, grazie all'ampio successo della tecnologia USB 2.0 (transfer rate teorico massimo 480 Mbps), la seconda, ovvero la connessione Firewire (transfer rate teorico massimo 400 Mbps/IEEE1394 e 800 Mbps/IEEE1394b), meno. Casse acustiche
Sono altoparlanti collegabili alla scheda sonora che può essere presente nel sistema tramite un "jack", detta scheda permette di rivelare i suoni in stereofonia. Esistono altoparlanti di varia potenza (watt per canale) che permettono di ascoltare la musica dei CD musicali ad alta fedeltà.
Figura 33-Casse Acustiche
Cuffie Sono le normali cuffie con le quali ascoltiamo il walkman o le radioline. Permettono di ascoltare la musica in modo individuale. Microfono E' lo strumento per mezzo del quale è possibile, se si possiede una scheda sonora, registrare la propria voce, dei messaggi, che possono essere riascoltati o trasmessi via modem. Porta Seriale La porta seriale è un connettore posto sul retro dell'elaboratore utilizzabile per collegare allo stesso dell'hardware aggiuntivo. L'elaboratore ha in genere due porte seriali denominate COM1 e COM2 a cui possono connettersi MODEM , PLOTTER ecc. La porta seriale trasmette e/o riceve un bit alla volta ad altissima velocità. Porta Parallela La porta parallela, situata sul retro dell'elaboratore, è quella a cui si collega la stampante, lo scanner ecc., è una porta che invia e riceve 8 bit alla volta. Possono essere aggiunte altre porte parallele installando un adattatore parallelo.
Porta SCASI La porta SCASI può supportare fino a sette periferiche in cascata, e la sua prerogativa principale è legata all'alta velocità di trasferimento dei dati. E' adatta pertanto ad interfacciare più unità HD, CD-Rom, scanner. Porta USB Il disegno dell'USB è stato pensato per consentire un semplice inserimento e rimozione. Lo standard è stato progettato in modo da consentire un semplice aggiornamento dei sistemi sprovvisti di USB attraverso una scheda PCI o ISA. Le porte USB sono dotate del supporto del Plug and Play e supportano i dispositivi hot swap quindi se il sistema operativo lo consente supportano la rimozione a caldo e il reinserimento delle periferiche senza dover riavviare il computer. USB può collegare perifieriche quali mouse, tastiere, scanner d'immagini, macchine fotografiche digitali, stampanti, casse acustiche, microfoni e altro ancora. Per i componenti multimediali oramai lo standard USB è il metodo di collegamento più utilizzato mentre nelle stampanti sopravvivono ancora molti modelli dotati anche di porta parallela per questioni di compatibilità All'interno del computer l'USB non ha rimpiazzato lo standar ATA o SCSI per via della sua lentezza. Il nuovo standard serial ATA per esempio consente trasferimenti dell'ordine di 150 Mbyte per secondo, una velocità molto più elevata dello standard USB, che nella versione 2.0 raggiunge un massimo di 60 Mbyte per secondo (480 Mbits/s). L'USB viene molto usato negli hard disk esterni dove si preferisce privilegiare la praticità di poter collegare e scollegare a caldo il componente rispetto alla velocità di una connessione tipo ATA. USB non ha ancora totalmente rimpiazzato il connettore PS2 della tastiera, molti costruttori preferiscono mantenerlo per consentire agli utenti di poter utilizzare le economiche tastiere PS2. Lo standard 1.0 dell'USB supporta collegamenti a solo 1,5 Mbit/s, velocità adeguata per mouse, tastiere e dispostivi lenti. La versione 1.1 aggiunge la modalità full speed che innalza la velocità a 12 Mbit/s. La maggior novità dello standard USB versione 2.0 è l'innalzamento della velocità di trasferimento che arriva anche a 480 Mbit/s. Questa velocità cosi elevata consente all'USB di competere con lo standard Firewire ad armi quasi pari. Infatti lo standard USB ha delle limitazioni di carattere tecnico che ne sconsigliano l'utilizzo su telecamere e dispostivi che manipolano flussi video. Il forum che sovraintende allo sviluppo dello standard USB ha rinominato USB 1.1 come USB 2.0 Full Speed e USB 2.0 come USB 2.0 High Speed.
Le specifiche dell'USB stabiliscono due tipi di connettori per collegare i dispositivi, il connettore A e B. Negli ultimi anni alcuni produttori hanno introdotto delle varianti del connettore per i loro dispostivi miniaturizzati. Molti produttori cercando di ridurre le dimensioni dei dispositivi hanno deciso di creare connettori più piccoli di quelli standard. Questi dispositivi sono dei dispositivi USB a tutti gli effetti, infatti lo standard di comunicazione rimane quello dell'USB, l'unica cosa che cambia è il connettore che è fisicamente diverso. Una estensione del USB chiamata USB-On-The-Go consente ad una singola porta di fungere sia da dispositivo che da controllore. Ciò consente una più semplice connessione di dispositivi tipo i PDA che a volte devono fare da dispositivo ed a volte devono comandare dei dispostivi. Per evitare una proliferazione dei connettori proprietari. USB-On-The-Go ha definito anche due connettori chiamati, mini-A e mini-B, che sono connettori molto più piccoli dei connettori precedenti, questo rimuove la principale motivazione dei produttori ad ignorare lo standard e cioè risparmiare spazio. Porta IrDA L'Infrared Data Association è un dispositivo che permette di collegare le periferiche al PC tramite una porta a raggi infrarossi di tipo seriale eliminando l'uso di cavi. Porta HSSB L'High Speed Serial Bus è un collegamento di tipo seriale che può connettere fino a 63 dispositivi su un solo bus. Penna ottica E' uno strumento collegato alla porta seriale per mezzo del quale è possibile leggere i codici a barre, oppure interagire direttamente sullo schermo se il programma che ne prevede l'uso ha predisposto sul video dei campi eccitabili dalla penna stessa. Ci sono prodotti che permettono di disegnare con la penna ottica direttamente sullo schermo a mano libera.
Figura 39-Penna Ottica
Plotter Il plotter è una periferica specializzata nella stampa di grafica vettoriale. È il dispositivo di output ideale per i sistemi CAD, dove è impiegato per la stampa di prospetti e progetti architettonici, meccanici, elettrici, mappe topografiche, curve geometriche ecc. Il nome deriva dal verbo inglese to plot nel senso di tracciare (un diagramma). È costituito da un carrello in grado di muoversi liberamente sulla superficie di un foglio, secondo le coordinate cartesiane. Il carrello trasporta un pennino scrivente che può essere abbassato elettricamente per toccare la carta, in questo modo è possibile tracciare punti, linee, curve ecc. Sul carrello possono essere montati pennini di colore o spessore diverso, selezionabili automaticamente. In alcuni modelli è installabile un solo pennino, ma questo può essere sostituito durante la stampa con altri collocati in un deposito laterale. La dimensione del foglio può andare dall'A4 o meno fino a rotoli larghi 914mm o più. Nei formati maggiori il movimento in una coordinata è realizzato facendo scorrere il foglio su un rullo e lasciandolo libero alle estremità. Alcuni dispositivi speciali, dove il pennino è rimpiazzato da una lama, sono impiegati per ritagliare forme da pellicole autoadesive, tessuti ed altri materiali; si parla in questo caso di plotter da taglio. In altri tipi è invece installata una fresa con la quale è possibile incidere scritte e decorazioni in lastre di diversi materiali. Esistono infine plotter tridimensionali, che possono scolpire materiali per mezzo di frese. I dati sono ricevuti dal computer sotto forma di linguaggi specifici per plotter, tra cui il più noto è l'HPGL. Attualmente l'uso del plotter è in gran parte sostituito da stampanti per grande formato a getto di inchiostro oppure laser, che consentono maggiore flessibilità e velocità. Possono infatti stampare rapidamente anche scritte e fotografie. Appositi software possono emulare le funzioni di un plotter (es. spessore dei pennini) a beneficio del programma CAD.
Telecamera - Web cam Sono attualmente disponibili sul mercato piccole telecamere che montate accanto o sopra al video permettono, in collegamento remoto che il nostro interlocutore ci veda, e se anch’esso è dotato dello stesso strumento ci si può vedere in tempo reale. Questa è la stessa tecnica utilizzata attualmente per le videoconferenze. Bluetooth Il sistema prende il nome dal Re danese Harald Blåtand (Harold Bluetooth in inglese), Re di Danimarca e di Norvegia che nel 940 riuscì a unificare le tribù della Danimarca, Norvegia e Svezia. Lo standard Bluetooth nasce con l'obiettivo di unificare le varie tecnologie di connessione dei terminali mobili, dai computer ai microfoni passando per i telefoni cellulari e tutti i dispositivi che si possono interfacciare a un computer. Il logo del Bluetooth è una fusione delle rune legate alle lettere H e B. Questa è la storia ufficiale del nome Bluetooth sebbene sia diffusa la voce che la scelta del nome dipenda molto dal successo del libro "The Long Ships" di Frans Gunnar Bengtsson un best seller svedese ispirato alla tradizione vichinga. Fornisce un metodo standard economico e sicuro per scambiare informazioni tra dispositivi diversi utilizzando onde radio. Questi dispositivi possono essere personal digital assistant (PDA), telefoni cellulari, portatili, Computer, stampanti, macchine fotografiche, ecc. Bluetooth cerca i dispositivi coperti dal segnale (10 metri in ambienti chiusi) e li mette in comunicazione tra di loro. Questo standard è stato progettato con l'obiettivo primario di ottenere bassi consumi, un corto raggio di azione (da 10 a 100 metri) e un basso costo di produzione per i dispositivi compatibili. Lo standard doveva consentire il collegamento wireless tra periferiche come stampanti, tastiere, telefoni, microfoni, ecc, a computer o PDA o tra PDA e PDA. I telefoni cellulari che integrano chip Bluetooth sono venduti in milioni di esemplari e sono abilitati a riconoscere e utilizzare periferiche Bluetooth in modo da svincolarsi dei cavi. BMW è stato il primo produttore di autoveicoli a integrare tecnologia Bluetooth nelle sue automobili in modo da consentire ai guidatori di rispondere al proprio telefono cellulare senza dover staccare le mani dal volante. Attualmente molti altri produttori di autoveicoli forniscono di serie o in opzione vivavoce Bluetooth che integrati con l'autoradio dell'automobile permettono di utilizzare il cellulare mantenendo le mani sul volante a quindi aumentando la sicurezza della guida. Comunque lo standard include anche comunicazioni a lunga distanza tra dispositivi per realizzare delle LAN wireless. Ogni dispositivo Bluetooth è in grado di gestire simultaneamente la comunicazione con altri 7 dispositivi sebbene essendo un collegamento di tipo master slave solo un dispositivo per volta può comunicare con il server. Questa rete minimale viene chiamata pi-
conet. Le specifiche Bluetooth consentono di collegare due piconet in modo da espandere la rete. Dispositivi in grado di gestire due piconet e quindi in grado di fare da ponte tra le due reti dovrebbero apparire dei prossimi due anni. Ogni dispositivo Bluetooth è configurabile per cercare costantemente altri dispositivi e per collegarsi a questi. Può essere impostata una password per motivi di sicurezza se lo si ritiene necessario. Molti adattatori Bluetooth sono disponibili in commercio, alcuni includono anche una porta IrDA. Wireless Il termine wireless (dall'inglese senza fili) indica i sistemi di interconnessione tra dispositivi (computer, palmari, mouse, tastiere, stampanti, modem ecc.) che non fanno uso di cavi. I sistemi tradizionali basati su connessioni cablate sono detti wired.Il mezzo di trasporto dell'informazione può essere un segnale radio, la luce infrarossa o un fascio laser. Con questo tipo di sistema è possibile realizzare anche delle reti (Reti wireless) mettendoin collegamento più computer. Pendrive Un pendrive (chiamato anche chiavetta USB) è un'unità di memorizzazione di massa portatile utilizzabile mediante la porta USB di un comune personal computer. I dati solitamente vengono immagazzinati in una memoria flash contenuta nel pendrive. Il protocollo per il trasferimento dei dati dal personal computer al pendrive, e viceversa, è un protocollo standard denominato USB Mass Storage protocol. Tale standardizzazione ha incoraggiato l'inclusione dei driver di supporto e di inclusione nel file system locale da parte dei produttori di sistemi operativi quali Windows e Linux. Grazie alle dimensioni ridotte, all'assenza di meccanismi mobili (al contrario degli hard disk comuni) che lo rende molto resistente, alle sempre crescenti dimensioni della memoria e alla sua interoperabilità il pendrive si sta configurando, accanto ai CD e ai DVD come unità preferita da un crescente numero di consumatori per il trasporto fisico di dati. Nel download o upload di dati la chiavetta USB è il supporto più veloce che supera in velocità di lettura e scrittura CD e DVD, ma è più lento delle componenti interne del computer, che rispetto alla velocità di caricamento dei dati sono: memoria cache, RAM e Hard Disk. Software Il software è la parte "intelligente" del computer. E' un insieme di programmi che dicono alle parti meccaniche le operazioni che debbono eseguire. Il calcolatore è tanto
più intelligente quanto più è intelligente il programma che è stato scritto dal programmatore. In genere il software è classificabile in tre possibili tipologie, Il software residente, di base (o di sistema) e applicativo. Software residente E’ il software che permette di eseguire le prime istruzioni dopo l’accensione del computer. Appena acceso, il calcolatore inizia ad operare e ricerca nella memoria ROM le istruzioni da caricare in memoria RAM ed eseguire per prime. Tutto ciò avviene senza che l’utente possa fare niente ma gli permette di caricare il software di base senza il quale sarebbe praticamente impossibile usare direttamente l’hardware del computer. Questo processo è anche noto con il nome di bootstrapping. Software di Base (o di sistema) E’ spesso chiamato anche sistema operativo e consiste in un gruppo di programmi che gestiscono il funzionamento di base del computer. Il sistema operativo rimane sempre attivo dal momento in cui viene caricato (all’accensione della macchina) fino allo spegnimento. Sono gestite dal sistema operativo tutte le funzioni generali della macchina, come l’aspetto grafico delle visualizzazioni su monitor, la scrittura e la lettura dai dischi, la messa in esecuzione e la chiusura dei vari programmi, la ricezione e trasmissione di dati attraverso tutti i dispositivi di I/O. Software Applicativo Viene detto Software applicativo (o semplicemente "applicativi") l'insieme dei programmi che non sono compresi nel sistema operativo, ma che vengono invece installati dall'utente per svolgere compiti specifici. Per esempio sotto Windows il programma di videoscrittura Microsoft Word è forse l'applicativo più diffuso. Word non fa parte di Windows ma deve essere acquistato a parte e installato sulla macchina dopo che questa contiene già il sistema operativo. A rigore fanno parte degli applicativi anche alcune utilità che si installano assieme a Windows stesso, come il Blocco note, la Calcolatrice, Paint, WordPad; si tratta infatti di semplici programmi che non sono essenziali per il funzionamento della macchina (potrebbero anche essere rimossi senza comprometterne in alcun modo il funzionamento), ma vengono installati assieme al sistema operativo soltanto per offrire all'utente alcune semplici applicazioni di base. Infatti, se per assurdo su un computer si trovasse esclusivamente il sistema operativo senza nessun'altra applicazione, la macchina funzionerebbe perfettamente, ma l'utente non sarebbe messo nelle condizioni di poterla usare.
Possiamo tentare una classificazione degli applicativi in 5 categorie: Utilità di Sistema - si tratta di programmi che servono per migliorare la gestione e la sicurezza della macchina, come ad esempio gli stessi antivirus, oppure programmi per l'ottimizzazione delle risorse, per il controllo dello stato del sistema, la ripulitura dell'hard disk, ecc. Office Automation - programmi di ausilio nei normali lavori d'ufficio, quindi creazione e elaborazione di testi (word processor), gestione di basi di dati (database), fogli di calcolo, posta elettronica, navigazione in Internet, ecc. Applicazioni aziendali - progammi creati per le necessità specifiche delle aziende, come ad esempio i programmi per la fatturazione o per la gestione del personale, dei magazzini, dei macchinari industriali. Spesso si tratta di programmi creati ad hoc da aziende di produzione software. Strumenti di sviluppo - programmi per la creazione di oggetti multimediali (pagine Web, animazioni e CD interattivi), elaborazione audio/video/immagini, programmi che servono per la creazione di nuovi applicativi (authoring tools). Giochi e svago - giochi, emulatori, lettori audio e video. In definitiva si può dire che il Software di base serve alla macchina per funzionare, mentre il Software applicativo serve all'utente per lavorare.
CAPITOLO V Cenni di Architetture dei Calcolatori Funzionalità di un calcolatore Le principali funzionalità di un calcolatore devono prevedere l’interazione con l’ambiente esterno tramite il trasferimento di dati e informazioni. Tutto questo è supervisionato da un controllore che provvede a gestire i dati elaborati a seconda che questi debbano essere trasferiti o memorizzati. La macchina di von Neumann Facciamo qui riferimento ad una organizzazione di un sistema di calcolo effettivamente realizzato e reso operativo nell'ambito di un progetto dell'Università di Princeton sotto la guida del matematico John Von Neumann.
Il funzionamento della macchina di von Neumann Un programma eseguibile dalla macchina di Von Neumann consiste in una lista di istruzioni registrate in memoria centrale, che devono essere eseguite una alla volta secondo l'ordine specificato nel programma fino a quando non si incontra un’istruzione di controllo, la quale può alterare il flusso sequenziale stabilendo il numero d’ordine della successiva istruzione da eseguire. L'unità centrale di elaborazione, può accedere solo alle informazioni contenute nella memoria centrale, estrae le istruzioni del programma eseguibile a partire da quella il cui indirizzo si trova nel registro (PC) contatore di programma , le decodifica e le esegue secondo tre fasi dette di fetch, decode e execute, fino a quando viene eseguita l'istruzione di halt. Le fasi di elaborazione sono scandite da un segnale (di tensione a onda quadra da 0 a +5V generato da un oscillatore interno alla CPU, detto orologio di sistema) detto di clock, emesso appositamente per mantenere la sincronizzare tra le varie unità. L’intervallo che intercorre tra due successivi impulsi è detto periodo di clock. La frequenza del segnale di clock viene misurata in MHz (Mega Hertz, milioni di cicli al secondo). Maggiore è la frequenza, maggiore è la velocità della CPU. Una CPU da 200 MHz ha un periodo di clock di 5 ns (1/ (200*106)s) Fase di fetch All'inizio della fase di fetch il contenuto del PC, contiene l'indirizzo della prossima istruzione da eseguire, viene trasferito nel registro degli indirizzi (MAR Memory Address Register), e da lì sul bus degli indirizzi dando inizio al reperimento (fetch) e alla lettura della istruzione da eseguire. Trascorso il tempo d'accesso in memoria la locazione di memoria selezionata, contenente l’istruzione da eseguire, viene depositata sul bus dati e da lì giunge sul registro del registro dei dati (MDR), e in fine nel registro delle Istruzioni IR (Instruction Register). Al termine della fase di fetch della istruzione l'unità di controllo incrementa di uno il contenuto del PC, per predisporsi ad eseguire l'istruzione successiva.
Fase di decode Il registro istruzioni (IR) dato il formato delle istruzioni è logicamente diviso i due parti: la prima parte contiene il codice operativo e la seconda parte l'operando. Pertanto inizia la fase di decodifica del codice operativo a carico dell'unità di controllo la quale a seconda della operazione decodificata provvederà all'esecuzione della istruzione stessa. Fase di execute L'esecuzione della istruzione può comportare nuovi accessi in memoria per il recupero degli operandi (fetch operandi), in questo caso, prima della esecuzione vera e propria della istruzione, viene eseguita la fase di fetch degli operandi. Quando tutto ciò che comporta l'istruzione è caricato nei registri opportuni del processore l'unità di controllo esegue l'istruzione La logica sequenziale secondo cui il programma viene eseguito si chiama ciclo di esecuzione, ed è riportato nella successiva figura.
I passaggi da una fase all’altra del ciclo di esecuzione sono regolati dal clock. 1. Nella prima fase, chiamata input, il programma viene caricato in memoria centrale. 2. Nella seconda fase, richiesta prima istruzione, l’elaboratore prende in esame la prima istruzione passandola al microprocessore. 3. Nella terza fase avviene la decodifica in comandi elementari comprensibili al calcolatore, comandi rivolti a componenti specifici dell’elaboratore. 4. Nella fase di esecuzione l’istruzione viene eseguita. 5. Terminata l’esecuzione la macchina legge dalla memoria un’altra istruzione e ricomincia così il ciclo.
Questa sequenza di passi si svolgerà nello stesso identico ordine fino a che non sarà stata eseguita l’ultima istruzione Le macchine convenzionali moderne BUS (dati, indirizzi, segnali di controllo)
Microprocessor (CPU)
Memory
I/O driver
I/O driver
Monitor
CD
Registri
ALU
Figura 40 - Archietettura di riferimento MIPS
L'architettura MIPS è rappresentativa dell'architettura dei moderni computer, è semplice e chiara facile da apprendere rispetto l'architettura x86 che è molto complessa e con molti modi di indirizzamento e molti tipi di eccezioni In una moderna architettura hardware sono necessarie le seguenti caratteristiche: Flessibilità Adatta a svolgere diverse tipologie di compiti Modularità Ogni componente ha una funzione specifica Scalabilità Ogni componente può essere sostituito con uno equivalente Standardizzazione Componenti facilmente sostituibili in caso di mal funzionamento Riduzione dei costi
Dovuta alla produzione in larga scala Semplicità Di installazione ed esercizio del sistema
Calcolatori attuali seguono ancora i principi di Von Neumann ma con estensioni per migliorare le prestazioni.
processori dedicati o co-processori per eseguire in modo particolarmente efficiente e in parallelo alla CPU particolari operazioni, come quelle aritmetiche (processore aritmetico) o per la presentazione della grafica sul video (processore grafico, scheda grafica). possibilità di eseguire alcune istruzioni parzialmente in parallelo uso di gerarchie di memorie con prestazioni e costi decrescenti, come una memoria cache in cui tenere copia di parte dei dati della memoria centrale con accesso più rapido. macchine aventi diverse CPU che agiscono contemporaneamente (macchine parallele o multiprocessore), come i supercomputer per eseguire calcoli complicatissimi molto velocemente
Dal punto di vista della organizzazione della macchina come composizione di elementi costruttivi, la macchina di Von Neumann soffriva di un gravissimo difetto, che avrebbe impedito l'evoluzione dei sistemi di calcolo così come l'abbiamo conosciuto in questi ultimi anni: la mancanza di modularità. Nella struttura della macchina il comportamento del sistema é completamente determinato dalla Control Unit. Se per esempio volessimo cambiare l'unità di ingresso con un'altra (anche con funzionalità simili ma comandata da segnali di controllo diversi), allora dovremmo modificare più o meno drasticamente anche la Control Unit. Se volessimo aggiungere un secondo dispositivo di uscita, allora dovremmo cambiare (ampliare) l'insieme delle istruzioni della macchina convenzionale. L'interconnessione Bus Per aumentare la modularità di un sistema di calcolo, fin dagli anni '60 venne introdotta una innovazione architetturale fondamentale: la interconnessione di dispositivi mediante bus. La sua caratteristica principale é quella di svincolare l'unità di controllo (chiamata normalmente CPU, da Central Processing Unit) dagli altri dispositivi. Ogni dispositivo aggiuntivo (unità di ingresso, di uscita, dischi, ecc.) interagisce autonomamente col resto del sistema mediante un controllore connesso al bus di sistema. Normalmente questi controllori sono a loro volta dispositivi programmabili in grado di accedere alla RAM senza l'intervento della CPU.
L'aggiunta di un nuovo controllore connesso al bus permette quindi di aggiungere dispositivi inizialmente non previsti nel sistema, senza modifiche ai dispositivi esistenti. Ora verranno descritti gli elementi fondamentali di un calcolatore elettronico, ovvero la CPU, la memoria centrale, le periferiche ed il bus di comunicazione. La CPU accede in lettura e scrittura, tramite il bus di comunicazione, alle informazioni immagazzinate nella memoria, e comunica con le periferiche per eseguire le operazioni richieste. La memoria centrale La memoria provvede all'immagazzinamento dell'informazione gestita dal calcolatore. Una quantità maggiore di informazione viene inoltre immagazzinata nella memoria secondaria a supporto magnetico. Attualmente la quantità di memoria centrale gestita da un calcolatore può variare dalle decine di KBytes per i microcontrollori montati a bordo di apparecchiature, alle decine di GBytes per i Personal Computers fino ai TBytes utilizzati nei mainframes. L'elemento di base gestito dalla memoria è normalmente in byte. Ogni byte memorizzato è identificato da un indirizzo univoco. Il numero di bytes necessari per definire l'indirizzo dipenderà dalla dimensione della memoria. A seconda della tecnologia utilizzata nella loro costruzione, le memorie vengono suddivise in memorie bipolari e memorie MOS. Le memorie bipolari utilizzano transistor a giunzione (bjt): sono memorie veloci, ma consentono un grado di integrazione minore delle memorie MOS che utilizzano transistors ad effetto di campo (FET). A seconda della loro funzionalità le memorie sono divise in:
Memorie RAM: memorie ad accesso casuale, caratterizzate da stesso tempo di accesso per tutte le locazioni. Queste memorie mantengono l'informazione fin tanto che sono alimentate. Memorie ROM: sono memorie che mantengono il contenuto anche quando non sono alimentate. A loro volta le memorie ROM si dividono in memorie PROM (Programmable ROM) il cui contenuto viene impresso un volta per tutte tramite un apposito dispositivo di programmazione, in memorie EPROM (Erasable PROM), che possono essere riprogrammate tramite previa esposizione a raggi ultravioletti, ed in memorie EEPROM (Electrically Erasable PROM), che possono essere riprogrammate senza l'ausilio di raggi ultravioletti, e quindi senza rimuovere il chip. Tali memorie differiscono tuttavia dalle RAM per il fatto che l'operazione di scrittura richiede un tempo notevolmente maggiore (qualche millisecondo) rispetto alle operazioni di lettura. Normalmente è anche presente una memoria ROM che contiene il codice di
boot, ovvero il codice che viene eseguito dal calcolatore subito dopo la sua accensione, e che carica una versione minimale del sistema operativo. Tale codice provvederà a sua volta a caricare da disco o da rete il resto del codice del sistema operativo durante la fase iniziale di bootstrap. Poiché l'elemento di base del contenuto di una memoria è il singolo byte, cui corrisponde un indirizzo univoco, sorge il problema di come rappresentare all'interno della memoria quelle informazioni che richiedono più di un byte, quale, ad esempio, un numero rappresentato da un longword. Vi sono due diverse possibilità: la prima è quello di caricare il byte meno significativo all'indirizzo inferiore (little endian) e la seconda è quella di caricare il byte più significativo all'indirizzo inferiore (big endian). Supponiamo ad esempio il numero 254, corrispondente a 000000000000000000000000111111102, o, in maniera più concisa, a $000000FE, memorizzato a partire dall'indirizzo 1000. In formato big endian tale numero verrà memorizzato come Indirizzo Valore 1000 $00 1001 $00 1002 $00 1003 $FE mentre in formato little endian verrà memorizzato come Indirizzo 1000 1001 1002
Valore $FE $00 $00
Non esiste una definizione comune di tale formato. Alcune architetture (es. Pentium) utilizzano il formato little endian, mentre altre (es. Sparc, Motorola 68K) utilizzano il formato big endian. A causa di queste differenze si dovranno eseguire delle operazione di conversione (byte swapping) quando una sequenza di bytes viene trasferita tra due calcolatori che utilizzino un diverso formato. La CPU Il processore, o CPU (Central Processing Unit) rappresenta l'elemento centrale di un calcolatore. Esistono diverse famiglie di processori: ogni processore di una data famiglia rappresenta in generale un'evoluzione e pertanto è in grado di eseguire lo stesso codice eseguito dai processori precedenti della stessa famiglia. La CPU è a sua volta composta da un insieme di elementi, collegati tra di loro da uno o più bus inter-
ni (ovvero bus di comunicazione ricavati dallo stesso elemento di silicio della CPU). Tali componenti sono:
Registri Unità Logico Aritmetica (ALU) Unità Floating point (FPU) Unità di controllo
Registri Un registro rappresenta un piccolo elemento di memoria all'interno del processore, in grado normalmente di memorizzare una singola Word, Longword (caso tipico per i processori attuali a 32 bits) o Quadword (8 bytes). I registri vengono utilizzati per conservare alcune informazioni durante la sequenza delle fasi di esecuzione delle singole istruzioni nonché tra un'istruzione e l'altra. Alcuni registri sono accessibili al programmatore, ovvero possono essere riferiti direttamente nelle istruzioni di macchina, altri vengono utilizzati dalla CPU internamente. Tra questi ultimi sono comuni a tutte le architetture i seguenti:
Program Counter(PC): Contiene l'indirizzo in memoria della successiva istruzione da eseguire. Un programma corrisponde infatti ad una sequenza di istruzioni immagazzinate nella memoria centrale. La prima fase dell'esecuzione di ogni istruzione corrisponde al prelevamento (fetch) dalla memoria dell'istruzione da eseguire. Questa operazione richiede l'indirizzo in memoria del primo byte dell'istruzione, contenuto nel program counter. Dopo che l'istruzione è stata prelevata, il program counter viene incrementato del numero di bytes di cui l'istruzione è composta, e quindi conterrà l'indirizzo iniziale dell'istruzione successiva. Durante l'esecuzione della istruzione il program counter potrebbe venire modificato nel caso l'istruzione sia un'istruzione di salto che modifica l'esecuzione sequenziale del programma. Instruction Register(IR). Contiene l'istruzione corrente. Caricato durante la fase di fetch, tale registro mantiene il codice dell'istruzione durante le fasi successive di esecuzione, ovvero la fase di decode, in cui l'istruzione viene decodificata, e di execute, durante la quale vengono eseguite le operazioni specificate dall'istruzione. Status Register(SR). Contiene informazioni sullo stato corrente del processore. In particolare contiene i bits di condizione, ovvero bei flags che indicano particolari condizioni che si sono verificate nell'ultima istruzione eseguita. I bit di condizione sono generalmente: o Bit di Carry C: Posto ad 1 quando l'operazione aritmetica appena eseguita ha causato un riporto dal bit più significativo;
o o o
Bit di Zero Z : posto ad 1 quando il risultato dell'ultima istruzione è stato pari a 0; Bit di Overflow V: posto ad 1 quando l'ultima operazione ha causato un overflow; Bit di segno N: posto ad 1 quando il risultato dell'ultima istruzione è negativo.
Altri bits di condizione possono essere definiti nelle specifiche architetture. Oltre ai bits di condizione, altre informazioni vengono memorizzate nello status (o condition) register, quali il livello corrente di priorità delle interruzioni, e il livello di privilegio.
Memory Address Register (MAR). Contiene l'indirizzo corrente in un'operazione di lettura o di scrittura in memoria. Memory Buffer Register (MBR). Contiene il dato da scrivere o letto durante un'operazione di accesso alla memoria. Tale operazione infatti non è istantanea, ma richiede una sequenza di passi, dettata dalle condizioni sulle linee di controllo del bus. (Vedi sezione sul bus di comunicazione).
L'Unità Logico Aritmetica (ALU) L'unità logico aritmetica è rappresentata da una rete combinatoria composta di sommatori binari, shift registers, blocchi logici AND, OR, XOR, invertitori e multiplexers. L'attivazione di questi componenti è dettata da un insieme di linee di controllo che, opportunamente comandate dall'unità di controllo, fanno si che la ALU assuma la funzionalità desiderata. Nelle CPU attuali sono normalmente definite più Unità Logico Aritmetiche che possono operare in parallelo. L'Unità Floating Point (FPU) L'unità floating point consente di eseguire operazione su numeri reali, normalmente espressi in notazione floating point IEEE 754. Inizialmente la FPU era costituita da un chip separato dalla CPU, ed in mancanza di essa le operazioni su numeri reali dovevano essere eseguite via software, ovvero con un'opportuna sequenza di istruzioni che comportassero solo calcoli su numeri interi. Attualmente le CPU utilizzate nei Personal Computers montano a bordo dello stesso chip l'unità floating point, e pertanto il set di istruzioni della CPU viene esteso alle operazioni di manipolazione dei numeri reali.
Il modulo di controllo Il modulo di controllo rappresenta la parte centrale della CPU, che coordina la sequenza delle fasi di esecuzione delle istruzioni. L'esecuzione di ogni istruzione infatti richiede una sequenza di fasi diverse: la fase di fetch per leggere dalla memoria l'istruzione da eseguire, la fase di decode per la decodifica dell'istruzione, e la fase di execute, per l'esecuzione dell'istruzione stessa. Queste fasi possono a loro volta essere suddivise in altre fasi. La CPU pertanto non è rappresentata da una rete combinatoria, bensì da una macchina sequenziale, che attraversa un insieme di stati, sincronizzata da un segnale di clock. L'unità di controllo implementa tale macchina sequenziale, e definirà un certo insieme di bits per contenere lo stato. L'ingresso di tale macchina sequenziale sarà rappresentato dall'istruzione da eseguire (o più precisamente da una parte di essa corrispondente al codice operativo), e le uscite saranno le linee di controllo necessarie per la corretta configurazione della ALU, per la connessione dei bus interni, e per la configurazione dei multiplexer utilizzati al di fuori della ALU. L'esecuzione di un'istruzione richiederà pertanto un certo numero di cicli di clock: maggiore sarà la frequenza di tale clock (limitato tuttavia dai tempi di commutazione del circuito), più veloce sarà l'esecuzione delle istruzioni. Nella configurazione appena vista il modulo di controllo è rappresentato in principio da una rete combinatoria la quale, ricevendo in ingresso la codifica dello stato attuale e l'ingresso corrente, produce la codifica dello stato successivo e l'insieme delle linee di controllo. Tale implementazione prende il nome di logica cablata, e presenta lo svantaggio che una modifica nella sequenza di fasi (per aggiungere una funzionalità o per correggere un errore di implementazione) richiede di dover riprogettare la rete combinatoria. Una implementazione alternativa dell'unità di controllo definisce invece una memoria ROM, le cui locazioni contengono tanti bits quante sono le linee di controllo che devono essere generate. Il codice operativo dell'istruzione definirà un indirizzo iniziale nella ROM e le locazioni successive conterranno le linee di controllo da produrre in sequenza. Una di queste linee di controllo specificherà la terminazione della sequenza, e quindi inibirà la generazione di indirizzi crescenti ad ogni ciclo di clock, e terminerà la sequenza di esecuzione dell'istruzione corrente. Questa soluzione presenta il vantaggio di una maggiore flessibilità (basterà cambiare il contenuto della ROM per modificare il funzionamento della CPU) ma ha lo svantaggio di essere più lenta rispetto ad una logica cablata. Infatti in questo caso le linee di controllo non sono prodotte dall'uscita di una rete combinatoria, ma da una lettura di memoria e richiede pertanto un tempo maggiore di esecuzione (si ricordi che in una memoria un'operazione di lettura richiede un livello di multiplexing per l'attivazione delle celle di memoria indirizzate e la connessione degli switch tri-state per il trasferimento in uscita del contenuto selezionato). Quest'ultima soluzione implementativa prende il
nome di architettura microprogrammata: la sequenza memorizzata nella ROM in corrispondenza alla singola istruzione macchina corrisponde infatti ad un "microprogramma". Il Bus di comunicazione Il bus di comunicazione rappresenta il collegamento fisico tra la CPU e gli altri componenti. Diversi tipi di operazioni sono supportati da un bus di comunicazione. Ci concentreremo qui sulle operazioni di lettura e scrittura in cui la CPU scrive una locazione nella memoria o ne legge il contenuto. In questo caso l'operazione è supervisionata dalla CPU che pertanto rappresenta il master nella comunicazione. La memoria in questo caso ha un ruolo passivo, e rappresenta un componente slave. Il bus si compone fisicamente di un insieme di linee conduttrici: dei fili o delle piste conduttrici nel caso il bus sia esterno, delle aree opportunamente drogate nel silicio nel caso il bus sia interno alla CPU. Mettere a disposizione delle linee di conduzione non è tuttavia sufficiente per un trasferimento controllato dell'informazione. A tal scopo sarà necessario definire un protocollo di comunicazione. Il protocollo di comunicazione definisce il ruolo delle singole linee, e le sequenze necessarie per un'esecuzione controllata dei trasferimenti. Diversi protocolli di comunicazione sono utilizzati: tra questi ricordiamo il bus VME, utilizzato nei processori della serie Motorola 68K, cui si farà riferimento in questa esposizione, il bus PCI, utilizzato per la comunicazione con le periferiche in molti personal computers, il bus SCSI utilizzato per la comunicazione con dispositivi quali i dischi fissi. Una caratteristica del protocollo di comunicazione è data dalla frequenza di clock per il bus. Le operazioni sul bus sono infatti sincronizzate da un segnale di clock, la cui frequenza massima dipende dalle caratteristiche elettriche del bus (anche queste parte della specifica del protocollo). Le frequenze per il clock del bus è tipicamente di molto inferiore a quella delle CPU, a causa delle maggiori capacità che si hanno in un bus esterno rispetto all'interno del chip di silicio. Il PCI, ad esempio, rappresenta uno dei bus più veloci ed è caratterizzato da una frequenza di clock di 33 o 66 MHz, ben al di sotto delle frequenze di centinaia di MHz comuni nei processori attuali. I protocolli di comunicazioni tipicamente dividono le linee del bus in:
linee di indirizzo, dedicate al trasferimento degli indirizzi linee di dati, dedicati al trasferimento dei dati linee di controllo, dedicate ai segnali di handshaking necessari per la corretta esecuzione del trasferimento.
Il bus VME definisce le linee di controllo R/W (Read/Write), AS (Address strobe) e DTACK (Data Acknowledge) per la gestione delle operazioni di lettura e scrittura. Il livello della linea R/W indicherà se si sta eseguendo un'operazione di lettura o di
scrittura. Il funzionamento delle linee AS e DTACK è esemplificato dal seguente diagramma che definisce l'evoluzione temporale del protocollo. Figura 41
In un operazione di lettura la CPU inizialmente pone ad un valore definito le linee di indirizzo A1-A23 (in questo bus gli indirizzi sono specificati da 24 linee, ma poichè le operazioni sono eseguiti a words non è necessario specificare il bit meno significativo dell'indirizzo, che sarebbe sempre 0). Una volta che il livello elettrico di queste linee si è stabilizzato, la CPU segnala che un indirizzo valido è presente sul bus postando il livello della linea AS a basso. A questo punto la memoria risponderà ponendo il contenuto dei due bytes corrispondenti all'indirizzo specificato ed al seguente) sulle 16 linee di dati D0-D15. Tale operazione non sarà istantanea, e richiederà il tempo di accesso alle locazioni specificate (tipicamente di qualche decina di nanosecondi). Quando il livello delle linee di dati si sarà stabilizzato, la memoria segnala la disponibilità dal dato postando il livello della linea di controllo DTACK a basso. A questo punto la CPU potrà trasferire il contenuto delle linee di dati nel memory buffer register (MBR)e terminate la sequenza riportando a livello alto la linea di controllo AS. Un' operazione di scrittura è rappresentata invece dal seguente diagramma temporale: Figura 42
e differisce dalla precedente operazione di lettura, oltre che dal livello della linea R/W (non riportato nella figura), dal fatto che le linee di dati vengono impostate questa volta dalla CPU. Pertanto, quando il livello della linea AS si porta a basso, sia le linee di dati che di indirizzi saranno impostate, e la memoria in risposta provvederà alla memorizzazione dei due bytes, segnalando tramite la linea DTACK il termine della scrittura. Un protocollo simile viene utilizzato anche negli altri bus di comunicazione, che attualmente definiscono di norma 32 linee sia per gli indirizzi che per i dati. In alcuni casi le linee di indirizzi vengono utilizzate anche per i dati in un ciclo di clock successivo. Si parlerà in questo caso di bus multiplexati. Un'altra caratteristica comune a molti bus è la possibilità di eseguire trasferimenti veloci di blocchi di dati (block transfer). In questo caso, poiché i dati stanno ad indirizzi consecutivi, non vi è bisogno di trasferire l'informazione dell'indirizzo dopo aver trasferito il primo dato all'indirizzo iniziale. Ciò rende l'operazione di trasferimento più veloce in quanto non è necessario impostare le linee di indirizzi per i dati successivi, richiedendo quindi un tempo inferiore per il trasferimento del singolo dato. Si osserva infine che negli esempi presentati, le linee di controllo sono attive quando sono a livello basso. Questo è tipico di molti bus di comunicazione e deriva dal fatto che le linee sono collegate a più elementi (la CPU, le memorie e i dispositivi di I/O collegati al bus) in modalità open collector. Quando nessuno degli elementi guida la linea (ovvero la collega tramite un transistor alla massa) il livello della linea è portato ad alto tramite una resistenza di pull-up. Tale livello va basso se almeno uno degli elementi guida la linea, ma non comporta la rottura degli stadi di uscita se più di un elemento guida il livello della linea (il tutto si comporta come un OR). Le periferiche I dispositivi esterni, o periferiche, rappresentano il collegamento tra il calcolatore ed il mondo esterno. Un calcolatore senza alcuna periferica sarebbe completamente inutile. Il tipo di periferica dipenderà dal tipo di utilizzo del calcolatore. Se il calcolatore è rappresentato da un microcontrollore che coordina il funzionamento di un'apparecchiatura, le periferiche consisteranno in dispositivi per l'acquisizione dei segnali ed in attuatori, in quanto compito del microcontrollore è quello di acquisire un insieme di segnali per generare un insieme di comandi. In un Personal Computer, le periferiche saranno rappresentate dal terminale, dalla tastiera, dai dischi, dalle stampanti e probabilmente da una scheda di rete o da una scheda audio. Le periferiche possono esse-
re pertanto molto diverse tra loro e quindi possono avere velocità di trasferimento dato molto variabili, passando da qualche migliaio di bits al secondo per i terminali alle decine di milioni di bytes al secondo per i dischi magnetici. E' pertanto necessario che siano definiti dei meccanismi per sincronizzare i dispositivi esterni con la CPU. A tal scopo possono essere definite due diverse architetture:
Bus separato di Ingresso/Uscita (I/O). In questo caso un bus separato dal bus di memoria è definito per il collegamento con le periferiche. Se da un lato questa soluzione aumenta la complessità circuitale, dall'altro consente operazioni di I/O disgiunte, e quindi in parallelo, dalle operazioni di accesso alla memoria. In questo caso la sincronizzazione potrà essere eseguita tramite delle linee opportune di controllo in maniera analoga a quanto visto per le operazioni di lettura e scrittura in memoria. I/O memory mapped. In questo caso lo stesso bus di comunicazione usato per l'accesso della memoria è anche impiegato per l'accesso ai dispositivi di I/O. In tale soluzione ogni dispositivo definirà alcuni registri che vengono visti dalla CPU come locazioni di memoria. Il significato di ogni registro dipenderà dal tipo di dispositivo, e sarà compito del software (il driver) operare correttamente tramite tali registri. Si osservi che in questo caso le linee di controllo non possono essere utilizzate per la sincronizzazione tra CPU e dispositivo, perché altrimenti il bus di comunicazione non potrebbe essere utilizzato mentre la CPU è in attesa della risposta di un dispositivo lento. Pertanto l'accesso ai registri delle periferiche avverrà con tempi paragonabili ad un accesso in memoria, e la sincronizzazione avverrà attraverso il contenuto dell'informazione letta dai registri. Per esempio un dispositivo che generi dei dati per la CPU potrà indicare in un registro la disponibilità di un dato di ingresso. La CPU potrà verificare la presenza del dato leggendo tale registro, ed eseguire quindi il trasferimento del dato solo quando questo risulti disponibile.
CAPITOLO VI Linguaggi di Programmazione I Linguaggi formali Per chiarirci le idee vediamo brevemente quali sono le differenze tra i linguaggi formali e quelli naturali. Quest’ultimi sono quelli che utilizziamo normalmente per comunicare tra noi esseri umani ("naturali" nel senso che non sono nati a tavolino, ma spontaneamente). Essi non sono rigorosamente definiti, sono in continua evoluzione e spesso presentano delle ambiguità; hanno però una enorme potenza espressiva. I linguaggi formali, invece, sono completamenti definiti mediante regole esplicite, per cui è sempre possibile determinare la correttezza (grammaticale) di una proposizione; inoltre il significato di ogni frase è sempre privo di ambiguità. Però hanno un potere espressivo limitato. I linguaggi di programmazione sono un sottoinsieme di quelli formali. Essi possono essere definiti come il mezzo che ci permette di comunicare al computer la sequenza di operazione da effettuare per raggiungere un obiettivo prefissato. Oltre ai linguaggi di programmazione vi sono anche altri linguaggi formali. Un esempio è la notazione scacchistica utilizzata per descrivere con precisione e senza ambiguità le partite del diffuso gioco di strategia. Un'altra disciplina in cui si fa largo uso dei linguaggi formali è la Logica Matematica, in cui vengono utilizzati per descrivere le teorie matematiche e i processi deduttivi in modo rigoroso. Si noti, per inciso, che i legami tra la Logica Matematica e l'Informatica stanno diventando sempre più stretti con una forte influenza reciproca. Tra l'altro due linguaggi popolari, il Lisp e il Prolog, sono scaturiti proprio da teorie studiate in Logica Matematica, e precisamente dal lambda calcolo di Church e dal calcolo dei predicati del primo ordine.
Linguaggi di alto e di basso livello Non è possibile effettuare una rigida classificazione dei linguaggi di programmazione, ma nel seguito tenteremo comunque di individuare alcune categorie generali in cui si possono suddividere. Una prima distinzione possiamo farla tra i linguaggi a basso e quelli ad alto livello. Ogni processore ha un proprio linguaggio che ad ogni stringa di bit fa corrispondere una operazione elementare come il caricamento di un registro interno al processore o la somma tra una cella di memoria e un registro. Questo tipo di linguaggio, detto linguaggio macchina, essendo molto vicino alla logica del processore, risulta essere molto lontano dal modo di ragionare dell'uomo, per cui utilizzarlo per la codifica di algoritmi comporta un lavoro molto lungo e difficile. Agli albori dell'informatica questo era l'unico modo di programmare un computer, per cui tale attività era riservata solo a tecnici super specializzati. Per alleviare queste difficoltà si pensò di creare dei linguaggi intermedi con cui scrivere i programmi. Un algoritmo codificato in questo modo non è più direttamente eseguibile dal processore, ma è necessario utilizzare un apposito programma traduttore che converte il programma originale (detto file sorgente) nelle corrispondenti istruzioni in linguaggio macchina (ottenendo così il file oggetto). Il primo di tali linguaggi fu il linguaggio Assembler, in cui al posto di ogni istruzione macchina viene usato un codice mnemonico ad esso associato. L'Assembler, pur permettendo una semplificazione del lavoro, costringe ancora a ragionare in un modo strettamente legato a quello del processore. Per cui in seguito si cercò di distaccarsi sempre più dalla logica dei processori arrivando così ai cosiddetti linguaggi ad alto livello orientati non più alla macchina ma alla soluzione di problemi. Un'altro importante vantaggio dei linguaggi ad alto livello (e, storicamente, un'altra spinta al loro sviluppo) è il fatto di essere virtualmente indipendenti dal processore e dalla macchina particolare su cui si sviluppa. In questo modo è possibile utilizzare lo stesso sorgente su macchine diverse, ovvero come si dice in gergo informatico si ha una maggiore portabilità delle applicazioni (e dei programmatori che non sono costretti a imparare un nuovo linguaggio ogni volta che devono lavorare su una macchina diversa). Al giorno d'oggi l'Assembler viene utilizzato solo in casi particolari: o quando è necessario molta efficienza (in quanto anche se i traduttori cercano di ottimizzare il codice macchina risultante, lavorare direttamente in Assembler di solito permette di avere un codice migliore) oppure quando si deve operare a livello macchina (ad esempio per interfacciarsi a delle schede hardware). Per cui normalmente un'applica-
zione viene scritta in gran parte in un linguaggio ad alto livello, mentre solo le parti più delicate vengono, eventualmente, codificate in Assembler. Le Categorie La letteratura informatica normalmente suddivide i linguaggi ad alto livello in quattro categorie (imperativi, funzionali, dichiarativi ed orientati ad oggetto). Noi utilizzeremo una classificazione più ampia esaminando anche alcune categorie meno consuete. Sottolineiamo comunque che le classi considerate non sono mutuamente esclusive, per cui un linguaggio può appartenere anche a più di una categoria. Analizziamo ora le loro caratteristiche. • Imperativi: il programma è costituito da una sequenza di istruzioni il cui effetto è quello di modificare il contenuto della memoria dell'elaboratore o di determinare le modalità di esecuzione di altre istruzioni; in questo modello assume un ruolo fondamentale l'istruzione di assegnazione. Sono imperativi la maggior parte dei linguaggi più diffusi (Pascal, Basic, Fortran, C, Cobol, ecc.). • Funzionali: il programma è considerato come il calcolo del valore di una funzione; in un linguaggio funzionale puro l'assegnazione esplicita risulta addirittura completamente assente (si utilizza soltanto il passaggio dei parametri). In tale modello rivestono particolare importanza la ricorsione, in pratica l'utilizzo di funzioni che richiamano se stesse e, come struttura dati, la lista (sequenza ordinata di elementi). Il più importante rappresentante di questa categoria è senz'altro il Lisp (LISt Processing). • Dichiarativi (o logici): il programma è considerato come la dimostrazione della verità di una asserzione; il sorgente è costituito da una sequenza di asserzioni di fatti e regole. Non è necessario indicare esplicitamente il flusso di esecuzione, ma dato un obiettivo di partenza (il goal) è il sistema che cerca di individuare i fatti e le regole rilevanti. In tale ricerca assumono importanza meccanismi quali il pattern matching (in italiano potremo tradurre in combaciamento di forme) e il backtracking (in pratica se il sistema durante la ricerca entra in un vicolo cieco, ritorna alla scelta fatta più recentemente e prova ad applicare la regola o il fatto seguente). Il fatto che vi sia una netta separazione tra la parte dichiarativa (il cosa fare) e la parte procedurale (il come) rende un programma scritto in un linguaggio logico particolarmente leggibile. I linguaggi logici risultano particolarmente adatti a risolvere problemi che riguardano entità e le loro relazioni. Mentre nelle normali applicazioni risultano essere di difficile utilizzo, anche perché, ma non solo, comportano un modo di programmare completamente diverso dal solito. L'esemplare più noto di questa famiglia è il Prolog (PROgramming in LOGic). • Strutturati: man mano che l'ars programmandi si sviluppava si sono individuate
delle metodologie appropriate. Le più importanti sono la programmazione strutturata e la programmazione ad oggetti. La programmazione strutturata è una tecnica il cui scopo è di semplificare la struttura dei programmi, limitando l'uso delle strutture di controllo a pochi casi semplici, tutti con un solo ingresso e una sola uscita. Tali metodologie sono state in seguito immerse in nuovi (e in già esistenti) linguaggi, dandone un esplicito supporto. Ad esempio per evitare l'uso indiscriminato del malefico GOTO (salto incondizionato) sono state introdotte istruzioni di controllo del flusso più strutturate come il WHILE, FOR e l'UNTIL. La maggior parte dei linguaggi oggi diffusi sono strutturati, anche se spesso permettono comunque l'uso di strutture di controllo non strutturate in quanto la pratica ha dimostrato che, anche se raramente, vi sono dei casi in cui, ad esempio, con un GOTO si ottiene una maggiore leggibilità del codice. Ciò avviene soprattutto nella gestione delle eccezioni (ad esempio nel trattamento delle situazione di errore). • Orientati ad oggetti: il programma è considerato l'effetto dell'interazione di un insieme di oggetti (insiemi di dati e algoritmi che manipolano questi dati) che comunicano con l'esterno mediante messaggi. Assumono rilevanza concetti quali incapsulamento, ereditarietà (si possono costruire oggetti che ereditano le caratteristiche di un altro) e polimorfismo. Oltre a linguaggi specializzati che implementano i principi di tale metodologia (Smalltalk), sono nate delle estensioni dei linguaggi già esistenti, che li integrano (ad es. C++ per il C, CLOS per il Lisp, Java). • Equazionali: il programma è considerato come la risoluzione di equazioni. • Paralleli: in tali linguaggi vi sono dei meccanismi espliciti per indicare compiti che possono essere effettuati in parallelo. Il più diffuso è senz'altro l'Occam. •Event driven: una delle cause della difficoltà di programmare in Windows è che si lavora in un ambiente event driven (orientato agli eventi) con linguaggi che non supportano direttamente tale paradigma. In un ambiente event driven non esiste più una sequenza determinata di comandi da eseguire ma una serie di reazioni che il sistema ha rispondendo a determinati stimoli esterni o interni. Questo è il segreto dell'enorme successo che ha riscosso il Visual Basic della Microsoft, permettendo di creare facilmente applicazioni sotto Windows, proprio perché supporta direttamente il flusso event driven. •Atipici: ad esempio, anche i fogli elettronici possono essere considerati linguaggi di programmazione in cui, in una certa misura, le relazioni temporali sono sostituite da relazioni spaziali (il valore di una cella dipende dal valore di altre). •Linguaggi visivi: in cui si utilizzano costrutti e grammatiche di tipo grafico o iconico.
CAPITOLO VII Software Di Base E Software Applicativo Introduzione Il software di base è costituito dall'insieme di quei programmi il cui scopo è quello di rendere operativo il computer, cioè di metterlo in grado di eseguire programmi per risolvere i problemi dell'utente. Tipici esempi di software di base sono i sistemi operativi, insieme di programmi che gestiscono l'hardware e forniscono un supporto per l'esecuzione di programmi che risolvono particolari problemi dell'utente. Il software di base è strettamente legato alle caratteristiche dell'hardware di ciascun computer per cui non è necessario che l'utente ne conosca i dettagli tecnici. Il sw di base include
Sistema operativo (SO) Compilatori, linker, loader Interpreti
Compilatore: nell'accezione più generica, il compilatore è quel programma che traduce automaticamente il codice scritto in un linguaggio, in un altro. Un compilatore è composto generalmente dalle seguenti componenti: analizzatore lessicale, parser, ottimizzatore, generatore di codice. Generalmente si utilizza un compilatore per tradurre un linguaggio ad alto livello, quale il C (anche se in C si possono dare anche dei comandi di basso livello), in linguaggio assembly (linguaggio a basso livello). Interpreti e traduttori…. I traduttori sono quei programmi che permettono di effettuare la traduzione dal codice sorgente (non eseguibile dalla CPU) al linguaggio macchina. Essi sono: Assemblatori (che traducono ogni istruzione dal linguaggio assembler in linguaggio macchina); Interpreti; Compilatori.
L'interprete di un linguaggio è un programma che legge una alla volta le istruzioni di un programma sorgente; verifica la correttezza sintattica della istruzione, sulla base della sintassi del linguaggio; in caso positivo (assenza di errori), sulla base della semantica del linguaggio, la traduce nella corrispondente sequenza di istruzioni in linguaggio macchina e la esegue.
Figura 34 Il software applicativo è costituito dall'insieme dei programmi che risolvono determinati problemi dell'utente. Esempi di software applicativi sono i programmi di contabilità, i programmi di videoscrittura, i programmi di elaborazione grafica, ecc. E' essenziale che il software applicativo interagisca con il software di base per poter funzionare. Esso inoltre può essere suddiviso in software personalizzato, cioè realizzato appositamente in base alle richieste di un singolo utente, e software standard o package, cioè software realizzato per risolvere una gamma di problemi abbastanza comuni e pertanto diretto a più utenti.
Tra gli svariati tipi di software applicativi “orizzontale” i più utilizzati comunemente in azienda vi sono • • • • • •
programmi di videoscrittura (word processor) fogli elettronici programmi di presentazione programmi di grafica programmi gestionali e di contabilità sistemi per la gestione dei database
Sia il software di base che il software applicativo per poter essere eseguito deve essere caricato nella RAM. Generalmente sia i dati che i programmi sono contenuti in strutture logiche chiamate file o archivi e memorizzati su supporti di memoria di massa (hard disk, floppy disk, nastri magnetici) in modo che le relative informazioni non si perdano quando il computer è spento. All'accensione del computer il sistema operativo viene caricato dal supporto di memoria di massa, su cui si trova, nella RAM, rendendolo pronto per l'esecuzione dei programmi applicativi. Un programma applicativo deve essere anch'esso caricato in RAM per poter essere eseguito. L'esecuzione di un programma consiste nella esecuzione da parte del processore di ciascuna delle istruzioni che compongono il programma stesso. Un programma è un insieme di istruzioni che, eseguite dal processore di un elaboratore, risolve un determinato problema. Tuttavia le istruzioni devono essere espresse in forma tale da essere “comprese" dal calcolatori. L'installazione E’ il processo tramite il quale un nuovo software viene inserito nel computer. Di solito non si tratta di una semplice copia del file eseguibile sull'hard disk, quanto piuttosto di una complessa procedura di interfacciamento fra la nuova applicazione ed il sistema operativo (che deve aggiornare tutta una serie di file di configurazione generali). Per fortuna l'istallazione è quasi sempre realizzata attraverso una procedura automatica che richiede solo un intervento minimo da parte dell'utente (tipicamente all'utente viene chiesto solo di specificare alcune opzioni, come il nome della cartella in cui copiare il programma, se eseguire l'installazione standard o eliminare/aggiungere alcuni componenti opzionali, ecc.). L'installazione si esegue una sola volta e da quel momento in poi il programma è sempre disponibile per l'uso. Oggi esistono due modi principali per procurarsi nuovo software: acquistare da un rivenditore i CD di installazione o scaricare (download) da Internet il programma di installazione (esiste anche un terzo modo, che è fare una copia pirata, ma di questo discuteremo nel paragrafo del copyright). Per installare il software attraverso un CD è sufficiente inserire il disco nel drive e la procedura parte da sola; se così non fosse allora bisogna cercare sul
CD un file eseguibile (.exe), che dovrebbe chiamarsi "setup.exe" o "autorun.exe" o "install.exe" o qualcosa di simile (comunque un .exe), e farlo partire con un doppio click. L'installazione attraverso un file scaricato da Internet è ancora più semplice: se è un file .exe basta un doppio click sull'icona del file per attivare la procedura. A volte il file scaricato da Internet può essere di tipo .zip (archivio di file compressi o, secondo il gergo comune, “zippati”), in questo caso occorre prima effettuare la decompressione dei file attraverso un programma opportuno (WinZip, o altri) e poi cercare il file eseguibile come per il CD. Ad ogni modo, all'interno del file zip decompresso o nelle pagine del sito Internet, dovrebbe trovarsi sempre una breve guida all'installazione (quasi sempre solo in inglese). Il Copyright Nell'aquisto del CD di installazione software è sempre compresa anche la licenza d'uso personale che consente di utilizzare liberamente quel software per la propria attività (i termini esatti della licenza sono sempre inclusi nella documentazione allegata al prodotto). Tipicamente il costo di un software per PC va da poche decine di Euro fino ad alcune migliaia, in funzione della complessità del prodotto. Il software scaricato da Internet è invece soggetto a due tipi di licenza: freeware e shareware. Il software freeware è gratuito e può essere copiato e usato liberamente (eccetto rivenderlo ad altri); si tratta di solito di programmi relativamente semplici, messi a disposizione del pubblico per motivi pubblicitari (di solito sono versioni semplificate di prodotti a pagamento, oppure versioni di lancio per nuovi software) o anche per semplice generosità dei creatori. A volte (anzi, spesso) l'uso gratuito viene vincolato ad impieghi esclusivamente non commerciali Il software shareware è dato "in prova" gratuita per un periodo di tempo limitato (per esempio 30 giorni) a partire dal momento dell'installazione. Una volta scaduti i termini, se l'utente è soddisfatto e vuole continuare ad usare il prodotto, deve acquistarlo, altrimenti deve rimuoverlo dalla macchina. I programmi shareware alla scadenza si comportano in maniera diversa: alcuni avvisano l'utente con un messaggio del tipo "Guarda, che mi dovresti pagare!", ma continuano a funzionare. Altri invece smettono di funzionare o funzionano in modalità ridotta (per esempio non consentono più di salvare i file). I programmi shareware riacquistano la completa funzionalità (e legalità) solo con l'inserimento di una "chiave software" che il produttore fornisce dopo il pagamento. Oltre ai programmi freeware e shareware si possono trovare su Internet anche programmi in versione demo (abbreviazione di demonstration): si tratta di versioni dimostrative gratuite di software a pagamento, che però funzionano fin da subito in
maniera parziale (per esempio non consentono di salvare i file, o hanno solo alcune funzioni disponibili). A parte i siti delle case produttrici, esistono due siti Internet che raccolgono buona parte del software disponibile su Internet: si tratta di TuCows e di CNET Download. Un sito in italiano per il download è Volftp della Mondadori. La copiatura dei CD di software è consentita unicamente come copia di riserva per l'utente che li ha acquistati (nell'eventualità che i CD originali si rovinassero). Non è consentito invece né copiare i CD per cederli ad altri (a nessun titolo), né usare gli stessi CD originali per effettuare più installazioni su diverse macchine (a meno che la licenza non lo preveda espressamente); si parla in questi casi di software pirata. Per quanto riguarda inoltre i programmi shareware, esiste la possibilità di reperire su Internet delle "chiavi pirata" (dette cracks) che ne sbloccano il funzionamento senza aver pagato la licenza. Inutile dire che, anche in questo caso, si tratta di un'operazione illegale (in gergo, si parla di "programmi craccati"). Si tenga presente inoltre che il software su Internet non ha mai un prezzo proibitivo (spesso si tratta di poche decine di dollari) e che con l'acquisto legale si favorisce l'ulteriore disponibilità di nuovo software: se nessuno pagasse non ci sarebbe più la possibilità di trovare i programmi in rete. Il software pirata è diffusissimo per uso personale; le stesse aziende produttrici lo tollerano di buon grado, perché questo favorisce comunque la conoscenza del programma e quindi, di riflesso, anche la sua diffusione legale. Non viene invece assolutamente tollerato l'uso professionale: chi usa software pirata per il lavoro o per lucro si espone al rischio di grosse sanzioni (che, a seconda dei casi, possono diventare anche penali).
CAPITOLO VIII Sistemi Operativi Premessa Introduzione ai sistemi operativi Un sistema operativo è un insieme di istruzioni che consente al computer di caricare i programmi in memoria e di eseguirli, di registrare, leggere, e modificare i dati sui dischi rigidi o sui floppy. Inoltre, consente all’utilizzatore di avere un controllo sulla memoria del computer e sul modo nel quale i dati caricati in memoria verranno trattati. Queste funzioni solo raramente vengono richieste in modo esplicito dall’utilizzatore del computer. Il più delle volte questi lavora con un programma, ad esempio di contabilità o di elaborazione testi, che prevede la lettura di dati dal disco, la visualizzazione sul monitor, la digitazione sulla tastiera, la registrazione del lavoro effettuato, la stampa su carta. Apparentemente è il programma ad effettuare tutte queste operazioni, in realtà il nostro software si limita all’elaborazione dei dati in memoria, per tutto il resto si deve affidare al sistema operativo. Ogni singola attività ha origine da una richiesta del programma al sistema operativo, che provvede ad eseguirla ed a restituirne i risultati. La pressione di un tasto sulla tastiera viene percepita dal sistema operativo, che provvede a notificarla al programma. Questi decide se tenerne conto, eventualmente la elabora e, se è il caso, visualizza sul monitor un segnale che può essere la semplice lettera corrispondente al tasto, oppure un altro messaggio, o il risultato dell’elaborazione. Il programma può anche non tener conto della pressione del tasto e continuare indisturbato nel suo lavoro. Se l’utente vuole operare con un file registrato su disco, egli impartisce un comando al suo programma, il quale deve passare la richiesta al sistema operativo che provvede ad azionare il disk drive, a muovere la testina, a cercare il file nel disco, a leggerlo, a collocarlo in RAM ed infine a metterlo a disposizione del programma. Eventuali errori in questa successione di azioni, ad esempio l’assenza del dischetto dal drive o la mancanza del file sul dischetto, vengono gestiti dal sistema operativo. Tranne in caso di errori di questo tipo, il lavoro del sistema operativo e la sua interazione con il programma sono del tutto invisibili per l’utente. Ciascun programma è strettamente legato al sistema operativo con cui deve essere eseguito. Un programma realizzato per funzionare in coppia con un sistema operativo, può funzionare solo se è presente quel determinato sistema operativo. Molte funzioni del programma, come abbiamo visto, sono demandate al
sistema operativo, al quale il programma si limita ad impartire le dovute istruzioni. Un diverso sistema operativo non riuscirebbe ad interpretare correttamente queste istruzioni, ed una volta caricato in memoria il programma, il computer si bloccherebbe. L’importanza del sistema operativo è evidente. Qualsiasi programma vi debba convivere, ne mutua la velocità, il funzionamento, la logica, ed anche l’aspetto estetico. Un cattivo programmatore può anche creare programmi brutti e lenti con un sistema operativo potente, ma neanche un programmatore bravissimo potrebbe creare un programma bello e veloce con un sistema operativo lento e farraginoso. E comunque anche il programma più brutto e lento sarebbe meno brutto e meno lento se fosse stato creato per un sistema operativo veloce e funzionale. Il Bootstrap Il sistema operativo viene anche chiamato software di sistema, proprio perché è inscindibile dal sistema e ne costituisce la base. Una prima parte di sistema operativo è presente in un’area prefissata di memoria ROM. Questo primo segmento ha il compito di permettere al computer, all’accensione, di leggere dal disco e caricare in memoria la seconda parte del sistema operativo, composta spesso da molti file. Durante questa prima operazione, chiamata bootstrap, vengono eseguiti anche una serie di piccoli test dei componenti del sistema, dal microprocessore alla ROM, dalla RAM ai coprocessori dedicati. Questi test servono a constatare che il computer sia veramente in grado di leggere la parte successiva di sistema operativo e di caricarla in RAM. Un sistema operativo viene creato in diretto collegamento con la struttura hardware su cui deve agire: - microprocessore; - configurazione RAM e ROM; - coprocessori; - schede; - periferiche di input/output; - caratteristiche dei supporti di registrazione dei dati.
Sistema operativo e microprocessore Il sistema operativo è strettamente correlato al microprocessore presente. I computer che usano un microprocessore Intel della famiglia 80xxx possono utilizzare il MSDOS o Windows della Microsoft. Modelli precedenti di computer, che avevano il microprocessore Zilog Z80, utilizzavano il sistema operativo CP/M. Esiste solo un sistema operativo che può lavorare con microprocessori diversi: Unix. Si tratta di un sistema operativo derivato dal mondo dei computer di grosse dimensioni, i mainframe, utilizzati nei centri calcolo industriali o universitari. Unix è così utile, versatile e diffuso, che è stato importato anche nel mondo del personal. In realtà non si tratta di un sistema operativo uguale per tutti, ma semplicemente di sistemi operativi diversi che utilizzano gli stessi comandi. Infatti esistono versioni Unix per ciascuno microprocessore, e se cercassimo di caricare la versione Unix creata per il Motorola su un computer dotato di Intel, non otterremmo nulla. Né i supporti formattati dalla versione di Unix per Intel potrebbero essere letti dalla versione di Unix sotto Motorola. Il set delle istruzioni è però identico, perciò un programma elaborato con un microprocessore (salvo qualche adattamento) gira anche su tutti gli altri. Questa flessibilità fa di Unix, o di una sua evoluzione, il sistema operativo del futuro. Tuttavia esso richiede notevoli risorse di memoria e di potenza elaborativa per fare il suo lavoro, con pesanti conseguenze sui costi delle macchine che lo adottano. Tranne che in casi particolari, come in applicazioni grafiche specializzate, nella programmazione o nella coesistenza con mainframe, Unix non ha un utilizzo molto diffuso nei personal. La versione Unix per i personal è Linux.
Categorie di sistemi operativi Oltre alle differenze materiali, che ne determinano una pressoché completa incompatibilità, esistono anche rilevanti differenze di sostanza.Un sistema operativo può essere monoutente o multiutente se permette l’uso da parte di uno solo o di più utenti contemporaneamente, e può essere monotask o multitask se consentire il funzionamento di uno solo o di più programmi. Con un sistema operativo monoutente e monotask il computer può essere utilizzato da una sola persona per volta, che lavora con un solo programma. Per passare da un programma di calcolo ad uno di registrazione finanziaria è necessario chiudere il primo programma e quindi far partire il secondo. Con un sistema operativo monoutente e multitask la persona che utilizza il computer
può lavorare contemporaneamente con il programma di calcolo e con quello finanziario senza dover chiudere il primo per passare al secondo. Sarà compito del sistema operativo gestire le risorse della macchina, sia di memoria che di input/output, fra i due, o più, programmi in esecuzione. Con un sistema operativo multiutente e multitask una persona può lavorare con programmi diversi, mentre contemporaneamente un terminale od un altro personal ha accesso allo stesso computer e lavora, a sua volta, con altri programmi. I primi sistemi operativi, come il CP/M, DOS ed il Mac/OS, erano monoutente e monotask. Con un vero sistema operativo multitask, invece, tutti i programmi funzionano contemporaneamente e, mentre l’utente introduce dei dati in un programma, l’altro continua ad elaborare i suoi calcoli.
L’interfaccia con l’utilizzatore Quando è in esecuzione un programma, il sistema operativo è pressoché invisibile all’utente. Tuttavia esistono molte condizioni nelle quali l’utente deve lavorare direttamente con il sistema operativo, impartirgli comandi e riceverne risposte. Al di là del lavoro che si può svolgere con un programma, è spesso necessario effettuare una copia di un file, registrarlo su un sopporto, cambiargli nome od anche cancellarlo. Questi sono compiti precisi del sistema operativo. La stessa azione di scegliere un programma e di lanciarlo in esecuzione, è un comando impartito al sistema operativo. Ogni sistema operativo possiede una serie di comandi, ognuno dei quali svolge una funzione univoca. I comandi, per essere riconosciuti come tali, devono essere inviati con una determinata procedura. Insieme al comando spesso devono essere forniti, secondo un preciso ordine e con forme rigorose, parametri che ne condizionino l’esecuzione o indicazioni sui dischi od i file che ne devono essere oggetto. Esistono due modi per impartire comandi al sistema operativo: - direttamente, tramite la digitazione dei comandi sulla tastiera, con una riga di testo su schermo;
Figura 35
- indirettamente, tramite lâ&#x20AC;&#x2122;uso di un mouse o di tasti funzione, nellâ&#x20AC;&#x2122;ambito di una interfaccia grafica che operi da intermediario fra lâ&#x20AC;&#x2122;utente e il sistema operativo.
Figura 36
Struttura di un Sistema Operativo Monolitica Il sistema monolitico, fondamentalmente, non ha struttura, quindi il sistema operativo è una collezione di procedure compilate in un unico oggetto che si possono chiamare (e vedere) a vicenda, senza che ci siano dei controlli o delle regole particolari per evitare azioni sbagliate (system call bloccanti). Ma un minimo di struttura si può comunque dare, come mostrato in Figura.
Figura 37 Un semplice modello di struttura di un sistema monolitico. Nella figura, infatti, si ha la seguente suddivisione: Un programma principale (main procedure) che richiama le procedure di servizio. Le procedure di servizio (service procedures) che effettuano le system call. I programmi di utilità (utility procedure) che aiutano le procedure di servizio. Un programma utente, generalmente, esegue una system call che cambia la modalità della macchina da "modo utente" a "modo kernel"; il sistema operativo (in modo kernel) prende i parametri del programma, effettua la system call e riporta il controllo al programma utente. I più comuni SO monolitici sono UNIX, Linux e Windows.
Client-Server Il modello client-server si basa sull'idea di minimizzare le funzioni che girano in modo kernel, sviluppando un nucleo minimo chiamato microkernel che offre le funzioni base per la gestione dei processi e lo scambio di messaggi. Siccome molte funzioni vengono svolte da processi server che girano in modo utente, questi non hanno accesso diretto all'hardware e devono comunicarci con messaggi speciali. Il modello client-server è piÚ sicuro ma meno efficiente di un sistema monolitico; infatti se viene riscontrato un errore questo non "condanna" il sistema ad arrestarsi totalmente.
Figura 38
Nei sistemi distribuiti il modello client-server presenta molti vantaggi, come ad esempio la possibilità di non curarsi dove un messaggio sia fisicamente, o come venga mandato attraverso la rete (se ad un server locale o remoto), l'importante è che il messaggio venga mandato e che si ottenga una risposta. Spesso si costruisce un meccanismo nel kernel ma si lascia la decisione di policy (politica) ai server. .
Figura 39
Buccia di cipolla La struttura di un sistema operativo puo' essere definita "a cipolla": si hanno 6 strati , ognuno dei quali si occupa di svolgere diversi compiti: - Il primo strato gestisce le interruzioni e i driver: le procedure di interruzione mettono il sistema in uno stato di attesa, ad esempio aspetta che sia premuto un tasto; i driver regolano la gestione dei dispositivi di ingresso e uscita, senza interferire con il programma in esecuzione. - Nel secondo strato si trovano la gestione della memoria: file paging, frammentazione, indirizzamento. - Nel terzo strato si trovano i Device: monitor, tastiera e mouse sono Device, dispositivi logici che comandano dispositivi fisici. - Nel quarto strato c'e' il File System :questo rappresenta le modalita' con cui viene interrogata la memoria di massa; si trova anche un convertitore che si occupa di trasformare e di ordinare i file nelle diverse cartele. - Il quinto strato e' a volte chiamato "User Interface Toolbox": effettua il collegamento con gli strati inferiori e le applicazioni finali; e' diviso in tanti blocchi logici, i Manager, ognuno dei quali e' rappresentato da una serie di procedure; l' insieme di tutte le procedure e' chiamato API. - Il sesto strato e' rappresentato dall'interfaccia utente, il cui compito e' quello di rendere visibile l'organizzazione dei file e di semplificare l' utilizzo delle applicazioni. Non è propriamente uno strato del sistema operativo poichĂŠ è costituito da tutti i programmi applicativi utilizzabili dallâ&#x20AC;&#x2122;utente, ma in molte rappresentazioni viene classificato come tale Software applicativo Interprete comandi (shell) Gestione dei file Gestione delle periferiche Gestione della memoria Gestione CPU
HW
Figura 49
CAPITOLO IX Introduzione alle Reti di Calcolatori, Internet ed il World Wide Web Premessa Una rete informatica è un insieme di PC e di altri dispositivi che sono collegati tra loro tramite cavi. Il sistema consente a questi dispositivi di comunicare tra loro e di condividere informazioni e risorse. Le reti possono avere dimensioni differenti ed è possibile ospitarle in una sede singola oppure dislocarle in tutto il mondo.
Figura 40 Una rete che è collegata su un'area limitata si chiama "Rete Locale" oppure LAN (Local Area Network). Spesso la LAN è localizzata in una sola sede. Per WAN (Wide Area Network) si intende un gruppo di dispositivi o di LAN collegate nell'ambito di una vasta area geografica, spesso mediante linea telefonica o altro tipo di cablaggio (ad es. linea dedicata, fibre ottiche, collegamento satellitare, ecc..). Uno dei più grandi esempi di WAN è l'Internet stessa. Esistono diverse tecnologie LAN; le più comuni sono: Ethernet, Fast Ethernet e Gigabit Ethernet. Una rete può essere formata da una o più di queste tecnologie. Le reti Ethernet, Fast Ethernet e Gigabit Ethernet funzionano in modo simile e la differenza principale è data dalla velocità alla quale trasferiscono le informazioni. Ethernet funziona a 10 Megabit per secondo (o Mbps), Fast Ethernet a 100Mbps e Gigabit Ethernet a 1000 Mbps. I dispositivi di
una rete comunicano trasmettendosi reciprocamente informazioni; le informazioni trasmesse sono gruppi di piccoli impulsi elettrici, detti pacchetti. Ogni pacchetto contiene l'indirizzo del dispositivo che esegue la trasmissione (l'indirizzo di sorgente) e l'indirizzo del dispositivo che riceve i dati (l'indirizzo di destinazione). Queste informazioni vengono utilizzate dai PC e da altri dispositivi presenti nella rete per aiutare il pacchetto a raggiungere la propria destinazione. Le reti Ethernet e Fast Ethernet impiegano un protocollo chiamato CSMA/CD (Carrier-Sense Multiple Access with Collision Detection). In tal modo può comunicare solo un dispositivo per volta. Quando due dispositivi cercano di comunicare simultaneamente, tra i pacchetti trasmessi si verifica una collisione che viene rilevata dai dispositivi trasmittenti. I dispositivi cessano quindi di trasmettere e attendono prima di inviare nuovamente i loro pacchetti. Il meccanismo è paragonabile ad una conversazione tra un gruppo di persone; se due persone parlano contemporaneamente, si fermano entrambe e una di esse inizia a parlare nuovamente. Il Modello OSI E un modello sviluppato da una proposta del Internetional Standards Organization (ISO) come primo passo verso la standardizzazione internazionale dei protocolli impiegati nei diversi strati (vedremo dopo). Si chiama modello di riferimento ISO OSI (Open System Interconnection) perche riguarda la connessione di sistemi aperti, cioè di sistemi che sono “aperti” verso la comunicazione con altri; per brevità varrà chiamato semplicemente OSI
Figura 41 Livello 7 Applicazione (Network Processes to Application) Si interfaccia direttamente con i programmi applicativi (Application Program Interface). I campi applicativi più conosciuti sono, per esempio, la posta elettronica (software per la gestione della Email), il trasferimento dei flussi (software per ftp o http), le connessioni remote (software di accesso remoto) , emulazioni di terminali ecc.
Livello 6 Presentazione (Data Representation) Il livello 6 serve per la trasformazione/conversione del formato dei dati (cifratura e decifratura o codifica, es. ASCII o MPEG). In pratica assicura la "leggibilità e l'interpretazione" del dato da parte del sistema ricevente. Livello 5 Sessione (Interhost Communication) Si preoccupa di controllare il dialogo (sincronizzazione/mantenimento della comunicazione) fra due programmi applicativi. Livello 4 Trasporto (End-to-end connections) È il livello a cui è delegata la funzione di invio e ricezione dei dati. Fornisce trasferimento dati affidabile correggendo gli errori. Divide i messaggi i in pacchetti, ne controlla e preserva l'ordine con cui devono essere spediti, controlla la presenza di errori. E' il primo livello che lavora indipendentemente dalla topologia della rete in cui si trova. Non si occupa della qualità del servizio e della sua affidabilità. Livello 3 Network (Address and best path) Questo livello si occupa della gestione relativa all'instradamento dei pacchetti, controlla l'indirizzo di provenienza e di destinazione e gestisce le tabelle di instradamento (come le tabelle di routing) necessarie per far giungere a destinazione i pacchetti. E' questo il livello che sceglie gli instradamenti alternativi, sia in caso di guasti o di mutate condizioni di traffico, che in base alla scelta del minor costo. Livello 2 Data Link (Access to media) Gestisce i pacchetti (frame), spezzoni di messaggio di lunghezza fissa. Si occupa di tutti i meccanismi di individuazione e correzione degli errori avvenuti nel livello 1. A questo livello avviene l'indirizzamento fisico basato sull'indirizzo fisico degli host (MAC). Livello 1 Fisico (Binariy transmission) Si occupa della trasmissione dei dati sul mezzo fisico (media). Qui viene, di fatto, specificata la rappresentazione elettrica degli 0 ed 1 binari in modo tale che il sistema ricevente possa leggere correttamente il flusso di bit in arrivo. Tutti gli standard di voltaggio, distanze massime, connettori fisici ecc. sono qui attribuiti.
Il Modello TCP/IP Lasciamo da parte il modello di riferimento OSI per analizzare il modello di riferimento progenitore di tutte le reti di computer geografiche, ARPANET e il suo successore Internet. ARPANET connetteva centinaia di università e installazioni. Così come ISO/OSI anche il modello del TCP/IP è stato strutturato in livelli.
Figura 42
Come si può notare come il modello TCP/IP è più semplice del modello ISO/OSI ed è strutturato in soli quattro livelli. Il suo nome deriva dai due principali protocolli che lo compongono, il TCP (Trasmission Control Protocol) che copre il livello 3 e l'IP (Internet Protocol) che copre il livello 2. Le funzioni dei vari livelli sono le seguenti: Applicazione :É relativo ai programmi di interfaccia con la rete, in genere questi vengono realizzati secondo il modello client-server, realizzando una comunicazione secondo un protocollo che è specifico di ciascuna applicazione. Trasporto: Fornisce la comunicazione tra le due stazioni terminali su cui girano gli applicativi, regola il flusso delle informazioni, può fornire un trasporto affidabile, cioè con recupero degli errori o inaffidabile. I protocolli principali di questo livello sono il TCP e l'UDP. Internet: Si occupa dello smistamento dei singoli pacchetti su una rete complessa e interconnessa, a questo stesso livello operano i protocolli per il reperimento delle informazioni necessarie allo smistamento, per lo scambio di messaggi di controllo e per il monitoraggio della rete. Il protocollo su cui si basa questo livello è IP (sia nella attuale versione, IPv4, che nella nuova versione, IPv6). Host to Network: È responsabile per l'interfacciamento al dispositivo elettronico che effettua la comunicazione fisica, gestendo l'invio e la ricezione dei pacchetti da e verso l'hardware. La comunicazione fra due stazioni remote avviene secondo le modalità illustrate in figura, dove si è riportato il flusso dei dati reali e i protocolli usati per lo scambio di
informazione su ciascun livello. Si è genericamente indicato ethernet per il livello 1, anche se in realtà i protocolli di trasmissione usati possono essere molti altri.
Figura 43
Per chiarire meglio la struttura della comunicazione attraverso i vari protocolli mostrata in figura, conviene prendere in esame i singoli passaggi fatti per passare da un livello al sottostante, la procedura si può riassumere nei seguenti passi: • Le singole applicazioni comunicano scambiandosi i dati ciascuna secondo un suo specifico formato. Per applicazioni generiche, come la posta o le pagine web, viene di solito definito ed implementato quello che viene chiamato un protocollo di applicazione (esempi possono essere HTTP, POP, SMTP, ecc.), ciascuno dei quali è descritto in un opportuno standard (di solito attraverso un RFC4). • I dati delle applicazioni vengono inviati al livello di trasporto usando un'interfaccia opportuna (i socket). Qui verranno spezzati in pacchetti di dimensione opportuna e inseriti nel protocollo di trasporto, aggiungendo ad ogni pacchetto le informazioni necessarie per la sua gestione. Questo processo viene svolto direttamente nel kernel, ad esempio dallo stack TCP, nel caso il protocollo di trasporto usato sia questo. • Una volta composto il pacchetto nel formato adatto al protocollo di trasporto usato, questo sarà passato al successivo livello, quello di rete, che si occupa di inserire le opportune informazioni per poter effettuare l'instradamento nella rete ed il recapito alla destinazione finale. In genere questo è il livello di IP (Internet Protocol), a cui vengono inseriti i numeri IP che identificano i computer su internet. • L'ultimo passo è il trasferimento del pacchetto al driver della interfaccia di trasmissione, che si incarica di incapsularlo nel relativo protocollo di trasmissione. Questo
può avvenire sia in maniera diretta, come nel caso di ethernet, in cui i pacchetti vengono inviati sulla linea attraverso le schede di rete, che in maniera indiretta con protocolli come PPP o SLIP, che vengono usati come interfaccia per far passare i dati su altri dispositivi di comunicazione (come la seriale o la parallela). Criteri generali dell'architettura del TCP/IP La filosofia architetturale del TCP/IP è semplice: costruire una rete che possa sopportare il carico in transito, ma permettere ai singoli nodi di scartare pacchetti se il carico è temporaneamente eccessivo, o se risultano errati o non recapitabili. L'incarico di rendere il recapito pacchetti affidabile, non spetta al livello di collegamento, ma ai livelli superiori. Pertanto il protocollo IP è per sua natura inaffidabile, in quanto non è assicurata né una percentuale di successo né un limite sui tempi di consegna dei pacchetti. È il livello di trasporto che si deve occupare (qualora necessiti) del controllo del flusso dei dati e del recupero degli errori; questo è realizzato dal protocollo TCP. La sede principale di intelligenza della rete è pertanto al livello di trasporto. Le singole stazioni collegate alla rete non fungono soltanto da punti terminali di comunicazione, ma possono anche assumere il ruolo di router (instradatori), per l'interscambio di pacchetti da una rete ad un'altra. Questo rende possibile la flessibilità della rete che è in grado di adattarsi ai mutamenti delle interconnessioni. La caratteristica essenziale che rende tutto ciò possibile, è la strutturazione a livelli tramite l'incapsulamento. Ogni pacchetto di dati viene incapsulato nel formato del livello successivo, fino al livello del collegamento fisico. In questo modo il pacchetto ricevuto ad un livello n dalla stazione di destinazione è esattamente lo stesso spedito dal livello n dalla sorgente. Questo rende facile il progettare il software facendo riferimento unicamente a quanto necessario ad un singolo livello, con la confidenza che questo poi sarà trattato uniformemente da tutti i nodi della rete. Gli Apparati di Rete I principali apparati che compongono una LAN: • Schede di rete (NIC) una scheda di rete svolge compiti importanti quali: Logical link control, comunica con i livelli superiori Nome, fornisce un MAC univoco per la comunicazione tra host Framing, segmenta i pacchetti in frame e ricostruisce i pacchetti da frame MAC, permette l’accesso al mezzo fisico di connessione (ARP,RARP) Signaling, codifica i dati in stream di bit corrispondenti ad un segnale su un determinato mezzo
• HUB (concentratore) Tutti gli utenti collegati all'hub (o ad una serie di hub connessi in cascata) si trovano sullo stesso segmento di rete e condividono la stessa larghezza di banda. Trovandosi nello stesso dominio di collisione le trasmissioni contemporanee sono notevolmente rallentate.
Figura 44
• Switch (bridge multiporta) Lo switch permette di segmentare il traffico. In pratica, uno switch crea dei percorsi commutati collegando fisicamente un interfaccia ad un altra rendendo così disponibile tutta la larghezza di banda.
Figura 45
• Router (instradamento) Il router svolge 2 attività principali: determinazione del percorso ottimale dei pacchetti trasporto delle informazioni tra 2 reti diverse Il router è un apparato “intelligente” in grado di prendere decisioni sull’instradamento dei pacchetti in funzione delle tabelle di routing.
Tipologia Della Rete Le strutture fondamentali delle reti (si parla in questo caso di topologia di rete) sono di tre tipi: Stella : Si ha una rete a stella quando tutti i nodi periferici sono connessi a un nodo principale in modo indipendente dagli altri. In questo modo, tutte le comunicazioni passano per il nodo centrale e in pratica sono gestite completamente da quest'ultimo. Rientra in questa categoria il collegamento da punto a punto (point-to-point) in cui sono collegati solo due nodi.
Figura 46
Anello:Si ha una rete ad anello quando tutti i nodi sono connessi tra loro in sequenza, in modo da formare un anello ideale, e ognuno ha un contatto diretto solo con il precedente e il successivo. In questo modo, la comunicazione avviene (almeno in teoria) a senso unico, e ogni nodo ritrasmette al successivo i dati che non sono destinati allo stesso.
Figura 47
Bus.:Si ha una rete a bus quando la connessione dei nodi è condivisa da tutti, per cui i dati trasmessi da un nodo sono intercettabili da tutti gli altri. In questa situazione la trasmissione simultanea da parte di due nodi genera un collisione e la perdita del messaggio trasmesso.
Figura 48
Quali sono i vantaggi di avere una Rete? In una rete LAN (Local Area Network), le informazioni e le risorse possono essere condivise. Questa possibilità offre diversi vantaggi:
E' possibile condividere periferiche costose, come le stampanti. In una rete, tutti i computer possono accedere alla stessa stampante.
E' possibile inoltrare dati tra utenti senza l'uso di floppy disk. Trasferendo file attraverso la rete, non si perde tempo nel copiare i file su un dischetto o su un altro PC. Inoltre vi sono meno limitazioni sulle dimensioni del file che può essere trasferito attraverso una rete.
E' possibile centralizzare programmi informatici essenziali, come gli applicativi finanziari e contabili. Spesso gli utenti devono poter accedere allo stesso programma in modo che possano lavorarvi simultaneamente. Un esempio di ciò potrebbe essere un sistema di prenotazione di biglietti in cui è importante evitare di vendere due volte lo stesso biglietto.
E' possibile istituire sistemi di backup automatico dei file. E' possibile usare un programma informatico per fare il backup automatico di file essenziali, risparmiando tempo e proteggendo l'integrità del proprio lavoro.
In una rete WAN (Wide Area Network), le informazioni e le risorse sono condivise in un'area geografica più ampia. Questa possibilità offre diversi vantaggi:
E' possibile inviare e ricevere messaggi in tutto il mondo, comunicare messaggi e avviso a molte persone, in molti luoghi diversi, in modo più rapido ed economico.
E' possibile scambiare i file con i colleghi situati in altri luoghi o accedere da casa alla rete aziendale.
E' possibile accedere alla vaste risorse dell'Internet e di World Wide Web.
Grazie alla WAN, è possibile condividere le risorse e le informazioni all'interno di una vasta area geografica (ad es. consultare il web, trasferire file e messaggi mediante e-mail, ecc..). Per accedere ad una WAN, è necessario un modem o un router. Per accedere ad Internet, occorre avere inoltre un account con un provider di servizi Internet (ISP). Internet Internet non è una rete, ma una vasta raccolta di reti diverse che usano certi protocolli e offrono certi servizi comuni. È un sistema inconsueto che non ha un progettista e non è controllato da nessuno. Internet, tramite l’applicazione WWW(World Wide Web) ha portato sulla rete milioni di utenti. Questa invenzione ideata dal fisico del CERN Tim Bernes-Lee ha permesso la preparazione di pagine di informazione contenenti testo, immagini,suoni e video con collegamenti interni ad altre pagine. Facendo “click” su un collegamento, l’utente è immediatamente trasportato nella pagina a cui il collegamento si riferisce. La maggior parte di questa crescita è stata stimolata nel corso degli anni ’90 da aziende chiamate ISP (Internet Service Provider). Si tratta di società che danno agli utenti residenziali la possibilità di chiamare uno dei loro computer e collegarsi ad Internet per accedere al WWW, email e altri servizi.
CAPITOLO X Infrastutture di Rete. Internet. Protocolli di Comunicazione. Indirizzamento in rete. Servizi di Internet: posta elettronica, file transfer e data streaming Premessa Pacchetti di dati vengono trasmessi e ricevuti in base a delle regole definite da un protocollo di comunicazione. A qualunque livello della nostra esistenza è necessario un protocollo per comunicare: in un colloquio tra due persone, chi parla invia un messaggio all'altra che, per riceverlo, deve ascoltare. Volendo proseguire con questo esempio, si può anche considerare il problema dell'inizio e della conclusione della comunicazione: la persona con cui si vuole comunicare oralmente deve essere raggiunta e si deve ottenere la sua attenzione, per esempio con un saluto; alla fine della comunicazione occorre un modo per definire che il contatto è terminato, con una qualche forma di commiato. Quanto appena visto è solo una delle tante situazioni possibili. Si può immaginare cosa accada in una assemblea o in una classe durante una lezione. I Protocolli I dati viaggiano nella rete in forma di pacchetti. Il termine è appropriato perché si tratta di una sorta di confezionamento delle informazioni attraverso cui si definisce il mittente e il destinatario dei dati trasmessi. Il confezionamento e le dimensioni dei pacchetti dipendono dal tipo di rete fisica utilizzata. I dati sono un materiale duttile che può essere suddiviso e aggregato in vari modi. Ciò significa che, durante il loro tragitto, i dati possono essere scomposti e ricomposti più volte e in modi differenti. Per esempio, per attraversare un particolare segmento di una rete, potrebbe essere necessario suddividere dei pacchetti troppo grandi in pacchetti più piccoli, oppure potrebbe essere utile il contrario. In particolare, si parla di incapsulamento quando i pacchetti vengono inseriti all'interno di altri pacchetti. A questo punto, dovrebbe es-
sere evidente che il significato del termine pacchetto può avere valore solo in riferimento a un contesto preciso. Di seguito vengono elencati i protocolli: IPv4 Internet Protocol version 4. È quello che comunemente si chiama IP. Ha origine negli anni '80 e da allora è la base su cui è costruita internet. Usa indirizzi a 32 bit, e mantiene tutte le informazioni di instradamento e controllo per la trasmissione dei pacchetti sulla rete; tutti gli altri protocolli della suite (eccetto ARP e RARP, e quelli specifici di IPv6) vengono trasmessi attraverso di esso. IPv6 Internet Protocol version 6. È stato progettato a metà degli anni '90 per rimpiazzare IPv4. Ha uno spazio di indirizzi ampliato 128 bit che consente più gerarchie di indirizzi, l'autoconfigurazione, ed un nuovo tipo di indirizzi, gli anycast, che consentono di inviare un pacchetto ad una stazione su un certo gruppo. Effettua lo stesso servizio di trasmissione dei pacchetti di IPv4 di cui vuole essere un sostituto. TCP Trasmission Control Protocol. È un protocollo orientato alla connessione che provvede un trasporto affidabile per un flusso di dati bidirezionale fra due stazioni remote. Il protocollo ha cura di tutti gli aspetti del trasporto, come l'acknoweledgment, i timeout, la ri-trasmissione, etc. È usato dalla maggior parte delle applicazioni. UDP User Datagram Protocol. È un protocollo senza connessione, per l'invio di dati a pacchetti. Contrariamente al TCP il protocollo non è affidabile e non c'è garanzia che i pacchetti raggiungano la loro destinazione, si perdano, vengano duplicati, o abbiano un particolare ordine di arrivo. ICMP Internet Control Message Protocol. È il protocollo usato a livello 2 per gestire gli errori e trasportare le informazioni di controllo fra stazioni remote e instradatori (cioè fra host e router). I messaggi sono normalmente generati dal software del kernel che gestisce la comunicazione TCP/IP, anche se ICMP può venire usato direttamente da alcuni programmi come ping. A volte ci si riferisce ad esso come ICPMv4 per distinguerlo da ICMPv6. IGMP Internet Group Management Protocol. É un protocollo di livello 2 usato per il multicasting. Permette alle stazioni remote di notificare ai router che supportano questa comunicazione a quale gruppo esse appartengono. Come ICMP viene implementato direttamente sopra IP. ARP Address Resolution Protocol. È il protocollo che mappa un indirizzo IP in un indirizzo hardware sulla rete locale. È usato in reti di tipo broadcast come Ethernet,
Token Ring o FDDI che hanno associato un indirizzo fisico (il MAC address) alla interfaccia, ma non serve in connessioni punto-punto. RARP Reverse Address Resolution Protocol. È il protocollo che esegue l'operazione inversa rispetto ad ARP (da cui il nome) mappando un indirizzo hardware in un indirizzo IP. Viene usato a volte per durante l'avvio per assegnare un indirizzo IP ad una macchina. ICMPv6 Internet Control Message Protocol, version 6. Combina per IPv6 le funzionalità di ICMPv4, IGMP e ARP. EGP Exterior Gateway Protocol. È un protocollo di routing usato per comunicare lo stato fra gateway vicini a livello di sistemi autonomi, con meccanismi che permettono di identificare i vicini, controllarne la raggiungibilità e scambiare informazioni sullo stato della rete. Viene implementato direttamente sopra IP. OSPF Open Shortest Path First. È in protocollo di routing per router su reti interne, che permette a questi ultimi di scambiarsi informazioni sullo stato delle connessioni e dei legami che ciascuno ha con gli altri. Viene implementato direttamente sopra IP. GRE Generic Routing Encapsulation. È un protocollo generico di incapsulamento che permette di incapsulare un qualunque altro protocollo all'interno di IP. AH Authentication Header. Provvede l'autenticazione dell'integrità e dell'origine di un pacchetto. È una opzione nativa in IPv6 e viene implementato come protocollo a sé su IPv4. Fa parte della suite di IPSEC che provvede la trasmissione cifrata ed autenticata a livello IP. ESP Encapsulating Security Payload. Provvede la cifratura insieme all'autenticazione dell'integrità e dell'origine di un pacchetto. Come per AH è opzione nativa in IPv6 e viene implementato come protocollo a sé su IPv4. PPP Point-to-Point Protocol. È un protocollo a livello 1 progettato per lo scambio di pacchetti su connessioni punto-punto. Viene usato per configurare i collegamenti, definire i protocolli di rete usati ed incapsulare i pacchetti di dati. È un protocollo complesso con varie componenti. SLIP Serial Line over IP. È un protocollo di livello 1 che permette di trasmettere un pacchetto IP attraverso una linea seriale. Gran parte delle applicazioni comunicano usando TCP o UDP, solo alcune, e per scopi particolari si rifanno direttamente ad IP (ed i suoi correlati ICMP e IGMP); benché sia TCP che UDP siano basati su IP e sia possibile intervenire a questo livello
con i raw socket questa tecnica è molto meno diffusa e a parte applicazioni particolari si preferisce sempre usare i servizi messi a disposizione dai due protocolli precedenti. Internet Protocol (IP) Quando si parla di IP ci si riferisce in genere alla versione attualmente in uso che è la versione 4 (e viene pertanto chiamato IPv4). Questa versione venne standardizzata nel 1981 dall'RFC 719. Internet Protocol nasce per dividere le applicazioni della struttura hardware delle reti di trasmissione, e creare una interfaccia di trasmissione dei dati indipendente dal sottostante substrato di rete, che può essere realizzato con le tecnologie più disparate (Ethernet, Token Ring, FDDI, etc.). Il compito di IP è pertanto quello di trasmettere i pacchetti da un computer all'altro della rete; le caratteristiche essenziali con cui questo viene realizzato in IPv4 sono due: • Universal addressing la comunicazione avviene fra due stazioni remote identificate univocamente con un indirizzo a 32 bit che può appartenere ad una sola interfaccia di rete. • Best effort viene assicurato il massimo impegno nella trasmissione, ma non c'è nessuna garanzia per i livelli superiori né sulla percentuale di successo né sul tempo di consegna dei pacchetti di dati. Negli anni '90 la crescita vertiginosa del numero di macchine connesse a internet ha iniziato a far emergere i vari limiti di IPv4, per risolverne i problemi si è perciò definita una nuova versione del protocollo, che (saltando un numero) è diventata la versione 6. IPv6 nasce quindi come evoluzione di IPv4, mantendone inalterate le funzioni che si sono dimostrate valide, eliminando quelle inutili e aggiungendone poche altre per mantenere il protocollo il più snello e veloce possibile. I cambiamenti apportati sono comunque notevoli e si possono essere riassunti a grandi linee nei seguenti punti: • l'espansione delle capacità di indirizzamento e instradamento, per supportare una gerarchia con più livelli di indirizzamento, un numero di nodi indirizzabili molto maggiore e una autoconfigurazione degli indirizzi. • l'introduzione un nuovo tipo di indirizzamento, l'anycast che si aggiunge agli usuali unycast e multicast. • la semplificazione del formato dell'intestazione (header) dei pacchetti, eliminando o rendendo opzionali alcuni dei campi di IPv4, per eliminare la necessità di riprocessamento della stessa da parte dei router e contenere l'aumento di dimensione dovuto all'ampliamento degli indirizzi. • un supporto per le opzioni migliorato, per garantire una trasmissione più efficiente del traffico normale, limiti meno stringenti sulle dimensioni delle opzioni, e la flessibilità necessaria per introdurne di nuove in futuro.
• il supporto per delle capacità di qualità di servizio (QoS) che permettano di identificare gruppi di dati per i quali si può provvedere un trattamento speciale (in vista dell'uso di internet per applicazioni multimediali e/o “real-time”). User Datagram Protocol (UDP) UDP è un protocollo di trasporto molto semplice, la sua descrizione completa è contenuta dell'RFC 768, ma in sostanza esso è una semplice interfaccia a IP dal livello di trasporto. Quando un'applicazione usa UDP essa scrive un pacchetto di dati (il cosiddetto datagram che da il nome al protocollo) su un socket, al pacchetto viene aggiunto un header molto semplice, viene passato al livello superiore (IPv4 o IPv6 che sia) che lo spedisce verso la destinazione. Dato che né IPv4 né IPv6 garantiscono l'affidabilità niente assicura che il pacchetto arrivi a destinazione, né che più pacchetti arrivino nello stesso ordine in cui sono stati spediti. Pertanto il problema principale che si affronta quando si usa UDP è la mancanza di affidabilità, se si vuole essere sicuri che i pacchetti arrivino a destinazione occorrerà provvedere con l'applicazione, all'interno della quale si dovrà inserire tutto quanto necessario a gestire la notifica di ricevimento, la ritrasmissione, il timeout. Si tenga conto poi che in UDP niente garantisce che i pacchetti arrivino nello stesso ordine in cui sono stati trasmessi, e può anche accadere che i pacchetti vengano duplicati nella trasmissione, e non solo perduti. Di tutto questo di nuovo deve tenere conto l'applicazione. Un'altro aspetto di UDP è che se un pacchetto raggiunge correttamente la destinazione esso viene passato all'applicazione ricevente in tutta la sua lunghezza, la trasmissione avviene perciò per record la cui lunghezza viene anche essa trasmessa all'applicazione all'atto del ricevimento. Infine UDP è un protocollo che opera senza connessione (connectionless) in quanto non è necessario stabilire nessun tipo di relazione tra origine e destinazione dei pacchetti. Si hanno così situazioni in cui un client può scrivere su uno stesso socket pacchetti destinati a server diversi, o un server ricevere su un socket pacchetti provenienti da client diversi. Il modo più semplice di immaginarsi il funzionamento di UDP è quello della radio, in cui si può trasmettere e ricevere da più stazioni usando la stessa frequenza. Nonostante gli evidenti svantaggi comportati dall'inaffidabilità UDP ha il grande pregio della velocità, che in certi casi è essenziale; inoltre si presta bene per le applicazioni in cui la connessione non è necessaria, e costituirebbe solo un peso in termini di prestazioni, mentre una perdita di pacchetti può essere tollerata, ad esempio le applicazioni di streaming e quelle che usano il multicasting.
Transport Control Protocol (TCP) Il TCP è un protocollo molto complesso, definito nell'RFC 739 e completamente diverso da UDP; alla base della sua progettazione infatti non stanno semplicità e velocità, ma la ricerca della massima affidabilità possibile nella trasmissione dei dati. La prima differenza con UDP è che TCP provvede sempre una connessione diretta fra un client e un server, attraverso la quale essi possono comunicare; per questo il paragone più appropriato per questo protocollo è quello del collegamento telefonico, in quanto prima viene stabilita una connessione fra due i due capi della comunicazione su cui poi effettuare quest'ultima. Caratteristica fondamentale di TCP è l'affidabilità; quando i dati vengono inviati attraverso una connessione ne viene richiesto un “ricevuto” (il cosiddetto acknowlegment), se questo non arriva essi verranno ritrasmessi per un determinato numero di tentativi, intervallati da un periodo di tempo crescente, fino a che sarà considerata fallita o caduta la connessione (e sarà generato un errore di timeout); il periodo di tempo dipende dall'implementazione e può variare far i quattro e i dieci minuti. Inoltre, per tenere conto delle diverse condizioni in cui può trovarsi la linea di comunicazione, TCP comprende anche un algoritmo di calcolo dinamico del tempo di andata e ritorno dei pacchetti fra un client e un server (il cosiddetto RTT, round-trip time), che lo rende in grado di adattarsi alle condizioni della rete per non generare inutili ritrasmissioni o cadere facilmente in timeout. Inoltre TCP è in grado di preservare l'ordine dei dati assegnando un numero di sequenza ad ogni byte che trasmette. Ad esempio se un'applicazione scrive 3000 byte su un socket TCP, questi potranno essere spezzati dal protocollo in due segmenti (le unità di dati passate da TCP a IP vengono chiamate segment) di 1500 byte, di cui il primo conterrà il numero di sequenza 1 - 1500 e il secondo il numero 1501 - 3000. In questo modo anche se i segmenti arrivano a destinazione in un ordine diverso, o se alcuni arrivano più volte a causa di ritrasmissioni dovute alla perdita degli acknowlegment, all'arrivo sarà comunque possibile riordinare i dati e scartare i duplicati. Il protocollo provvede anche un controllo di flusso (flow control), cioè specifica sempre all'altro capo della trasmissione quanti dati può ricevere tramite una advertised window (letteralmente finestra annunciata), che indica lo spazio disponibile nel buffer di ricezione, cosicché nella trasmissione non vengano inviati più dati di quelli che possono essere ricevuti. Questa finestra cambia dinamicamente diminuendo con la ricezione dei dati dal socket ed aumentando con la lettura di quest'ultimo da parte dell'applicazione, se diventa nulla il buffer di ricezione è pieno e non verranno accettati altri dati. Si noti che UDP non provvede niente di tutto ciò per cui nulla impedisce che vengano trasmessi pacchetti ad un ritmo che il ricevente non può sostenere. Infine attraverso TCP la trasmissione è sempre bidirezionale (in inglese si dice che è full-duplex). È cioè possibile sia trasmettere che ricevere allo stesso tempo, il che comporta che quanto dicevamo a proposito del controllo di flusso e della gestione
della sequenzialità dei dati viene effettuato per entrambe le direzioni di comunicazione. Limiti e dimensioni riguardanti la trasmissione dei dati Un aspetto di cui bisogna tenere conto nella programmazione di rete, è che ci sono una serie di limiti a cui la trasmissione dei dati attraverso i vari livelli del protocollo deve sottostare, limiti che è opportuno tenere presente perché in certi casi si possono avere delle conseguenze sul comportamento delle applicazioni. Un elenco di questi limiti, insieme ad un breve accenno alle loro origini ed alle eventuali implicazioni che possono avere, è il seguente: • La dimensione massima di un pacchetto IP è di 65535 byte, compresa l'intestazione. Questo è dovuto al fatto che la dimensione è indicata da un campo apposito nell'header di IP che è lungo 16 bit. • La dimensione massima di un pacchetto normale di IPv6 è di 65575 byte, il campo apposito nell'header infatti è sempre a 16 bit, ma la dimensione dell'header è fissa e di 40 byte e non è compresa nel valore indicato dal suddetto campo. Inoltre IPv6 ha la possibilità di estendere la dimensione di un pacchetto usando la jumbo payload option. • Molte reti fisiche hanno un MTU (maximum transfer unit) che dipende dal protocollo specifico usato al livello di connessione fisica. Il più comune è quello di ethernet che è pari a 1500 byte. Quando un pacchetto IP viene inviato su una interfaccia di rete e le sue dimensioni eccedono la MTU viene eseguita la cosiddetta frammentazione, i pacchetti cioè vengono suddivisi6) in blocchi più piccoli che possono essere trasmessi attraverso l'interfaccia. Rete Hyperlink Token Ring IBM (16 Mbit/sec) Token Ring IEEE 802.5 (4 Mbit/sec) FDDI Ethernet X.25 Tabella 9
MTU 65535 17914 4464 4532 1500 576
La MTU più piccola fra due stazioni viene in genere chiamata path MTU, che dice qual'è la lunghezza massima oltre la quale un pacchetto inviato da una stazione ad un'altra verrebbe senz'altro frammentato. Si tenga conto che non è affatto detto che la path MTU sia la stessa in entrambe le direzioni, perché l'instradamento può essere diverso nei due sensi, con diverse tipologie di rete coinvolte. Una delle differenze fra IPv4 e IPv6 é che per IPv6 la frammentazione può essere eseguita solo alla sorgente, questo vuol dire che i router IPv6 non frammentano i pacchetti che ritrasmettono (anche se possono frammentare i pacchetti che generano loro stessi), mentre i router IPv4 si. In ogni caso una volta frammentati i pacchetti possono essere riassemblati solo alla destinazione. Nell'header di IPv4 è previsto il flag DF che specifica che il pacchetto non deve essere frammentato; un router che riceva un pacchetto le cui dimensioni eccedano quelle dell'MTU della rete di destinazione genererà un messaggio di errore ICMPv4 di tipo destination unreachable, fragmentation needed but DF bit set. Dato che i router IPv6 non possono effettuare la frammentazione la ricezione di un pacchetto di dimensione eccessiva per la ritrasmissione genererà sempre un messaggio di errore ICMPv6 di tipo packet too big. Dato che il meccanismo di frammentazione e riassemblaggio dei pacchetti comporta inefficienza, normalmente viene utilizzato un procedimento, detto path MTU discovery che permette di determinare il path MTU fra due stazioni; per la realizzazione del procedimento si usa il flag DF di IPv4 e il comportamento normale di IPv6 inviando delle opportune serie di pacchetti (per i dettagli vedere l'RFC 1191 per IPv4 e l'RFC 1981 per IPv6) fintanto che non si hanno più errori. Il TCP usa sempre questo meccanismo, che per le implementazioni di IPv4 è opzionale, mentre diventa obbligatorio per IPv6. Per IPv6 infatti, non potendo i router frammentare i pacchetti, è necessario, per poter comunicare, conoscere da subito il path MTU. Infine TCP definisce una MSS Maximum Segment Size che annuncia all'altro capo della connessione la dimensione massima dimensione del segmento di dati che può essere ricevuto, così da evitare la frammentazione. Di norma viene impostato alla dimensione della MTU dell'interfaccia meno la lunghezza delle intestazioni di IP e TCP, in Linux il default, mantenuto nella costante TCP_MSS è 512. Posta Elettronica (Simple Mail Transfer Protocol) Il metodo più veloce in assoluto che esista per comunicare a grande distanza è la posta elettronica (spesso abbreviata con E-mail o email). La posta elettronica è attualmente l'applicazione predominante su Internet. Essa consente agli utenti della Rete di inviare messaggi e di riceverli in modo comodo ed economico e senza occuparsi del modo in cui le informazioni viaggiano.
La posta elettronica si basa sul concetto di indirizzo. Un indirizzo email fornisce tutte le informazioni richieste per recapitare un messaggio fino al destinatario in qualunque parte del mondo esso si trovi. Gli indirizzi email sono strutturati nella forma: nome_utente@sito.dominio (ad esempio mrossi@uniroma2.it). Il simbolo @ sta per "at"e indica il fatto che l'utente con nome nome_utente è reperibile via email sul Server il cui indirizzo è sito.dominio. Nell'esempio riportato l'utente Mario Rossi (mrossi è il suo identificativo) possiede una casella di posta elettronica sulla macchina che nel dominio uniroma2.it è il Server email. Per inviare la posta si utilizza il protocollo SMTP (Simple Mail Transfer Protocol), mentre per ricevere i messaggi è possibile utilizzare POP3 (Post Office Protocol versione 3), oppure IMAP (Internet Message Access Protocol). FTP (File Transfer Protocol) FTP o Protocollo per il Trasferimento di File è il metodo principale attraverso cui è possibile trasferire file e documenti su Internet. Anch’esso si basa sull’interazione tra un client (FTP Client) e un server (FTP Server). Per poter prelevare un file tramite FTP di solito si ha bisogno un identificativo personale sul Server da cui si preleva il file. Tale identificativo viene concesso dall'amministratore del Server remoto e ciò comporta che soltanto un numero ristretto di persone possono accedere al sistema ed eseguire l'operazione di copia. Un modo semplice per aggirare questa limitazione è il servizio denominato FTP anonimo. Questo servizio in pratica consente a chiunque in tutto il mondo di avere accesso al FTP Server in modo controllato e di effettuare la copia dei file e dei documenti messi a disposizione. In questo modo molte organizzazioni possono rendere pubblici i loro archivi oppure mettere a disposizione di altri gruppi di persone programmi o dati, il tutto con uno sforzo minimo ed una ampia sicurezza. In realtà il protocollo FTP può essere usato sia per prelevare file da un Server, che per trasferire file da un Client ad un Server avremo quindi: • DOWNLOAD trasferimento Server - Client • UPLOAD trasferimento Client – Server HTTP (HyperText Transfer Protocol) http è di gran lunga il protocollo più utilizzato in internet, in quanto permette di
rendere visuale l’accesso alle informazioni e ai servizi offerti dalla Rete. http, permette la comunicazione tra un client (http Client o Web Browser) e un Server (http Server o Web Server) al fine di trasferirsi file che contengono degli ipertesti. È il protocollo su cui si basa il World Wide Web (WWW). Data Streaming Il data streaming funziona come se su Internet esistesse una specie di servizio di recapito di video cassette. Solo quando la cassetta arriva a casa, è possibile infilarla nel videoregistratore virtuale, e vederla. Ovviamente, addio al bello della diretta! Infatti le cassette digitali sono molto esose in fatto di spazio e spesso occorre aspettare molti decine di minuti per vedere la prima inquadratura. Per ovviare a questo grande limite, è stata sviluppata una tecnologia innovativa che si chiama data streaming, traducibile come invio di flussi di dati. Lo streaming è un sistema che permette di inviare attraverso la rete, video e suoni digitali sotto forma di un flusso continuo di bit, e non come un intero blocco di grandi dimensioni. Un apposito programma, che si integra con il normale browser di pagine Web, è in grado di ricevere questo flusso in tempo reale, man mano che arriva, e di trasformarlo in immagini che si muovono sul video del computer. Grazie al data streaming è possibile trasmettere immagini in tempo reale attraverso la rete. Insomma, è possibile realizzare una sorta di trasmissione televisiva via Internet. Per il momento la qualità di queste trasmissioni digitali non è eccellente, ma la Tv su Internet sta attirando l'interesse e gli investimenti delle grandi aziende informatiche, e nei prossimi anni vedremo certamente grandi progressi tecnologici in questo settore. Nel frattempo, la tecnologia dello streaming ha permesso la nascita di una serie stazioni radio, che trasmettono su Web musica e notiziari, con qualità stereo.
CAPITOLO XI Il World Wide Web. Introduzione ai formati dei dati multimediali. Introduzione all'uso dei motori di ricerca Premessa Il più recente ed ambizioso dei servizi di Internet è il World Wide Web (ragnatela mondiale, abbreviato WWW o anche semplicemente web). Il web, come si è visto precedentemente, è nato al CERN di Ginevra come progetto accademico tendente a semplificare l'accesso alle informazioni e ai documenti. Poiché il web è stato concepito quando Internet già esisteva, utilizza molto di ciò che è stato realizzato in informatica negli ultimi decenni, ma utilizza anche importanti nuove tecnologie, realizzate appositamente per il web: Il web funziona con il meccanismo client-server. La parte client del web è il browser, un programma che l’utente esegue sul proprio computer e mediante il quale richiede le informazioni desiderate ad un server web. Alla risposta del server, il browser visualizze le informazioni in pagine indipendenti. Le pagine web sono descritte mediante il linguaggio di formattazione HTML (Hyper Text Markup Language). HTML consente agli autori di pagine web di creare pagine ipertestuali che qualunque server web può distribuire e qualunque browser può visualizzare. I codici HTML sono detti tag e consentono di indicare la formattazione del testo (dimensione, stile, posizionamento, ecc.) e la posizione delle immagini, dei filmati, delle animazioni. Queste indicazioni sono poi interpretate dal browser per la visualizzazione. Una pagina web può contenere collegamenti (link) che puntano ad altre pagine web, anche su macchine diverse. I collegamenti possono essere incorporati nel testo o associati ad una immagine. È il concetto di ipertesto, un termine coniato da Ted Nelson negli anni 60. Un ipertesto è un testo che consente una lettura non lineare di un documento. Se in un testo che parla di vino c’è una informazione sugli alberi che producono il sughero, e a questa informazione è associato un link, basta fare clic sul link
per andare ad una nuova pagina che parla di tali alberi, interrompendo la lettura della parte dedicata al vino, alla quale si potrà tornare successivamente. Il sistema degli URL (Uniform Resource Locator) consente a quasi tutti i tipi di informazione di essere recuperati da quasi tutti i punti di Internet, ed è stato messo a punto appositamente per il web. Il protocollo HTTP (HyperText Transfer Protocol) è il protocollo di comunicazione tra browser (client web) e server web. Server e Client Web Per stabilire un canale di comunicazione tra client e server, servono due programmi che girano su macchine diverse (eccezionalmente sulla stessa macchina); uno deve iniziare la connessione e l’altro deve accettarla. Il server viene avviato per primo, avvisa il sistema operativo che desidera accettare connessioni di rete in ingresso e si mette in attesa. Quando un client su una macchina remota desidera spedire o prelevare informazioni dal server apre una connessione con il server, trasferisce le informazioni e chiude la connessione. Un client web, detto anche browser, è un programma in grado di interrogare un server web (mediante il protocollo HTTP) e di interpretare la risposta. Normalmente tale risposta è un file HTML da visualizzare. Il browser deve dunque avere anche le capacità di "rendere" il file HTML (composto di testo, immagini, filmati, animazione e altro) in una finestra del computer. Come vedremo, la visualizzazione del codice HTML può differire da browser a browser e da piattaforma a piattaforma: si tratta di uno dei principali problemi del web, quello degli standard. Oggi sono disponibili diversi browser per le diverse piattaforme. Tutti i browser moderni funzionano in modo grafico. Questa possibilità, collegata al fatto che i numerosi standard HTML che si sono rapidamente susseguiti specificano modi diversi per trattare testo e grafica, ha portato al risultato che oggi è quasi impossibile fare in modo che una pagina HTML sia visualizzata allo stesso modo con i vari browser e sulle diverse piattaforme. I browser più diffusi sono Netscape Navigator e Microsoft Internet Explorer. Considerando che le versioni ancora utilizzate sono tre (la versione 2, la 3 e la 4) e le piat taforme principali sono due (Windows e Macintosh) si vede come le possibili visualizzazioni di una pagina possono arrivare fino a dodici. Questo problema può essere risolto creando diverse varianti per ogni pagina, o creando pagine dinamiche, o infine cercando soluzioni di compromesso. Un server web è invece un programma molto più semplice di un browser: deve solo rispondere alle richieste dei browser web, in modo positivo o negativo, e fornire la risorse richiesta. La comunicazione tra browser e server avviene mediante il protocollo HTTP, che ambedue i programmi devono supportare. Il server può risiedere su qualunque macchina (Windows, Unix, Macintosh) ed è continuamente in funzione, in attesa che gli vengano fatte delle richieste da parte dei browser.
I motori di ricerca Tenendo conto che le pagine web (le singole "schermate" di Internet) sono centinaia di milioni e che sono in continuo aumento, è impossibile pensare di conoscere gli "indirizzi" di tutti i siti, né ritenere di essere in grado da soli di sapere dove è possibile rintracciare tutte le informazioni presenti in rete. Per cercare informazioni su Internet sono quindi indispensabili quelli che sono chiamati, a volte impropriamente, "motori di ricerca". Cos’è un motore di ricerca? È un sito all’interno del quale sono catalogate milioni di pagine Internet in tutte le lingue e di tutto il mondo; il motore può ricercare nomi, parole e frasi presenti nelle pagine catalogate. Ad esempio, se si indica (si "chiede") al motore di ricerca di cercare una certa parola, esso mostrerà un elenco di tutte le pagine Internet che "conosce", in altre parole che ha memorizzato nel suo enorme archivio elettronico, all’interno delle quali la parola è presente. Ecco un elenco di alcuni motori di ricerca:
Altavista (www.altavista.it/), Virgilio (www.virgilio.it/), Yahoo! (www.yahoo.it) Trovatore (www.trovatore.it/) Lycos (www.lycos.it/) Arianna (www.arianna.iol.it/) Google (www.google.it/)
Nella pagina principale di ognuno di questi c’è un riquadro nel quale scrivere la parola cercata, per poi "cliccare" sull’immagine di un tasto sulla quale, generalmente, è scritto cerca, trova o, in inglese, find o search. Un riquadro di ricerca collegato ai motori è oggi spesso presente anche in altri siti, come quelli dei fornitori del cosiddetto "abbonamento" ad Internet.Vediamo quali problemi si possono presentare nell’usare le possibilità offerte da siti come Altavista, Virgilio, Google o altri. Se, ad esempio, si vogliono cercare informazioni sul cantautore Vasco Rossi e si scrive nome e cognome nel riquadro di ricerca, si verificherà questa situazione: il motore segnalerà sì i siti che trattano del rocker italiano, ma anche le pagine nelle quali c’è la parola "Vasco" (ad esempio il sito Internet dell’idraulico Vasco Bianchi, una pagina in cui c’è scritto "il mio migliore amico si chiama Vasco"…), la parola Rossi (dr Mario Rossi, dermatologo; una pagina dove è presente una poesia con il verso "papaveri rossi" etc.); in Argentina, inoltre, potrebbe esistere un tale che si chiama Vasco Rossi e che nulla ha a che fare con il cantante… Considerando che il cognome Rossi è uno dei più diffusi in Italia, è probabile quindi che il motore mostrerà migliaia di pagine…Ma se non interessa nulla dell’idraulico Vasco Bianchi né del dermatologo
Mario Rossi e si cercano solo informazioni sul cantautore; come fare? È necessario usare alcuni semplici trucchi… Trucchi Premessa Schematica
ogni motore ha le sue "regole" di ricerca; quelle che seguono, in genere, sono valide per tutti o si differenziano di pochissimo da quelle che prescrive il motore; può essere utile decidere di imparare ad usare bene un unico motore, in modo da sfruttarne tutte le potenzialità; va ricordato però che quanti più motori si utilizzano tanti più risultati si hanno; ogni motore ha una pagina di help o di aiuto nella quale queste regole sono indicate; oltre a quelle che indichiamo esistono altre regole, molto efficaci, ma anche più complicate; i motori cercano solo all’interno del World Wide Web, cioè all’interno delle "pagine Internet": se da un sito è possibile scaricare, ad esempio, un testo ricco di informazioni scritto al computer, queste non sono analizzate dal motore; secondo recenti ricerche, sembra che i motori coprano al massimo un quarto delle pagine Internet esistenti.
Scelta Della Lingua
Innanzi tutto è importante tenere conto delle lingue; ovviamente, se, ad esempio, si cerca la parola sole, si deve considerare che in inglese può voler dire sogliola; se si cercano informazioni sulle automobili spider bisogna tenere presente che in inglese spider significa ragno… I motori possono fare ricerche su siti scritti in tutte le lingue, ma permettono anche di scegliere la lingua in cui sono scritte le pagine. Il Segno "+"
Un trucco utilissimo è usare il segno "+"; se si scrive nel riquadro di ricerca: Vasco+Rossi si indica che si cerchino solo le pagine nelle quali sono presenti entrambe le parole; il motore, dopo aver effettuato la ricerca, mostrerà solo l’elenco delle pagine che contengono sia Vasco sia Rossi, escludendo quindi, per restare nel nostro esempio, la pagina di Mario Rossi e dell’idraulico Vasco Bianchi (nella prima c’è solo Rossi, nella seconda solo Vasco); può comunque capitare che in una pagina ci sia scritto ad esempio "Mario Rossi ha un figlio che si chiama Vasco"; essendo presenti nella pagina entrambi i termini, il motore la inserirà nell’elenco. Il Segno "-"
Allo stesso modo si può adoperare il segno "–": se si vuole cercare la pagina di un amico che si chiama Vasco Rossi, ma non si vuole essere sommersi da siti relativi al musicista, si può provare a scrivere: Vasco+Rossi-cantante Maiuscole E Minuscole
Se una parola è scritta tutta in minuscolo (rossi), in genere i motori indicheranno le pagine che contengono sia la versione minuscola, sia quella maiuscola, sia quella che contiene entrambe le forme (rossi, Rossi, ROSSI); se uso le maiuscole, invece, il motore cercherà solo le parole scritte esattamente come sono state digitate; se si desidera trovare proprio "Rossi" bisogna quindi scriverlo con la lettera maiuscola. L’asterisco (Carattere Jolly)
L’asterisco “ * ” può essere utilizzato per sostituire delle lettere che non si ricordano o che non si sa con precisione come devono essere scritte. Ad esempio, si sa che un cantautore si chiama Vasco, ma non si ricorda se il cognome è Rossi o Rassi... se si prescrive al motore di effettuare questa ricerca: Vasco+R*ssi esso cercherà Vasco Rassi, Vasco Rissi… e, ovviamente, Vasco Rossi. Le Categorie
Molti siti che ospitano motori di ricerca hanno anche dei "cataloghi ragionati" di pagine web, divisi per categorie, all’interno delle quali trovano spazio solo i siti che le riguardano; questi cataloghi sono chiamati in vari modi: Altavista li chiama Web Directory, Virgilio li definisce Canali etc. Il concetto, comunque, non cambia. Ad esempio, ci può essere una categoria principale musica che contiene al suo interno sottocategorie come classica, rock, dance… Una sottocategoria come rock può essere a sua volta suddivisa in italiano e straniero. È chiaro che all’interno di musica/rock/italiano non troveremo siti che parlano… della "Ditta Vasco Rossi, falegnameria" o dell’idraulico Vasco Bianchi, ma solo pagine davvero relative al cantautore emiliano. La scelta delle pagine non è quindi fatta da un meccanismo elettronico che agisce automaticamente, ma da esseri umani che davvero conoscono quei siti. È da tenere presente che in questo caso, anche se più comoda, la scelta non è stata operata da noi, ma da altri. Quasi tutti i siti di ricerca offrono inoltre la possibilità di cercare anche solo immagini, musiche o video relativi alle parole indicate.
Sitografia www.windoweb.it www.storiadellinformatica.it www.prometheo.it/a_linguaggi_programmazione.htm www.dizionarioinformatico.com www.wikipedia.org
BIBLIOGRAFIA Algoritmi e strutture dati di Demetrescu, Finocchi e Italiano. Ed: McGraw-Hill Introduzione agli algoritmi di Cormen, Leiserson e Rivest. Ed: Jackson libri Manuale di informatica: coordinatori Giacomo Ciuffi e Vincenzo Falzone. Edizione Calderini. Nello specifico, è stato tratto un brano di Daniel Pierre Bovet.