Appunti del corso di Informatica Classe III A. Anno scolastico 2011–2012 Prof. Francesco Biccari [email protected] 20 aprile 2012 Indice 1 L’informatica 1.1 Dati e informazioni . . . . . . . . . . . . 1.2 Cos’è l’informatica? . . . . . . . . . . . 1.2.1 Gli algoritmi . . . . . . . . . . . 1.2.2 Il computer . . . . . . . . . . . . 1.2.3 La rappresentazione dei dati . . . 1.3 L’importanza dell’informatica e dell’ICT 1.4 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Il computer 2.1 Cos’è un computer? . . . . . . . . . . . . . . 2.2 I tipi di computer . . . . . . . . . . . . . . . 2.3 Un po’ di storia . . . . . . . . . . . . . . . . 2.4 I computer sanno lavorare solo con i numeri! 2.5 Un ripasso delle unità di misura . . . . . . . 2.5.1 I fenomeni periodici . . . . . . . . . 2.5.2 I prefissi . . . . . . . . . . . . . . . . 2.6 Architettura di Von Neumann . . . . . . . . . 2.7 La CPU . . . . . . . . . . . . . . . . . . . . 2.8 La memoria centrale . . . . . . . . . . . . . 2.8.1 La RAM . . . . . . . . . . . . . . . 2.9 La scheda madre e i BUS . . . . . . . . . . . 2.9.1 Il firmware, le ROM e il BIOS . . . . 2.10 Le periferiche di input/output . . . . . . . . . 2.10.1 L’hard disk (disco rigido) . . . . . . . 2.10.2 Le memorie flash . . . . . . . . . . . 2.10.3 I drive ottici e i dischi ottici . . . . . 2.10.4 La cache . . . . . . . . . . . . . . . 2.10.5 Tastiera, mouse, touchpad, … . . . . 2.10.6 Il monitor . . . . . . . . . . . . . . . 2.10.7 La stampante . . . . . . . . . . . . . 2.10.8 Lo scanner . . . . . . . . . . . . . . 2.11 L’involucro e l’alimentazione . . . . . . . . . 2.12 Esercizi . . . . . . . . . . . . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 5 6 7 8 9 10 . . . . . . . . . . . . . . . . . . . . . . . . 11 11 11 12 15 16 16 17 18 19 21 21 22 25 26 26 26 28 28 29 30 31 31 32 33 INDICE 2 3 La rappresentazione dei dati 3.1 Qual è il problema? . . . . . . . . . . . . . . . 3.2 Il sistema binario . . . . . . . . . . . . . . . . 3.2.1 Da binario a decimale . . . . . . . . . 3.2.2 Da decimale a binario . . . . . . . . . 3.2.3 Le operazioni elementari . . . . . . . . 3.2.4 I numeri negativi e i numeri frazionari . 3.3 Il sistema esadecimale . . . . . . . . . . . . . 3.3.1 Dal binario all’esadecimale e viceversa 3.4 I tipi di dato e le codifiche . . . . . . . . . . . 3.4.1 I numeri . . . . . . . . . . . . . . . . . 3.4.2 Le stringhe . . . . . . . . . . . . . . . 3.4.3 Le immagini . . . . . . . . . . . . . . 3.4.4 I suoni . . . . . . . . . . . . . . . . . . 3.5 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Algoritmi, strutture dati e programmi 4.1 Algoritmi e programmi . . . . . . . . . . . . . . . . . . . . 4.2 Tipi di dati e istruzioni . . . . . . . . . . . . . . . . . . . . 4.3 La rappresentazione di un algoritmo . . . . . . . . . . . . . 4.3.1 Il diagramma di flusso . . . . . . . . . . . . . . . . 4.3.2 Lo pseudocodice . . . . . . . . . . . . . . . . . . . 4.4 Qualche esempio semplice di algoritmo . . . . . . . . . . . 4.5 Condizioni, cicli e l’istruzione GOTO . . . . . . . . . . . . 4.6 La programmazione strutturata e procedurale . . . . . . . . 4.6.1 La struttura di sequenza . . . . . . . . . . . . . . . 4.6.2 La struttura di selezione . . . . . . . . . . . . . . . 4.6.3 La struttura iterativa . . . . . . . . . . . . . . . . . 4.6.4 Altre strutture derivate . . . . . . . . . . . . . . . . 4.7 Esempi semplici . . . . . . . . . . . . . . . . . . . . . . . . 4.7.1 Stampare la tabellina del 2 fino a un numero dato . . 4.8 La programmazione procedurale: sottoprogrammi e funzioni 4.9 Alcuni esempi di algoritmi “veri” . . . . . . . . . . . . . . 4.10 Strutture dati . . . . . . . . . . . . . . . . . . . . . . . . . 4.11 La creazione dei programmi . . . . . . . . . . . . . . . . . 4.12 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Sistemi operativi e programmi 5.1 Il diritto d’autore per il software 5.2 I sistemi operativi . . . . . . . . 5.2.1 Il filesystem . . . . . . . 5.3 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 34 34 35 35 35 36 36 36 36 37 37 38 38 40 . . . . . . . . . . . . . . . . . . . 42 42 44 45 45 47 47 49 50 51 51 51 53 53 53 54 54 54 54 57 . . . . 59 59 60 62 63 6 Microsoft Word 64 7 Microsoft Excel 65 INDICE 8 Le reti di computer 8.1 Le reti di computer . . . . . . . . . . . . . . . 8.1.1 Cos’è una rete di computer . . . . . . . 8.1.2 Internet . . . . . . . . . . . . . . . . . 8.1.3 Modem, router, switch e schede di rete . 9 I database 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 66 66 66 66 67 A Codifica ASCII 68 A.1 Caratteri non stampabili . . . . . . . . . . . . . . . . . . . . . . . . 69 A.2 Caratteri stampabili . . . . . . . . . . . . . . . . . . . . . . . . . . 70 B Curiosità 71 Capitolo 1 L’informatica L’informatica non riguarda i computer più di quanto l’astronomia riguardi i telescopi. Edsger Wybe Dijkstra 1.1 Dati e informazioni Prima di spiegare cos’è l’informatica, bisogna soffermarci a definire i termini dato e informazione che troppo spesso vengono usati come sinonimi. Un dato è a un livello più basso rispetto all’informazione. È un singolo elemento informativo che non permette di aumentare la nostra conoscenza: un nome, un numero, un’immagine. In sintesi potremmo definire un dato come un simbolo senza un significato. Facciamo un esempio. Potremmo avere una serie di dati: “32°C, 33°C, 32°C, 27°C, 24°C, 27°C, 33°C”. Come vedete, avere a disposizione questa serie di numeri non aumenta la nostra conoscenza. Un altro dato potrebbe essere “8 848 metri”. Anche in questo caso, questo numero non ci serve a nulla. L’informazione è invece a un livello di astrazione superiore rispetto ai dati. Essa consiste in un insieme di dati collocato in un contesto che ci permette di aumentare la nostra conoscenza, cioè che ci permette di superare un’incertezza, prendere una decisione, effettuare delle operazioni. Per fare degli esempi guardiamo ai dati precedenti e in particolare alla serie di temperature. Se sappiamo che quelle temperature sono relative alla città di Roma in un particolare periodo dell’anno a una particolare ora del giorno, questo fa di loro un’informazione. La nostra informazione può essere ulteriormente elaborata con altre informazioni per ottenerne di nuove. Per esempio nella serie di temperature si nota un abbassamento che potremmo associare a qualche giorno di brutto tempo. Questo potrebbe essere confermato da altre informazioni relative alle precipitazioni. Analogamente per quanto riguarda l’altro dato, gli “8 848 metri”, se so che questo numero è la misura dell’altezza del monte Everest, ora ho un’informazione. Informazione che, come al solito, può essere incrociata con altre per ottenere nuove informazioni. Se avessi le altezze di tutte le montagne del mondo, scoprirei che il monte Everest è il più alto di tutti. 4 CAPITOLO 1. L’INFORMATICA 5 Figura 1.1. Rappresentazione schematica del DNA. Il DNA è il contenitore delle informazioni genetiche necessarie alla sintesi di RNA e proteine, molecole indispensabili per lo sviluppo e il corretto funzionamento della maggior parte degli organismi viventi. Queste informazioni sono scritte tramite un alfabeto di 4 simboli, che nella realtà corrispondono a quattro diverse molecole, chiamate basi azotate, come mostrato in figura. L’informazione è anche un’istruzione per eseguire un certo compito. E questo non soltanto per gli uomini. Il DNA è uno splendido esempio di contenitore di informazioni. Contiene infatti le “istruzioni” per la sintesi delle proteine che regolano lo sviluppo e il funzionamento di quasi tutti gli esseri viventi. Queste informazioni sono “scritte” con una alfabeto di 4 lettere, che nella realtà corrispondono a 4 diverse basi azotate (vedi la Fig. 1.1). In generale un’informazione ha valore in quanto potenzialmente utile al fruitore per i suoi molteplici scopi. Fin dall’alba dell’umanità gli uomini hanno sentito il bisogno di trasmettere informazioni per migliorare la vita propria e dei propri figli e questo li ha resi la specie dominante di questo pianeta: dal linguaggio, alle pitture, fino alla scrittura. Grazie alla rivoluzione scientifica e alle nuove tecnologie lo scambio di informazioni ha raggiunto livelli così elevati che oggigiorno la nostra società viene definita come società dell’informazione. 1.2 Cos’è l’informatica? L’informatica è la scienza che studia la rappresentazione, l’elaborazione delle informazioni e le tecniche pratiche per realizzare queste elaborazioni in maniera automatica. Nei prossimi paragrafi approfondiremo ognuno di questi aspetti. L’etimologia italiana della parola informatica proviene dal francese: Philippe Dreyfus usò per primo il termine informatique nel 1962 come compressione di information electronique ou automatique. Da notare che in inglese la parola informatics è usata raramente e ha un significato più ampio rispetto al nostro. La giusta parola inglese per indicare l’informatica è computer science. CAPITOLO 1. L’INFORMATICA 6 La nascita dell’informatica non ha una data ben precisa. Se si guarda ai metodi per automatizzare la risoluzione dei problemi, possiamo trovare la sua origine nella matematica e nella tecnologia greco–ellenistica (algoritmo di Euclide, metodo di Archimede per la trisezione di un angolo, macchina di Anticitera). Se invece ci concentriamo solo sui macchinari che permettevano di fare calcoli allora possiamo addirittura risalire all’abaco, strumento inventato intorno al 2000 a.C. L’informatica così come la intendiamo oggi nasce intorno al 1930 grazie al lavoro di scienziati come Kurt Gödel, Alan Turing, Alonzo Church, John von Neumann, Claude Shannon e grazie alla nascita dei primissimi computer. I fondamenti teorici dell’informatica discendono direttamente dalla matematica. Programmi di videoscrittura, browser, videogiochi, ecc... sono semplici strumenti di lavoro o svago. Quello che interessa, nell’informatica pura, non è tanto saper usare i vari programmi, quanto piuttosto capirne la struttura ed eventualmente saperla migliorare con l’uso di procedimenti più efficienti. Per assurdo, un informatico puro potrebbe non saper accendere un computer! Vengono invece chiamati programmatori coloro che creano i programmi (spesso sono dei laureati in ingegneria informatica). Infine esistono gli utenti, cioè i semplici utilizzatori di programmi. Nei prossimi tre paragrafi parleremo dei tre aspetti fondamentali dell’informatica che verranno poi discussi più approfonditamente nei primi capitoli di queste dispense: gli algoritmi, il computer e la rappresentazione dei dati. 1.2.1 Gli algoritmi Per poter permettere a qualcuno, sia esso una macchina o una persona, di fare un lavoro “al posto nostro”, dobbiamo impartirgli delle istruzioni ben precise in modo che faccia esattamente ciò che vogliamo. Facciamo un primo esempio banale. Supponiamo di stare comodamente sdraiati sul divano e, siccome non ci va di alzarci, vogliamo che un’altra persona faccia partire un film in DVD al posto nostro. Se questa persona non sa usare il lettore DVD, dovremo dirgli di fare determinate azioni in maniera chiara e non ambigua: 1. Prendi il DVD del film “Ritorno al futuro”; 2. Accendi il lettore DVD spingendo il bottone in basso a sinistra; 3. Apri il cassettino del DVD spingendo il bottone in alto a destra; 4. Poggia il DVD nel cassettino con le scritte rivolte verso l’alto; 5. chiudi il cassettino premendo il tasto in alto a destra; 6. Avvia la riproduzione del DVD premendo il tasto Play che si trova in basso a destra. Questa sequenza di istruzioni è un semplicissimo esempio di algoritmo, che è definito come una sequenza finita di operazioni, chiaramente comprensibili all’esecutore, per risolvere un problema. Facciamo un altro esempio, stavolta di natura matematica. Ricordate la sequenza di temperature di cui avevamo parlato nel paragrafo 1.1? Supponiamo di voler calcolare la temperatura media. La “sequenza di istruzioni” è in questo caso molto semplice: 1. si prendono tutti i numeri; 2. si sommano; 3. si divide la somma per il numero degli elementi; 4. si riporta il risultato ottenuto. Spesso un algoritmo ha degli input (immissione in inglese) e degli output (emissione/in uscita in inglese). L’input è l’insieme degli elementi in ingresso, spesso dei CAPITOLO 1. L’INFORMATICA 7 Figura 1.2. Rappresentazione schematica di un generico sistema di elaborazione. Un sistema di elaborazione può essere pensato come una scatola che produce un output a partire dagli input. dati, mentre l’output è l’insieme degli elementi in uscita, spesso dei dati. Per esempio un input possono essere gli ingredienti di una ricetta, l’algoritmo è una ricetta ben scritta e l’output è il piatto pronto. L’insieme delle azioni che a partire dagli input generano l’output prende il nome di processo di elaborazione. Un qualsiasi oggetto, o insieme di più oggetti, che esegua un processo di elaborazione, cioè che generi un output a partire dagli input, viene chiamato sistema di elaborazione. Concettualmente un sistema di elaborazione può essere schematizzato come una scatola (black box) a cui si forniscono degli input e che restituisce degli output. Esempi di sistemi di elaborazione sono la lavatrice (panni sporchi in input, panni puliti in output), la radio (segnali radio in input, suono in output), ecc…. Il capitolo 4 sarà dedicato agli algoritmi, alla loro analisi e alla loro rappresentazione. 1.2.2 Il computer Un computer non è nient’altro che una macchina che può eseguire delle operazioni elementari sui dati in input, seguendo degli algoritmi impostati dall’esterno, e restituisce il risultato dell’elaborazione come dati in output. La peculiarità di un computer è quella di essere un sistema di elaborazione generico, cioè che può essere istruito per eseguire qualsiasi tipi di algoritmo sui dati. Usando opportune periferiche collegate al computer, si possono anche eseguire operazioni “pratiche”. La lavatrice, per esempio, è una specie di “computer”. All’interno vi è infatti un vero e proprio minicomputer che comanda le varie parti della lavatrice e che è programmato per eseguire un solo algoritmo preimpostato in fabbrica. A partire dagli input iniziali, cioè le scelte di lavaggio come temperatura, tipo di capi da lavare, ecc…, la lavatrice segue il suo algoritmo e alla fine restituisce come output i panni puliti. Ricordiamo che la differenza tra una lavatrice e un computer è che il computer può essere istruito affinché esegua un qualsiasi tipo di algoritmo mentre la lavatrice è pensata per eseguire sempre e solo un singolo algoritmo. Come si fa però a insegnare a un computer a eseguire certi algoritmi? Per farlo il computer deve essere “programmato”, cioè bisogna inserire nella sua memoria l’algoritmo desiderato secondo un linguaggio comprensibile al computer. L’insieme di queste istruzioni si chiama programma. Chiaramente un semplice utente del computer non è obbligato a scriversi da solo tutti i programmi! Anzi, tutti i programmi che userà saranno realizzati da altre persone (basti pensare a programmi come Microsoft Word e Microsoft Excel). CAPITOLO 1. L’INFORMATICA 8 Figura 1.3. Fotografia di un personal computer di tipo desktop. L’unità centrale è la parte principale e consiste di un involucro chiamato case all’interno del quale si trovano tutti i componenti principali del computer. Oltre all’unità centrale si vedono tre periferiche: il monitor, la tastiera e il mouse. Attualmente caricare ed eseguire un programma in un computer è un’operazione molto semplice. Infatti i computer sono equipaggiati con un programma speciale, chiamato sistema operativo, che viene eseguito poco dopo l’accensione del computer. Il sistema operativo “accoglie” l’utente in maniera amichevole permettendogli di fare tutta una serie di operazioni, tra cui eseguire un programma. Esempi di sistemi operativi sono Microsoft Windows 7, Mac OS X, Android, Ubuntu, ecc… L’insieme dei programmi e dei dati prende il nome di software. Questo termine è stato coniato per contrapposizione alla parola hardware che in inglese significa ferraglia. La parola hardware identifica infatti le parti fisiche del computer. Fu scelto questo nome perché i vecchi computer erano enormi e avevano schede elettroniche, valvole e tutta una serie di componenti ingombranti che sembravano veramente ferraglia! Nel capitolo 2 vedremo di quali parti si compone un computer e come funziona. 1.2.3 La rappresentazione dei dati Quando abbiamo accennato agli algoritmi, abbiamo detto che le operazioni di cui parlano devono essere comprensibili a chi deve eseguire l’algoritmo. Ovviamente lo stesso discorso vale per i dati. Siccome il nostro interesse principale è far eseguire degli algoritmi al computer, dobbiamo essere in grado di esprimere sia i dati che le operazioni degli algoritmi in un linguaggio comprensibile al computer. Un computer è in grado di eseguire solamente operazioni sui numeri. Copiare un numero, addizionare due numeri, confrontare due numeri, ecc…Siccome un com- CAPITOLO 1. L’INFORMATICA 9 puter ha bisogno di rappresentare i dati solamente con un insieme finito di numeri, si dice digitale. Ricordiamo, per chi non lo sapesse, la differenza tra analogico e digitale. Una grandezza fisica che viene rappresentata con continuità è detta analogica. Pensiamo per esempio al tempo, che viene rappresentato con l’angolo delle lancette dell’orologio. Oppure alla temperatura misurata da un termometro a mercurio. Sia l’angolo della lancetta sia l’altezza della colonnina di mercurio possono assumere qualsiasi valore compreso tra un minimo e un massimo. Si dice invece digitale una grandezza fisica che viene rappresentata usando un numero finito di valori numerici. Per esempio un orologio digitale non può mostrare con continuità tutti gli istanti di tempo possibili in una giornata, solitamente può al massimo arrivare a mostrare i secondi. Anche un termometro digitale non mostrerà con continuità i valori della temperatura, ma solamente dei valori distanziati, per esempio, di 0.1°C. Un altro esempio più sui generis è la quantificazione della conoscenza di un argomento tramite un voto. Solitamente questa conoscenza viene espressa con un numero intero compreso tra 0 e 10. È quindi un esempio di rappresentazione digitale. Rappresentare i dati, siano essi numeri, lettere, immagini, suoni, sotto forma di numeri è di fondamentale importanza affinché possano essere “usati” in un computer. Come fare per trasformare dei dati in numeri sarà l’argomento del capitolo 3. 1.3 L’importanza dell’informatica e dell’ICT Cerchiamo ora di comprendere l’importanza dell’informatica nel mondo odierno. Dalla fine della seconda guerra mondiale ai giorni nostri il nostro modo di vivere è cambiato radicalmente. Questi cambiamenti, tutt’ora in corso, prendono il nome di terza rivoluzione industriale. Tra i pilastri più importanti su cui si basa questa rivoluzione ci sono tre discipline scientifiche: l’informatica, l’elettronica e le telecomunicazioni. Le nuove capacità di immagazzinamento, elaborazione e comunicazione delle informazioni sono il cardine, nel bene e nel male, di questa rivoluzione. L’uso della tecnologia nella gestione e nel trattamento delle informazioni ha infatti assunto crescente importanza strategica per le aziende e per le nazioni (studio dei propri clienti, previsione di strategie di mercato, studio di una politica economica). In particolare non c’è stata solo una rivoluzione dei settori economici preesistenti alla luce delle nuove tecnologie. Soprattutto negli ultimi 20 anni è nato un vero e proprio nuovo settore dell’economia scaturito dall’unione di informatica, elettronica e telecomunicazioni, chiamato Tecnologia dell’Informazione e della Comunicazione (abbreviato in ICT, Information and Communication Technologies) e i cui frutti sono sotto gli occhi di tutti: interconnessione dei media1 (telefonia, televisione, radio, internet, ecc…); estrema facilità nell’immagazzinamento, scambio e reperibilità di informazioni. Oramai l’ICT è diventato un settore chiave dell’economia moderna, almeno pari a quello di settori più consolidati quali quello meccanico, chimico, far1 Si noti che la parola media va pronunciata così come è scritta perché è una parola latina. Non va pronunciata “midia”, come purtroppo spesso si sente. CAPITOLO 1. L’INFORMATICA 10 maceutico, tessile, manufatturiero e alimentare ma soprattutto è il vero traino della rivoluzione che stiamo vivendo. Questo corso non dovrebbe chiamarsi “Informatica” bensì “Tecnologie dell’informazione e della comunicazione”. L’informatica e le telecomunicazioni sono i fondamenti tecnico–scientifici di cui gli studenti devono solo conoscere i concetti fondamentali. Studenti orientati all’attività lavorativa in azienda, dovrebbero invece conoscere e sapersi districare tra le attuali tecnologie ICT usate in azienda, cioè dovrebbero essere educati alla corretta gestione, presentazione e interpretazione dei dati, alla loro comunicazione ai clienti e ad altre aziende, e infine all’uso delle tecnologie ICT nella gestione del lavoro. Nel capitolo 5 faremo una panoramica dei programmi più comuni, concentrandoci in particolare sui programmi per ufficio. In particolare nei capitoli 6 e 7 introdurremo all’uso del word processor Microsoft Word e del foglio di calcolo Microsoft Excel. Nel capitolo 8 parleremo delle reti di computer e infine nel capitolo 9 mostreremo i principi dell’immagazzinamento e recupero efficiente dei dati tramite i database e i software più famosi per gestirli. 1.4 Esercizi • Cos’è l’informatica? • I termini dato e informazione sono sinonimi? Perché? • Cos’è un algoritmo? • Cos’è un programma? • Un informatico è sempre anche un programmatore? • Cos’è l’hardware? • Cos’è il software? • Perché è così importante la rappresentazione dei dati? • Cos’è un algoritmo? • Cos’è un sistema di elaborazione? • Cos’è un computer? • Il computer è un sistema di elaborazione? Perché? • Cosa significa automatico? • Cosa significa digitale? • Cosa significa analogico? Capitolo 2 Il computer L’hardware è ciò che puoi prendere a calci quando qualcosa non funziona, il software invece è quello contro cui puoi solo imprecare. Anonimo 2.1 Cos’è un computer? Un computer è una macchina programmabile che può eseguire automaticamente sequenze di operazioni logico-aritmetiche sui dati in ingresso (input) e di restituire i risultati di tali operazioni in uscita (output). È pertanto un sistema di elaborazione di dati. La caratteristica principale che lo differenzia da altri sistemi di elaborazione è la programmabilità, cioè può essere istruito (programmato) per eseguire qualsiasi tipo di algoritmo. Il termine computer deriva dall’inglese e significa calcolatore. In inglese il termine indicava originariamente un essere umano incaricato di eseguire dei calcoli. Il primo utilizzo nel senso moderno del termine è attestato nel 1897 ma bisognerà attendere la metà degli anni ’50 perché questa accezione diventi di uso comune. Al giorno d’oggi, ci si riferisce comunemente al computer come a un dispositivo elettronico, digitale, programmabile e a scopo generico costruito secondo la cosiddetta architettura di von Neumann. Al pari della televisione, il computer rappresenta il mezzo tecnologico simbolo che più ha modificato le abitudini umane dal secondo dopoguerra a oggi: la sua invenzione ha contribuito alla nascita e allo sviluppo dell’informatica moderna, uno dei pilastri su cui si basa la cosiddetta terza rivoluzione industriale. 2.2 I tipi di computer Esistono molti termini nel mondo dell’informatica per indicare i vari tipi di computer. Una volta queste distinzioni erano basate sostanzialmente sulla potenza del 11 CAPITOLO 2. IL COMPUTER 12 Figura 2.1. Un moderno mainframe, un personal computer desktop e uno smartphone. computer. Attualmente invece, data la potenza dei computer odierni, si tende a catalogare i computer, non solo in base alla loro potenza, ma anche, e forse soprattutto, in base alla loro destinazione d’uso. I mainframe o sistemi centrali sono computer utilizzati per applicazioni critiche soprattutto da grandi aziende e istituzioni, tipicamente per elaborare con alte prestazioni e alta affidabilità grandi moli di dati: transazioni finanziarie, censimenti, statistiche di industrie e clienti, ecc. I personal computer sono dei computer pensati soprattutto per essere acquistati e usati da una singola persona. In questa categoria possiamo quindi far rientrare il classico computer da tavolo (desktop computer), i computer portatili (laptop computer), i tablet e anche gli smartphone. Ricordiamo anche i supercomputer, dei computer costruiti per avere la massima potenza di calcolo possibile. Sono pezzi unici e servono sostanzialmente per la ricerca scientifica. 2.3 Un po’ di storia Fin dall’antichità l’uomo cercò di costruire macchine in grado di fare dei calcoli: l’abaco, la macchina di Anticitera e gli astrolabi sono solo alcuni esempi. Le prime macchine calcolatrici compaiono nella seconda metà del 1600: la macchina calcolatrice di Wilhelm Schickard (1623, mai realizzata), la pascalina di Blaise Pascal (1645) e la macchina di Gottfried Leibniz (1672). Il passaggio da macchina calcolatrice a vero e proprio computer (nel senso di dispositivo programmabile) si deve a Charles Babbage. La sua macchina analitica, progettata nel 1833 ma mai realizzata, è il primo computer della storia. Si trattava di una colossale macchina a ingranaggi, alimentata a vapore e dotata di unità di calcolo decimale, unità di memoria e sistemi di input e di output. Contrariamente a quanto si potrebbe pensare, la macchina analitica era interamente digitale. Il primo computer funzionante è invece lo Z1 realizzato da Konrad Zuse nel 1938. (Vedi figura 2.2.) La nascente elettronica e la spinta delle ricerche per la seconda guerra mondiale fecero fare dei grandi passi in avanti nello sviluppo dei computer (ABC del 1939, Colossus del 1944, Harvard Mark I del 1944, Z4 del 1945, ENIAC del 1946). I computer necessitavano però di essere programmati manualmente spostando interruttori e spinotti! Solo con il computer EDVAC, progettato CAPITOLO 2. IL COMPUTER 13 Figura 2.2. A sinistra una rara fotografia dello Z1, costruito da Konrad Zuse nel 1938 nel soggiorno della casa dei suoi genitori. A destra una fotografia di Zuse negli anni ‘50. Figura 2.3. Una fotografia dell’ENIAC (a sinistra) e una fotografia dell’EDVAC (a destra) con degli scienziati al lavoro. Si notino le dimensioni di questi computer. nel 1945 sotto la supervisione di John Von Neumann e realizzato nel 1949, si ha finalmente un computer dove il programma da eseguire poteva essere inserito nella memoria così come si faceva con i dati. (Vedi figura 2.3.) Negli anni ’50 nacquero i primi computer commerciali, grandi come stanze e molto costosi, comprati dai grandi istituti di ricerca. Durante gli ultimi anni ‘50 e gli anni ’60, grazie all’invenzione del transistor e all’affermarsi dei primi linguaggi di programmazione di alto livello (FORTRAN, COBOL, BASIC, …), i computer divennero più piccoli (come armadi), relativamente facili da usare e si diffusero quindi in tutte le grandi aziende e le maggiori università. Il maggior produttore era l’IBM che nel tempo è rimasto uno dei maggiori innovatori e leader del mercato. Dalla fine degli anni ’60 e nella prima metà degli anni ’70 ci fu un grande salto tecnologico grazie all’invenzione dei circuiti integrati (detti microchip o semplicemente chip), che permisero di avere potenze di calcolo maggiori in un minor volume, e grazie alla comparsa del sistema operativo UNIX e del linguaggio C. (Vedi figu- CAPITOLO 2. IL COMPUTER 14 Figura 2.4. A sinistra uno dei più noti computer commerciali degli anni ’60 e ’70, l’IBM System/360 (modello 44). A destra un famosissimo computer commerciale degli anni ’80, il Digital VAX 11/780; quelle piccole macchine dotate di tastiera e monitor sono i terminali che venivano usati per accedere al computer vero e proprio. ra 2.4.) Una famoso produttore di computer che nasce in questi anni è la Digital. Fanno la loro comparsa anche i primi computer con dimensioni simili a quelle dei personal computer odierni, come l’italiano Olivetti Programma 101. Un’altra grande rivoluzione tecnologica ci fu nei primi anni ’70 quando i ricercatori dell’Intel inventarono la memoria RAM e i microprocessori. La strada per lo sviluppo dei personal computer era ormai spianata. Da ricordare lo Xerox Alto del 1972 che introdusse l’interfaccia grafica e la scheda di rete, l’Apple II del 1976 che fu il primo con monitor a colori, lo Xerox Star del 1981 che introdusse il mouse, l’hard disk di serie e un’interfaccia grafica basata sul concetto di desktop, come nei moderni sistemi operativi. (Vedi figura 2.5.) Negli anni ’80 ci fu la vera alfabetizzazione informatica. Nel 1981 nacque il primo Personal Computer (PC) IBM (vedi figura 2.5) da cui discendono la maggior parte dei computer desktop moderni. La realizzazione del sistema operativo di questi computer fu affidata alla Microsoft, che realizzò l’MS-DOS. In questi anni comparirono anche molti computer “giocattolo”, basti ricordare il Commodore 64. I computer erano oramai entrati nelle case di milioni di persone in tutto il mondo. Negli anni successivi fino ai giorni nostri, la tecnologia, sia hardware che software, ha fatto passi da gigante, soprattutto grazie alla spinta del mercato. In questo periodo ci sono principalmente tre fatti da ricordare: la nascita di Internet, la nascita del WEB e infine la nascita del software libero, in particolare dei sistemi operativi basati su Linux. Attualmente i computer e la loro possibilità di interconnessione e quindi scambio di informazioni hanno letteralmente “invaso” la nostra vita. Basti pensare che i moderni telefoni cellulari, detti smartphone, sono in realtà dei computer a tutti gli effetti. Qui si conclude il nostro breve excursus sulla storia del computer. Abbiamo visto che nel corso della storia l’implementazione fisica del computer è variata con il progredire della tecnologia dando luogo a computer profondamente diversi dal punto di vista del meccanismo di funzionamento (meccanici, elettromeccanici ed elettronici), della modalità di rappresentazione delle informazioni (analogica e digitale) e CAPITOLO 2. IL COMPUTER 15 Figura 2.5. A sinistra lo Xerox Alto (1972). In alto a destra lo Xerox Star (1981). In basso a destra l’IBM 5150 (1981), meglio noto come PC (Personal Computer). di altre loro caratteristiche (architettura interna, programmabilità, ecc.). Ricordiamo di nuovo che al giorno d’oggi, ci si riferisce comunemente al computer come a un dispositivo elettronico, digitale, programmabile e a scopo generico costruito secondo la cosiddetta architettura di von Neumann. 2.4 I computer sanno lavorare solo con i numeri! È importante dire fin da subito che i computer possono lavorare solo con dei numeri. Per esempio quando guardate un video con il vostro computer, ciò che accade è che delle lunghissime sequenze di numeri vengono elaborate e inviate alla scheda video la quale è in grado di trasformarli in segnali adatti per il vostro monitor. Alcuni di questi numeri sono le coordinate cartesiane dei punti dello schermo mentre altri numeri rappresentano il colore di questi punti. In particolare, per motivi costruttivi, è molto più facile creare dei computer che usano dei numeri in forma binaria. Infatti è molto più semplice realizzare dispositivi che abbiano solo due “simboli” anziché, per esempio, 10 simboli. Immaginate infatti di avere un circuito elettrico. Il passaggio di corrente indicherà un simbolo, il non passaggio di corrente indicherà un altro simbolo. Come vedete abbiamo due stati a disposizione che potremmo chiamare per comodità 1 e 0. Se avessimo voluto avere 10 simboli come nel sistema decimale (che poi avremmo chiamato 0, 1, 2, 3, 4, 5, 6, 7, 8, 9), saremmo stati in difficoltà perché avremmo dovuto avere 10 livelli di corrente diversi! Questo è in teoria possibile ma in pratica può generare molte difficoltà perché la presenza di disturbi potrebbe confondere uno stato con un altro! CAPITOLO 2. IL COMPUTER 16 Vedremo un po’ di matematica del sistema binario nel prossimo capitolo. Per ora basti sapere che ogni cifra in un sistema a due stati, viene chiamata bit, contrazione dall’inglese binary digit (cifra binaria). L’insieme di 8 cifre binarie, cioè 8 bit, prende il nome di byte. Il simbolo per indicare il bit è b mentre il simbolo per indicare il byte è B. 2.5 Un ripasso delle unità di misura Nello studio dell’informatica, così come di qualsiasi altra scienza, è fondamentale conoscere e saper gestire le varie unità di misura che si incontrano e i vari prefissi moltiplicativi. In questo semplice corso di informatica incontreremo solo due grandezze fisiche, il tempo e la frequenza. Quindi ci serviranno solo due unità di misura. 2.5.1 I fenomeni periodici Un fenomeno periodico è un fenomeno che si ripete uguale a sé stesso a intervalli uguali di tempo. L’intervallo di tempo che impiega il sistema a compiere un ciclo si chiama periodo. Facciamo un esempio: in un orologio analogico, la lancetta dei secondi compie un moto circolare periodico. Il tempo che impiega a ritornare nella posizione di partenza, cioè il tempo per fare un giro completo, è il periodo di rotazione ed è pari a 60 secondi (60 s in forma abbreviata). La frequenza indica invece quante volte un fenomeno si ripete in un certo intervallo di tempo. Facciamo degli esempi. Il battito cardiaco di una persona a riposo è di circa 1 battito al secondo. Invece di scrivere “al secondo” si usa il termine hertz, abbreviato Hz. Facciamo un altro esempio. L’albero motore di una autovettura accesa, senza spingere l’acceleratore, compie circa 1800 giri al minuto. Con un semplice calcolo (provateci da soli!) si ottiene che i giri al secondo sono 300. Pertanto possiamo affermare che la frequenza di rotazione dell’albero motore è di 300 Hz. Un ultimo esempio. La lancetta dei secondi, come avevamo visto, ha un periodo di 60 s. Quant’è la frequenza del suo moto? Cioè quanti giri fa in un secondo. In un secondo la lancetta fa solo 1/60 di giro! Quindi diremo che la frequenza è 1/60 Hz oppure, in forma decimale, 0.0166… Hz. Da questi esempi si intuisce che la frequenza è l’inverso del periodo, cioè, in forma di equazione: 1 (2.1) 𝑓= 𝑇 Vedremo in questo capitolo che la frequenza è una grandezza fisica importantissima per comprendere il funzionamento di un computer. Infatti tutte le operazioni di un computer sono temporizzate, cioè ogni parte del computer esegue un’operazione ogni volta che riceve un impulso elettrico particolare, chiamato clock. Questo segnale è periodico ed è composto di svariati milioni o miliardi di impulsi al secondo! CAPITOLO 2. IL COMPUTER 17 Tabella 2.1. Tabella con i prefissi che indicano i multipli e i sottomultipli delle unità di misura. prefisso simbolo valore tera giga mega kilo milli micro nano pico 1012 (1000 miliardi) 109 (1 miliardo) 106 (1 milione) 103 (mille) 10−3 (1 millesimo) 10−6 (1 milionesimo) 10−9 (1 miliardesimo) 10−12 (1 millesimo di miliardesimo) T G M k m μ n p 2.5.2 I prefissi In tutte le scienze e non solo, quando i numeri che esprimono una grandezza sono troppo grandi o troppo piccoli per essere usati in maniera comoda, si preferisce usare un prefisso che indichi i multipli e i sottomultipli dell’unità di misura, in modo da avere una parte numerica più comoda da scrivere. Facciamo un esempio. Tutti noi conosciamo i metri e i kilometri. Un kilometro corrisponde a 1000 metri. I kilometri vengo usati quando si parla di lunghe distanze: invece di dire che abbiamo percorso 230000 m è molto più semplice dire che si sono percorsi 230 km. I metri si indicano con m e i kilometri con km. La lettera k sta per kilo e significa mille volte più grande. Infatti come tutti sappiamo 1 km sono 1000 m. Oltre al kilo che abbiamo appena visto, esiste tutta una serie standard di prefissi per le unità di misura. Alcuni dei prefissi più importanti sono riportati in Tab. 2.1. Facciamo un piccolo esercizio dove compaiono i prefissi moltiplicativi. Supponiamo che la nostra linea ADSL abbia una velocità di 2 Mb/s: significa che possiamo scaricare (se non ci sono altri problemi) 2 milioni di bit al secondo. Considerando che una canzone presa da internet in formato mp3 può essere di circa 3 MB (3 megabyte), vogliamo sapere il tempo necessario a scaricare questa canzone. Prima di tutto trasformiamo la velocità della nostra ADSL da bit a byte. Basta dividere per 8, perché, ricordiamolo, un byte sono 8 bit. Pertanto la velocità della nostra ADSL sarà di 2 Mb/s = 0.25 MB/s 8 Ora, per conoscere il tempo necessario a scaricare la canzone dobbiamo dividere la dimensione del file della canzone per la velocità di trasferimento: 𝑡= dimensione file 3 MB = = 12 s velocità di scaricamento 0.25 MB/s Quindi per scaricare quella canzone da 3 MB avremo bisogno di almeno 12 s con la nostra linea ADSL. CAPITOLO 2. IL COMPUTER 18 Figura 2.6. Schema dell’architettura di von Neumann. I componenti fondamentali sono CPU e memoria centrale, quelli opzionali sono i sistemi di input e output. Questi componenti sono connessi tra loro tramite un sistema di comunicazione apposito chiamato BUS. 2.6 Architettura di Von Neumann Passiamo ora a spiegare come è fatto un computer e di quali parti si compone. Praticamente tutti i moderni computer di uso comune sono progettati secondo uno schema (architettura) detto architettura di Von Neumann inventata nel 1945 dal matematico John von Neumann e dal suo gruppo. Lo schema, mostrato in Fig 2.6, si basa su cinque componenti fondamentali: • La CPU, che si divide a sua volta in – Unità di controllo – Unità operativa, nella quale uno dei sottosistemi più rilevanti è l’ALU (Arithmetic Logic Unit) – Registri della CPU • La memoria centrale, intesa come memoria di lavoro o memoria principale contenente sia i dati che i programmi attualmente in uso • Unità di input, tramite la quale i dati e/o i programmi vengono inseriti nel calcolatore per essere elaborati • Unità di output, necessaria affinché i dati elaborati possano essere restituiti all’operatore • Bus, uno o più canali di comunicazione che collegano i componenti fra loro È importante sottolineare che tale architettura, a differenza di altre, si distingue per la caratteristica di immagazzinare all’interno dell’unità di memoria, sia i dati che i programmi in esecuzione. In poche parole si dice che le istruzioni dei programmi sono a loro volta dei dati. Un’ultima nota: quando si parla di memoria centrale si usa l’aggettivo centrale per distinguere questa memoria (che di solito è una RAM) da altri tipi di memoria, come per esempio gli hard disk che invece sono dei componenti opzionali e pertanto rientrano nella categoria dei dispositivi di I/O. CAPITOLO 2. IL COMPUTER 19 Figura 2.7. Le tre immagini rappresentano tutte il microprocessore Intel Core i5. La prima mostra la parte superiore, la seconda mostra le componenti interne al microprocessore che si trovano sotto il coperchio di protezione e l’ultima foto mostra il retro, dove si notano principalmente tutti i contatti del microprocessore. 2.7 La CPU La CPU (dall’inglese Central Processing Unit, Unità centrale di elaborazione) è uno dei componenti fondamentali di un computer. Viene spesso chiamata anche processore o microprocessore. È il componente che esegue le istruzioni del programma. Possiamo immaginarlo come il “cervello” del computer. È composta di varie parti al suo interno. C’è l’unità di controllo, che legge e scrive i dati dalla memoria (dove con dati si intende anche il programma da eseguire), interpreta le istruzioni da eseguire e le esegue, facendosi “aiutare” da un altro componente della CPU, l’ALU (in inglese Arithmetic Logic Unit) che si occupa di eseguire tutte le operazioni logiche e matematiche. Infine ci sono i registri che non sono nient’altro che una minuscola memoria per immagazzinare i dati temporanei o gli indirizzi di memoria su cui si dovrà operare. Ogni operazione eseguita dalla CPU si divide in un certo numero di passi elementari. Viene fatto un passo ogni volta che la CPU riceve un “impulso dall’esterno”. Questo “impulso dall’esterno” è chiamato segnale di clock o semplicemente CAPITOLO 2. IL COMPUTER 20 clock e arriva a intervalli di tempo regolari. Pertanto più alta sarà la frequenza del segnale di clock, cioè più alto sarà il numero di impulsi di clock che arrivano alla CPU, più veloce sarà l’esecuzione di un programma. Oggigiorno le migliori CPU possono funzionare a frequenze di clock di circa 3 GHz, cioè 3 miliardi di impulsi al secondo! Il segnale di clock viene generato da un componente apposito che si trova sulla scheda madre. ————————————————— Facciamo un piccolo esempio di operazione elementare della CPU. L’unità di controllo della CPU legge in uno dei registri l’indirizzo dell’istruzione da eseguire e la memorizza in un altro registro. Supponiamo che tale istruzione sia (scritta in forma più chiara e non in binario!) ADD 7A3, 8A7, B92 L’unità di controllo della CPU capisce che deve fare una somma tra due numeri che sono memorizzati negli indirizzi 7A3 e 8A7 della RAM. L’ultimo indirizzo, B92, sarà invece l’indirizzo della RAM dove bisogna mettere il risultato. L’unità di controllo prende allora i due numeri contenuti nelle celle di memoria RAM 7A3 e 8A7 e li memorizza in due registri liberi della CPU, facciamo finta siano il registro 3 e 4. Poi ordina alla ALU della CPU di eseguire la somma dei due numeri contenuti nei registri 3 e 4, e che il risultato sia memorizzato in un registro libero, per esempio il 5. Appena l’ALU avrà finito di fare ciò che gli è stato chiesto, l’unità dei controllo della CPU terminerà il suo lavoro copiando il contenuto del registro 5, quello contenente il risultato della somma, nell’indirizzo di memoria RAM B92. Fatto questo, l’istruzione è stata completata e si potrà passare all’istruzione successiva. ————————————————— La maniera in cui viene effettivamente costruita la CPU affinché possa eseguire le varie istruzioni viene detta microarchitettura. Una certa microarchitettura è caratterizzata da un determinato insieme di istruzioni (instruction set) che la CPU può eseguire. Tra le caratteristiche di una microarchitettura c’è anche la dimensione naturale di dati che viene normalmente usata per varie attività. Questa dimensione si chiama word (parola) e nelle CPU attuali è solitamente di 32 bit o 64 bit. Facciamo degli esempi per capire l’importanza della word. Ogni istruzione che riceve la CPU è composta da una o più word. La quantità di dati contenuta nei registri corrisponde a una word. La quantità di dati trasferiti dalla memoria centrale alla CPU è di una word per ogni trasferimento. Il numero di bit usati per rappresentare i numeri, interi o con la virgola, è di una word o di un multiplo di essa. Ma la cosa più importante è dire che gli indirizzi della memoria centrale sono numerati con un numero di bit pari a una word. Se la word è quindi di 32 bit, al massimo la CPU potrà “vedere” 232 caselle di memoria (ricordate che una casella di memoria corrisponde a un byte). Pertanto un sistema a 32 bit potrà montare al massimo 232 byte di memoria, CAPITOLO 2. IL COMPUTER 21 Figura 2.8. Sulla sinistra banco di memoria RAM (con e senza dissipatore per il calore). Sulla destra banchi di RAM montati sulla scheda madre. cioè circa 4 GB. Questo è uno dei principali motivi per cui negli ultimi anni si sta passando a CPU a 64 bit. Una CPU a 64 bit può infatti indirizzare fino a 264 caselle di memoria, quindi per un massimo di ben 16 miliardi di GB!!! 2.8 La memoria centrale La memoria centrale è un altro componente fondamentale del computer. Secondo l’architettura di Von Neumann, la memoria centrale gioca un doppio ruolo. Contiene sia i dati che servono alla CPU, sia il programma che si sta eseguendo. In altri tipi di architetture particolari esiste invece una memoria per contenere il programma e una memoria per contenere i dati. In generale le memorie sono composte da tante minuscole cellette, ognuna delle quali può trovarsi in due stati, carico e scarico. Avete già capito che questi due stati verranno usati per rappresentare le cifre 0 e 1. Attualmente la memoria centrale di ogni computer è una memoria di tipo RAM. 2.8.1 La RAM La tipica memoria centrale usata nei computer è una RAM (dall’inglese Random Access Memory, memoria ad accesso casuale). Il termine random (casuale) è dovuto al fatto che accedere a un’area o a un’altra di questa memoria non comporta differenze di velocità. La RAM può essere sia letta che scritta. Quando si spegne il computer o in generale si stacca la corrente, tutto il contenuto della RAM viene perso. Una memoria che si comporta in questo modo viene detta volatile. Le RAM si dividono a sua volta in statiche e dinamiche. Praticamente tutte le RAM usate nei computer comuni sono dinamiche. Questo tipo di RAM è meno costoso delle RAM statiche ma le cellette di cui è composta la RAM dinamica tendono a scaricarsi con il tempo. Pertanto, per evitare che il computer perda le informazioni durante il suo funzionamento e quindi si blocchi, la memoria RAM dinamica deve CAPITOLO 2. IL COMPUTER 22 essere “rinfrescata” a intervalli di tempo regolari (circa ogni 64 ms, cioè con una frequenza di 15 Hz). Per accedere ai dati contenuti nella RAM, la CPU assegna a ogni celletta un indirizzo, proprio come i numeri civici delle strade che vengono usati per identificare le varie case. In realtà le cellette non sono numerate una per una ma sono numerate a gruppi di 8: un indirizzo ogni 8 cellette, cioè ogni 8 bit (1 byte). La quantità di dati che può contenere la RAM si misura in byte e nei computer moderni questa quantità varia solitamente da 1 GB fino a 8 GB. 2.9 La scheda madre e i BUS La CPU, la memoria e tutte le periferiche di input/output sono connesse tra loro attraverso la scheda madre. Le connessioni fisica tra la scheda madre e gli altri componenti avviene in vari modi: tramite degli zoccoli, detti socket (CPU), tramite delle apposite fessure, dette slot, (memoria, schede varie), tramite dei cavi (hard disk, drive ottico, ecc.) o tramite delle porte esterne (tastiera, mouse, chiavette USB, ecc.) (Vedi figura 2.9.) La scheda madre contiene i BUS, cioè i canali di comunicazione tra le varie parti del computer e ne regola le comunicazioni. Ricordiamo che i BUS sono uno degli elementi fondamentali dell’architettura di von Neumann. La scheda madre contiene anche uno o più generatori di clock, la ROM contenente il BIOS e un orologio sempre in funzione, alimentato da una batteria interna. Figura 2.9. Fotografia di una scheda madre senza alcun componente attaccato. Si notino le varie slot presenti. CAPITOLO 2. IL COMPUTER 23 Figura 2.10. Organizzazione di un computer tipica degli anni ’70 e ’80. Veniva usato un singolo sistema di comunicazione (diviso in tre BUS, uno per i dati, uno per gli indirizzi e uno per il controllo) e tutti i componenti funzionavano alla stessa frequenza di clock. Fino alla fine degli anni ’80 il BUS del computer era solamente uno e tutti i componenti funzionavano alla stessa frequenza di clock (Vedi figura 2.10). Con il tempo le CPU e le memorie diventavano sempre più veloci, cioè potevano funzionare a frequenze di clock sempre maggiori, al contrario degli altri componenti del computer. Per questo motivo si cominciò a suddividere il computer in diverse “zone”, che funzionavano a frequenze di clock diverse. In figura 2.11 è rappresentato uno schema a blocchi di un computer attuale. Si notano tre zone: la zona della memoria e della scheda video che hanno delle velocità di trasferimento di dati molto elevate e funzionano con una frequenza di clock simile a quella del generatore del clock; la zona della CPU e dei suoi componenti interni che funzionano a velocità molto più elevate e con una frequenza di clock aumentata di circa 10 volte; infine la zona che gestisce l’input/output che funziona più lentamente delle altre due. Il colore grigio rappresenta i vari BUS, il colore verde la CPU e la memoria e il colore blu le periferiche di input e di output. Si può vedere che nei computer odierni si usano molti BUS diversi. Il passaggio di dati nella scheda madre da un componente all’altro è comandato dalla CPU ma è messo in pratica da un particolare circuito integrato, chiamato chipset, che possiamo immaginare come un ufficio postale velocissimo. Come si vede dalla figura è solitamente diviso in due zone, MCH e ICH. Quando, per esempio, la CPU vuole mandare dei dati alla RAM, li invia prima al chipset che poi li gira alla RAM facendoli passare per il BUS giusto. Il parametro fondamentale che distingue un BUS da un altro è la velocità di trasferimento dati. Più è alta meglio è. Questa grandezza si misura in byte al secondo, abbreviato B/s. Le velocità in gioco possono essere molto diverse a seconda del BUS. Nella tabella 2.2 una semplice lista dei BUS più usati. Una importante caratteristica di un BUS è l’essere o meno Plug&Play. Il Plug&Play (dall’inglese collega e usa) è un termine usato per descrivere la capacità di un BUS di facilitare il riconoscimento e il corretto indirizzamento di una periferica, senza dover CAPITOLO 2. IL COMPUTER 24 Figura 2.11. Organizzazione tipica di un computer moderno. Il colore grigio rappresenta i vari BUS, il colore verde la CPU e la memoria e il colore blu le periferiche di input e di output. Si può vedere che nei computer odierni si usano molti BUS diversi. La CPU lavora a una frequenza di clock, la memoria e le schede PCI-express a una frequenza minore, infine tutti gli altri componenti a una frequenza ancora più bassa. Tabella 2.2. Elenco dei bus più usati Tipo di BUS BUS Generico Front Side Bus, Back Side Bus, PCI, PCIe, Intel QPI, HyperTransport Immagazzinamento dati DMA, PATA, USB MSC, FireWire, SATA, eSATA, SCSI Periferiche RS-232, USB, FireWire, External PCIe CAPITOLO 2. IL COMPUTER 25 agire manualmente. In pratica significa che basta collegare la periferica al computer e questa sarà configurata automaticamente e pronta all’uso senza l’intervento dell’utente. PCI Express, PCI, USB sono tutti BUS Plug&Play. Tra le porte esterne del computer ricordiamo la porta USB usata per connettere una moltitudine di periferiche e l’uscita video (VGA o DVI) che serve a collegare il monitor. Esistono molte altre porte, alcune quasi non più usate come la porta seriale o altre meno usate come la porta firewire o e-sata. Tra gli slot interni avremo sicuramente il socket per alloggiare la CPU, varie slot per alloggiare la RAM, vari connettori per collegare i cavi dei dati degli harddisk e dei drive ottici e poi una serie di slot PCIe per connettere schede adibite a compiti specifici. Tra queste schede figura la scheda video e la scheda audio ma esistono migliaia di tipi di schede diverse. Basti pensare alle schede che servono al computer per poter controllare dei macchinari esterni. Per esempio una scheda che controlli il macchinario che fa le radiografie in un ospedale, la scheda che controlla il macchinario per il test delle centraline delle autovetture di un meccanico, la scheda che controlla un qualsiasi macchinario industriale e così via. Per completezza va detto che le schede di espansione di un computer, come per esempio la scheda audio e la scheda video, sono degli adattatori (adapter). La loro funzione è quella di tradurre i dati da una forma a un’altra. Per esempio un “adattore grafico” non è nient’altro che un modo per passare dai dati che rappresentano delle immagini ai segnali elettrici necessari a un monitor per rappresentare quelle immagini. In realtà le schede video, audio e anche altre non sono solo dei traduttori di segnali da una forma a un’altra. Molti di queste schede sono dotate di un co-processore che viene sfruttato dalla CPU per demandare dei calcoli specifici. Per esempio tutti sanno che le schede grafiche sono dotate di una o più GPU (Graphic Processing Unit), cioè dei processori studiati appositamente per fare calcoli di grafica. 2.9.1 Il firmware, le ROM e il BIOS Con il termine firmware si indica un programma che inizializza e prepara un certo dispositivo elettronico per le condizioni di normale funzionamento e lo gestisce secondo gli input esterni. Questo programma fa parte del componente elettronico stesso. Oggigiorno praticamente tutti i dispositivi elettronici sono dotati di un firmware. La lavatrice, la TV, un lettore MP3, una radiosveglia, sono tutti esempi di apparecchi dotati di firmware. I firmware sono contenuti all’interno di memorie non-volatili, cioè che mantengono i dati memorizzati anche in assenza di alimentazione, e solitamente sono avviati non appena il dispositivo in cui si trovano viene alimentato. Le memorie che contengono il firmware sono chiamate ROM, cioè memorie di sola lettura (dall’inglese Read Only Memory). Oggigiorno però, sebbene si continui a usare il termine ROM, le memorie usate per contenere il firmware di un dispositivo possono essere riscritte (per esempio per aggiornare il firmware!). Queste ROM riscrivibili sono delle EEPROM o delle memorie FLASH. Le memorie FLASH sono usate anche in molti altri ambiti e infatti ne riparleremo in seguito. CAPITOLO 2. IL COMPUTER 26 Anche i computer hanno bisogno di un firmware. Il firmware dei computer domestici è chiamato BIOS, è contenuto in una ROM sulla scheda madre e viene avviato all’accensione. Si occupa di eseguire tutta una serie di test per verificare il corretto funzionamento dell’hardware, esegue i firmware di tutti i componenti del computer che ne sono provvisti (schede video, ecc...), mostra sullo schermo le informazioni sulla quantità di memoria centrale e su altre caratteristiche del computer, esegue varie configurazioni sulla gestione dell’hardware (che possono essere cambiate anche dall’utente) e infine avvia, se disponibile, il programma che si trova nella prima sezione di un’unità esterna, solitamente l’hard-disk. Questo piccolissimo programma che si trova nella parte iniziale del disco si chiama bootloader ed è colui che si occuperà di avviare il sistema operativo. 2.10 Le periferiche di input/output 2.10.1 L’hard disk (disco rigido) L’hard disk è una periferica di input/output del computer. E può contenere enormi quantità di dati, da qui il nome di memoria di massa. Il nome deriva dal fatto che all’interno ci sono uno o più dischi (di vetro o alluminio) ricoperti di materiale ferromagnetico in rapidissima rotazione. La superficie di questo disco è idealmente divisa in tante piccole cellette e delle testine estremamente piccole, possono magnetizzare queste cellette in due modi diversi, a cui si assegna, come avrete immaginato, i valori convenzionali di 0 e 1 del sistema binario. La capacità di memorizzare dati in un hard disk si misura in byte e gli hard disk tipici montati attualmente nei computer vanno da diverse centinaia di GB a qualche TB. La velocità di un hard dipende da quanto velocemente ruotano i dischi e da quanto velocemente si possono spostare le testine. In confronto alla memoria RAM, l’hard disk è molto lento. 2.10.2 Le memorie flash Le memorie flash sono delle periferiche di input/output. Una memoria flash è un particolare tipo di memoria non-volatile composta da tanti piccoli transistor che necessitano di semplici segnali elettrici sia per essere letti che scritti. Le chiavette (o pennette) USB sono memorie flash, così come alcune ROM usate per i firmware, e così anche le schede SD, microSD, ecc…usate in telefoni cellulari o macchine fotografiche digitali. Le dimensioni tipiche massime delle memorie flash sono di circa 64 GB. Ultimamente però si sta anche cercando di sostituire l’hard disk con delle memorie flash con capacità simili. Questi dispositivi sono chiamati Solid State Drive, cioè unità a stato solido, e hanno il vantaggio, rispetto all’hard disk di non avere alcuna parte in movimento, di essere più veloci e di consumare molto meno. Il problema è però il costo, per ora troppo elevato. CAPITOLO 2. IL COMPUTER 27 Figura 2.12. L’hard disk. In alto a sinistra un hard disk visto dall’esterno. In alto a destra un hard disk aperto. In basso a sinistra uno schematizzazione dei componenti interni. Infine in basso a destra è mostrata la differenza tra la vecchia connessione IDE e la nuova connessione SATA; il connettore con 4 fili colorati è il cavo dell’alimentazione. Figura 2.13. Tre memorie flash. A sinistra una scheda SD, al centro il componente che in futuro sostituirà gli attuali hard disk, il Solid State Drive (SSD), e a destra una penna USB. CAPITOLO 2. IL COMPUTER 28 Figura 2.14. A sinistra un drive ottico. Si nota il cassettino aperto con dentro un disco ottico. A destra uno schema del principio di lettura dei dischi ottici. Nella parte bassa le foto in bianco e nero sono fotografie vere fatte al microscopio elettronico della superficie di CD, DVD e BD rispettivamente. 2.10.3 I drive ottici e i dischi ottici I dischi ottici sono delle memorie di massa per memorizzare dati, ne esistono di diversi tipi: Compact Disc (CD), Digital Versatile Disc (DVD), Blu-ray Disc (BD). Il loro diametro standard è di 12 cm. Vengono letti dai computer con degli appositi lettori chiamati ovviamente Lettore CD, Lettore DVD, e così via, generalmente chiamati drive ottici. Un Lettore BD potrà leggere sia DVD che CD, un Lettore DVD potrà leggere anche DVD, mentre un Lettore CD legge solo CD. Questo tipo di memoria è composta da un disco plastico rigido, un sottile disco metallico riflettente e altri strati protettivi. Il disco viene diviso idealmente in tante cellette, ognuna delle quali può riflettere o meno la luce. La luce che viene usata è luce laser (rossa per il CD e DVD, blu per il blue ray). Il termine disco ottico viene proprio dal fatto che viene usata della luce. Usando dischi scrivibili (R) o riscrivibili (RW) e drive appositi, detti masterizzatori, è possibile scrivere dati oltre che leggerli. Quando si è in fasi di scrittura il laser aumenta la sua pontenza fino a “bruciare” (in inglese burn) alcune cellette cambiando la loro riflettività e quindi i dati. La dimensione dei dati che può contenere un disco ottico va dai 700 MB di un CD ai 4.7 GB di un DVD single layer ai 25 GB di un BD single layer. 2.10.4 La cache La cache (dal francese nascosto) è una memoria simile alla RAM ma molto più veloce (e costosa). Non è una periferica ma è in pratica una memoria di supporto che si trova in moltissimi componenti. C’è una cache nella CPU, c’è una cache negli hard disk e così via. In pratica è una memoria che serve a velocizzare certe operazioni senza andare a disturbare la memoria RAM. Per questo motivo è anche chiamata memoria tampone o, in inglese, buffer. Si faccia molta attenzione! La memoria cache, al contrario della RAM, non fa da memoria centrale! È solo una memoria di supporto! CAPITOLO 2. IL COMPUTER 29 La dimensione della cache è solitamente di qualche decina di kB (nelle CPU) o al massimo di qualche MB (negli hard disk). La sua migliore velocità è dovuta al fatto che è direttamente collegata al componente che deve aiutare. I dati non devono passare per un BUS per raggiungere la memoria cache come invece succede per la memoria RAM. 2.10.5 Tastiera, mouse, touchpad, … Tastiera, mouse, touchpad sono delle periferiche di input. Servono all’utente per interagire con il computer, in particolare con il sistema operativo. La tastiera serve per immettere del testo. Le tastiere si distinguono principalmente per la disposizione e il tipo di caratteri che sono prestampati sui tasti. Ognuna di queste configurazioni viene chiamata layout di tastiera. Per esempio esiste la tastiera con il layout italiano, la tastiera con il layout americano, ecc…. C’è anche la possibilità che i caratteri sulla tastiera siano gli stessi ma siano in posizioni diverse: quasi tutte le tastiere con caratteri latini sono tastiere QWERTY (guardate la prima riga di lettere a sinistra nella vostra tastiera) anche se esistono altre disposizioni, come la tastiera DVORAK. Il mouse serve per muovere e far compiere delle azioni a un puntatore sullo schermo, rappresentazione ideale di un nostro dito. Il mouse è dotato di uno o più tasti per differenziare le azioni che può compiere il puntatore. Dispositivi analoghi al mouse sono il touchpad, la tavoletta grafica e, in un certo senso, il touchscreen. Figura 2.15. A sinistra in alto una tastiera per computer fissi. A sinistra in basso il layout di tastiera italiano. In destra in alto un mouse e a destra in basso un touchpad integrato in un computer portatile. CAPITOLO 2. IL COMPUTER 30 Figura 2.16. A sinistra un monitor con schrmo CRT, oramai non più usati. Al centro e a destra esempi di monitor con schermo a cristalli liquidi (detti TFT a cristalli liquidi). 2.10.6 Il monitor Il monitor è la periferica di output per eccellenza. Permette al computer di creare in maniera estremamente veloce (al contrario della stampante, per esempio) delle rappresentazioni grafiche bidimensionali, molto utili all’utente per interagire facilmente con il computer. Lo schermo del monitor si divide in tanti quadratini, chiamati pixel, ognuno dei quali diviso a sua volta in tre subpixel. Da questi subpixel può filtrare la luce rispettivamente rossa, blu e verde. L’accensione dei pixel è comandata dai segnali che arrivano in ingresso al monitor e che sono inviati dalla scheda video. La scheda video si occupa infatti di tradurre i dati in formato binario che descrivono le immagini da mostrare (elaborati dalla CPU) in segnali comprensibili dal monitor. Per questo motivo a volte le schede video vengono chiamate video adapter. Chiaramente si capisce che, a parità di dimensioni delle schermo, tanto più alto sarà il numero di pixel, tanto più definita potrà essere un’immagine. Con il termine risoluzione dello schermo si indicano le dimensioni dello schermo espresse come numero di pixel. Per esempio uno schermo con una risoluzione di 1280 × 800, è un monitor che ha 1280 pixel sul lato orizzontale e 800 pixel sul lato verticale. Il numero totale dei pixel sarà il prodotto di questi due numeri: 1280 × 800 = 1024000 pixel. La dimensione del monitor viene espressa, come per i televisori, tramite la lunghezza della diagonale dello schermo, solitamente espressa in pollici anziché in centimetri (1 pollice sono circa 2.54 cm). Si usa la diagonale perché non tutti i monitor hanno la stessa forma. Il rapporto tra larghezza e altezza, chiamato fattore di forma, può infatti variare. Tipici rapporti sono 4:3 e 16:9. Esistono tipicamente due tipi di monitor: CRT e LCD (display a cristalli liquidi). Nei vecchi CRT un fascio di elettroni veniva sparato sui pixel scorrendoli uno a uno per attivarli, componendo quindi l’immagine. Oggigiorno quasi tutti i monitor sono invece LCD, cioè a cristalli liquidi, che possiamo immaginare come dei filtri di luce. Sul retro ci sono delle lampade o dei LED sempre accesi che fanno da sorgenti di luce. Le immagini vengono composte agendo sui cristalli liquidi che compongono i pixel, permettendo alla luce di filtrare più o meno intensamente. Ultimamente si CAPITOLO 2. IL COMPUTER 31 Figura 2.17. A sinistra una stampante a getto d’inchiostro; in basso si possono vedere le cartucce contenenti il colore che si trovano dentro la stampante. A destra uno scanner con un’immagine poggiata sul piano di scansione. stanno affacciando sul mercato anche nuovi monitor basati su una nuova tecnologia, chiamata OLED, dove sono i pixel stessi a emettere luce. 2.10.7 La stampante La stampante è una periferica di output che stampa su carta o altri supporti del testo o delle immagini. Esistono principalmente due tipi di stampanti: a getto d’inchiostro e laser. Entrambe possono stampare solo in bianco e nero oppure a colori. Un parametro importante che distingue una stampante dall’altra è la risoluzione di stampa, cioè quanti punti al massimo possono essere stampati in una certa unità di lunghezza. Questa quantità viene espressa solitamente in DPI, dot per inch, e rappresenta appunto il numero di punti che la stampante può stampare al massimo in un pollice (1 pollice corrisponde a 2.54 cm). Una risoluzione di stampa amatoriale può essere 300 dpi per il testo e 600 dpi per le immagini. Una risoluzione professionale può arrivare anche a 2400 dpi o più. Le stampanti possono essere connesse direttamente al PC, tramite per esempio porte USB, ma possono anche essere messe in una rete di computer. I dati da inviare alla stampante vengono tradotti dal driver della stampante, un software che sa tradurre i dati del computer in dati adatti a essere capiti dalla stampante. Tra questi linguaggi “parlati” dalle stampanti ne ricordiamo due molto famosi: il linguaggio PostScript e il PCL. 2.10.8 Lo scanner Lo scanner è una periferica di input. La sua funzione è quella di digitalizzare le immagini, cioè passare da una fotografia o un testo stampato su carta a un insieme CAPITOLO 2. IL COMPUTER 32 Figura 2.18. A sinistra un case desktop, cioè orizzontale. Al centro un case tower, cioè verticale. A destra un case tower aperto all’interno del quale si nota la scheda madre con i vari componenti, l’alimentatore nella parte superiore e l’hard disk e il lettore DVD nella parte frontale nascosti dalla struttura di supporto. di dati digitali che rappresentano quella fotografia o quel testo in un computer. In pratica svolge la funzione inversa della stampante. Lo scopo è molto simile a quello di una fotocamera digitale. La differenza è che la fotocamera digitalizza un’immagine dell’ambiente circostante mentre lo scanner può digitalizzare solo immagini stampate. Un parametro importante che distingue uno scanner dall’altro è la risoluzione di scansione, cioè quanti punti può usare al massimo lo scanner per rappresentare una segmento di lunghezza data. Questa quantità viene espressa solitamente in DPI, dot per inch, e rappresenta appunto il numero di punti che lo scanner può usare per rappresentare un segmento lungo un pollice (1 pollice corrisponde a 2.54 cm). Una risoluzione per la scansione amatoriale è circa 300 dpi per il testo e 600 dpi per le immagini. Una risoluzione professionale può arrivare anche a 2400 dpi o più. 2.11 L’involucro e l’alimentazione L’involucro che contiene i componenti principali di un computer non portatile si chiama case (ma a volte si usano anche i termini cabinet e chassis) e solitamente ha la forma di un parellelepipedo. Quando il parallelepipedo si sviluppa orizzontalmente allora si parla di case di tipo desktop mentre se si sviluppa verticalmente allora si parla di case di tipo tower. Il case contiene la scheda madre e i componenti che sono direttamente connessi ad essa (CPU, memoria centrale, schede varie), contiene anche una o più memorie di massa (hard disk, drive ottici, ecc…) connesse con dei cavi alla scheda madre. All’interno si trova anche l’alimentatore, un apparecchio che con degli appositi cavi, fornisce l’energia elettrica a tutti i componenti del computer. Oltre a quella di involucro, il case svolge anche una funzione di raffreddamento del computer. Tutti i componenti elettronici, quando sono in funzione, sprecano dell’energia elettrica che quindi si trasforma in calore (energia termica). Questo calore deve essere eliminato perché, se la temperatura di qualche componente sale CAPITOLO 2. IL COMPUTER 33 troppo, allora si possono avere dei blocchi del computer se non addirittura una vera e propria rottura. Il raffreddamento è tipicamente realizzato tramite delle ventole. In alcuni casi dove il calore sviluppato è poco non si usano ventole ma è sufficiente la quantità di calore trasmessa verso l’esterno dal metallo del case. In altri casi invece dove il calore sviluppato è molto alto, si usano un raffreddamento ad acqua. 2.12 Esercizi • Secondo l’architettura di Von Neumann, cioè secondo il normale schema di funzionamento dei computer, a cosa serve la memoria? • Fai degli esempi di memorie di massa e prova a spiegare come immagazzinano i dati. • A cosa serve la CPU? E di quali parti è composta? • Un computer può funzionare senza hard-disk? • Cos’è un BUS? • Cos’è il clock di sistema? • Che differenza c’è tra memoria volatile e memoria permanente? Fai degli esempi. • Chi è più veloce nel leggere e scrivere i dati? RAM o hard-disk? • Cos’è un disco ottico? Fai degli esempi specificando la capacità di memorizzazione. Capitolo 3 La rappresentazione dei dati Ci sono solamente 10 tipi di persone nel mondo: chi comprende il sistema binario e chi no. Anonimo 3.1 Qual è il problema? I computer possono usare solo sequenze di sì-no, di alto-basso, di vero-falso. Insomma qualcosa che sia identificabile solo come 1 e 0. Per questo motivo bisogna trovare il modo di rappresentare tutti i dati, siano essi numeri, lettere, immagini, suoni, sotto forma di numeri, in particolare facendo uso solo di due cifre! Prima di affrontare il problema della codificazione dei dati in 1 e 0, studiamo un po’ di matematica di base del sistema binario. 3.2 Il sistema binario Uno stesso numero può essere rappresentato in molti modi diversi. Comunemente si usa il sistema decimale, che è un sistema di numerazione posizionale basato su 10 simboli diversi (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), chiamati cifre. Posizionale significa che il valore della cifra è diverso a seconda della posizione che occupa. Facciamo un esempio. Il numero 152 nel sistema decimale va inteso come 152 = 1 ⋅ 102 + 5 ⋅ 101 + 2 ⋅ 100 = 100 + 50 + 2 Normalmente gli uomini usano il sistema decimale perché è per loro naturale, avendo 10 dita per contare. Ma esistono tanti altri sistemi di numerazione posizionale, con base diversa dalla base 10: invece di 10 simboli se ne possono usare 2, 3, 16, quanti ne volete. Proviamo a contare usando solo quattro simboli: 0, 1, 2, 3. base 10 base 4 0 0 1 1 2 2 3 3 4 10 5 11 6 12 34 7 8 13 20 9 21 … … CAPITOLO 3. LA RAPPRESENTAZIONE DEI DATI 35 Un sistema di numerazione importantissimo è il sistema binario, cioè in base 2. In questo sistema si hanno solo due simboli a disposizione, 0 e 1. Qui di seguito riportiamo i numeri da 0 a 5 espressi in binario. Provate a completare la tabella, scrivendo i numeri fino a nove usando il sistema binario, in maniera analoga come abbiamo fatto poco fa usando la base 4. base 10 base 2 0 0 1 1 2 10 3 11 4 100 5 101 6 7 8 9 … … 3.2.1 Da binario a decimale Se abbiamo un numero espresso nel sistema binario e vogliamo convertirlo nel sistema decimale, l’operazione da fare è molto semplice. Basterà moltiplicare ogni cifra per una potenza con un esponente che dipende dalla sua posizione. Prendiamo per esempio il numero 101011 (101011)2 = 1 ⋅ 25 + 0 ⋅ 24 + 1 ⋅ 23 + 0 ⋅ 22 + 1 ⋅ 21 + 1 ⋅ 20 = 32 + 8 + 2 + 1 = (43)10 Cioè il numero 101011 è la scrittura in binario del numero 43 nel sistema decimale. 3.2.2 Da decimale a binario L’operazione per passare dal sistema decimale al sistema binario è invece più complessa. Il procedimento da seguire è quello di dividere sempre per due il numero di partenza fino ad arrivare a zero e considerando i resti. Leggendo i resti ottenuti dall’ultimo al primo, si ottiene il numero in rappresentazione binaria. Vediamo un esempio. Vogliamo trovare la rappresentazione binaria del numero 92 del sistema decimale. 92 46 23 11 5 2 1 0 2 2 2 2 2 2 2 resto 0 0 1 1 1 0 1 Ora non ci resta che prendere i resti dall’ultimo al primo. Il numero 92 del sistema decimale è rappresentato dal numero 1011100 nel sistema binario. 3.2.3 Le operazioni elementari La somma dei numeri binari è molto semplice. Per fare le somme in colonna è sufficiente sapere, come ci si aspetta, che 0 + 0 = 0, che 1 + 0 = 1 e che 1 + 1 = 0 con riporto di 1. CAPITOLO 3. LA RAPPRESENTAZIONE DEI DATI 36 Per quanto riguarda la moltiplicazione è anch’essa identica a quella che si fa nel sistema decimale. Basta ricordare, come è ovvio, che 0 ⋅ 0 = 0, che 0 ⋅ 1 = 0 e infine che 1 ⋅ 1 = 1. 3.2.4 I numeri negativi e i numeri frazionari 3.3 Il sistema esadecimale Se i computer ragionano sempre in termini di sistema binario, perché parlare di altri sistemi? Il motivo è che per gli umani, scrivere i numeri in binario è incredibilmente lungo, faticoso e molto scomodo. Quando in un programma si vuole scrivere un indirizzo di memoria, questo sarà quasi sempre scritto nel sistema esadecimale (16 simboli). Penserà poi un altro programma apposito a trasformare questi indirizzi nel sistema binario. I 16 simboli del sistema esadecimale sono 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. 3.3.1 Dal binario all’esadecimale e viceversa Dato che 16 è multiplo di 2, passare da base 2 a base 16 e viceversa è estremamente semplice. Per passare da base 2 a base 16 è sufficiente raggruppare i bit a gruppi di 4 e sostituire ogni gruppo di 4 bit con la corrispondente cifra esadecimale. Per passare da base 16 a base 2 è sufficiente sostituire ogni cifra esadecimale con i 4 bit che la rappresentano in forma binaria. 3.4 I tipi di dato e le codifiche Il computer per lavorare sui dati, ha bisogna che questi siano espressi come sequenze di 1 e di 0. L’operazione di trasformazione dei dati in sequenze di 1 e di 0, cioè in numeri, prende il nome di procedimento di codifica. In realtà il concetto di “codificazione” è precedente all’uso dei computer. Basti pensare al famosissimo alfabeto Morse. Con soli due simboli, corto e lungo, è possibile rappresentare lettere e numeri grazie a opportune sequenze. Il segnale può poi essere un segnale elettrico o una luce o un suono. La prima cosa da chiederci è quanti bit servono per rappresentare una certa informazione. Immaginiamo di voler identificare le dita di una mano. Abbiamo bisogno di 10 codici diversi, per esempio è naturale assegnare a ogni dito un numero, da 0 a 9. Se ora vogliamo passare ai numeri binari si capisce che avremo bisogno di almeno 4 bit. Infatti il massimo numero che posso ottenere con 4 bit è 1111 che corrisponde al numero 15. Se avessi usato solo 3 bit al massimo sarei potuto arrivare a 111 che corrisponde al numero 7. Quindi un numero insufficiente per le 10 dita. CAPITOLO 3. LA RAPPRESENTAZIONE DEI DATI 37 Tabella 3.1. I numeri da 0 a 15 rappresentati in 3 sistemi di numerazione diversi. decimale 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 esadecimale binario 0 1 2 3 4 5 6 7 8 9 A B C D E F 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 In generale il numero massimo di combinazioni ottenibili con 𝑛 bit è 2𝑛 . L’alfabeto latino ha 26 lettere, se volessi assegnare a ciascuna una combinazione di bit diversa, cioè un numero diverso, avrei bisogno di 5 bit, perché 25 = 32. 3.4.1 I numeri La maniera in cui vengono rappresentati i numeri in un computer l’abbiamo già vista. Si tratta solamente di scriverli in rappresentazione binaria. 3.4.2 Le stringhe Un altro tipo di dato sono i caratteri. L’insieme di più caratteri forma le cosiddette stringhe (di testo). Come memorizzare una poesia in forma di 1 e 0? L’operazione è molto semplice. È sufficiente usare una diversa sequenza di bit per ogni lettera o simbolo e il gioco è fatto. Una delle prime tabelle che vennero usate per trasformare i caratteri in sequenze di 1 e di 0 è la codifica ASCII (vedi App. A). La codifica ASCII è una tabella di corrispondenza tra simboli e numeri, viene detta infatti codifica dei caratteri. Comprende 128 simboli, pertanto sono necessari almeno 7 bit per poter avere 128 combinazioni diverse! Infatti 27 = 128. In realtà come detto più volte, i computer usano sempre 8 bit per volta, cioè 1 byte, pertanto anche per la codifica ASCII usano 8 bit. Dato che il primo bit è inutile sarà sempre messo uguale a 0. CAPITOLO 3. LA RAPPRESENTAZIONE DEI DATI 38 Come esercizio provate a creare un file di testo con il blocco note di Windows o in generale con un editor di testi. Scrivete nel file la parola ciao senza andare a capo e salvate. Quanto sarà la dimensione del file? La tabella ASCII fu creata sostanzialmente per poter scrivere in inglese. Come potete notare infatti mancano molti simboli, per esempio la codifica ASCII non è sufficiente per poter scrivere perfettamente in italiano perché mancano le lettere accentate. Figuriamoci altre lingue come l’arabo, il cinese, il giapponese, ecc... Per questo motivo, oggigiorno si usa una tabella molto più grande, un’altra codifica dei caratteri, chiamata UNICODE/UTF-8. Contiene tutti i simboli per tutte le scritture del mondo e non solo. Contiene anche simboli per scrivere la matematica, alfabeti fonetici, lingue morte, ecc... Il totale dei simboli che può rappresentare è ben 1 114 111. I primi 128 simboli UNICODE/UTF-8 sono identici a quelli dell’ASCII per motivi di compatibilità con il passato. 3.4.3 Le immagini Come possiamo rappresentare un bellissimo panorama con dei semplici 1 e 0?! Anche in questo caso è possibile. La prima cosa da fare è dividere l’immagine in tanti quadratini, che prendono il nome di pixel. Una volta specificata la dimensione in pixel dell’immagine è sufficiente elencare in ordine il colore di ogni pixel. Quindi ora il problema è solo quello di rappresentare i colori con dei numeri. È noto che ogni colore può essere ottenuto dalla mescolazione di tre colori cosiddetti primari: rosso, verde e blu. La soluzione è quindi di dare per ogni pixel la percentuale di rosso, verde e blu necessaria! Questo sistema è chiamato RGB (da red, green e blu. In realtà esistono anche altri sistemi per rappresentare i colori.) Chiaramente più pixel userò tanto meglio sarà la rappresentazione numerica di quell’immagine ma tanto più sarà grande il file. Stesso discorso con i colori. Tanti più bit userò per definire i colori, tanto più potrò essere preciso ma tanto più verrà grande il file. Solitamente i colori vengono codificati a 24 bit. Cioè 8 bit per il rosso, 8 bit per il verde e 8 bit per il blu. Siccome con 8 bit posso rappresentare al massimo 28 = 256 combinazioni, il numero totale di colori distinti con questo sistema sarà 256 ⋅ 256 ⋅ 256 = 16 777 216, cioè più di 16 milioni di colori. 3.4.4 I suoni Il suono, come è noto, è una vibrazione. L’intensità della vibrazione viene percepita come l’intensità del suono (il suo “volume”) mentre la sua frequenza viene percepita come una diversa altezza, cioè in pratica frequenze maggiori danno luogo a “note” più alte. Tramite un microfono le vibrazioni dell’aria vengono convertite in un segnale elettrico. Il passo successivo è quello di misurare l’intensità del suono a intervalli di tempo prefissati (campionamento). Infine non resta che trasformare queste intensità in numeri binari, usando un certo numero di bit. Chiaramente più rapidamente misurerò l’intensità e più bit userò per rappresentare l’intensità tanto più rispondente al vero sarà il suono digitalizzato ma anche tanto più grande sarà lo spazio occupato. CAPITOLO 3. LA RAPPRESENTAZIONE DEI DATI 39 Figura 3.1. Esempio di digitalizzazione di un’immagine. L’immagine viene divisa in quadratini, detti pixel, e a ogni quadratino viene attribuito un colore medio espresso da 3 numeri, che rappresentano le percentuali di rosso, verde e blu necessaria per ottenere quel colore. Figura 3.2. RGB. CAPITOLO 3. LA RAPPRESENTAZIONE DEI DATI 40 Figura 3.3. RGB esempio Figura 3.4. Esempio di suono preso da un microfono. Si noti l’intensità in funzione del tempo. I pallini rossi rappresentano i momenti scelti per essere memorizzati (campionamento). A destra la frequenza di campionamento è più alta rispetto a sinistra e questo farà sì che il suono digitalizzato sarà più simile al suono originale. 3.5 Esercizi • Perché è così importante rappresentare i dati sotto forma di numeri e in particolare sotto forma di numeri nel sistema binario? • Scrivi i numeri da 1 a 20 usando un sistema in base 2. • Scrivi i numeri da 1 a 20 usando un sistema in base 3. • Scrivi i numeri da 1 a 20 usando un sistema in base 16. • Il numero 10110110 del sistema binario a che numero in base 10 corrisponde? • Esprimi il tuo anno di nascita, il tuo mese di nascita (sotto forma numerica, cioè 4 per aprile), e il tuo giorno di nascita con il sistema binario. • Prova a dimostrare il procedimento di passaggio da decimale a binario. (Molto difficile) • Somma i numeri binari 1011010 e 10101010. Trasforma poi questi numeri, sia quelli di partenza che il risultato, nel sistema decimale. Torna tutto? • Quanti numeri possono essere rappresentati con 3 bit? • Cos’è una codifica dei caratteri. Fai un esempio. CAPITOLO 3. LA RAPPRESENTAZIONE DEI DATI 41 • Quando il computer fa dei calcoli, come rappresenta per esempio il numero 17? Con la codifica ASCII o semplicemente trasformando 17 in base 2? • Spiega come avviene la digitalizzazione di un’immagine. Qual è lo strumento che digitalizza le immagini? • Cos’è un pixel? • Spiega come avviene la digitalizzazione di un suono. • Crea tu una codifica per i giorni della settimana. Capitolo 4 Algoritmi, strutture dati e programmi An algorithm must be seen to be believed. Donald Knuth In questo capitolo studieremo in dettaglio cos’è un algoritmo e come rappresentarlo. Introdurremo le più importanti strutture di dati e mostreremo alcuni programmi molto semplici. 4.1 Algoritmi e programmi Abbiamo già discusso brevemente nell’introduzione (vedi par. 1.2.1) cosa è un algoritmo. Un algoritmo è definito come una sequenza finita di operazioni, chiaramente comprensibili all’esecutore, per risolvere un problema. Il termine algoritmo deriva dalla trascrizione latina del nome del matematico persiano Muhammad al-Khwarizmi (780 – 850), che è considerato uno dei primi autori ad aver fatto riferimento a questo concetto. In realtà sequenze finite di passi per risolvere un problema erano già usate fin dall’antica Grecia. Da ricordare sicuramente l’algoritmo di Euclide per trovare il massimo comun divisore tra due numeri interi e il metodo di Archimede per la trisezione di un angolo. Spesso un algoritmo ha degli input (immissione in inglese) e degli output (emissione/in uscita in inglese). L’input è l’insieme degli elementi in ingresso, spesso dei dati, mentre l’output è l’insieme degli elementi in uscita, spesso dei dati. Facendo un esempio molto stupido, un input possono essere gli ingredienti di una ricetta, l’algoritmo è una ricetta ben scritta e l’output è il piatto pronto. Sebbene la storia, soprattutto matematica, sia costellata di algoritmi, il loro vero uso cominciò con l’inizio del ventesimo secolo. I matematici, per poter risolvere alcune questioni fondamentali della matematica, cominciarono a creare dei modelli per descrivere le potenzialità di un algoritmo (per esempio la Macchina di Turing). Nacquero così le tecniche per comprendere se un algoritmo è più veloce di un altro 42 CAPITOLO 4. ALGORITMI, STRUTTURE DATI E PROGRAMMI 43 nella risoluzione di un problema (complessità computazionale) oppure se un algoritmo è più affidabile di un altro rispetto ad alcuni dati di input problematici (stabilità degli algoritmi). In questo corso non abbiamo né il tempo né gli strumenti adeguati a introdurre gli algoritmi secondo la matematica moderna. Per i nostri scopi ci accontenteremo di dire che un algoritmo deve essere: • Finito: l’algoritmo deve essere composto da un numero finito di passi, richiedere una quantità finita di dati in ingresso e l’esecuzione deve avere termine dopo un tempo finito. Per esempio, durante la cottura della pasta, per controllare di aver messo la corretta quantità di sale, devo assaggiare la pasta e eventualmente aggiungere del sale. Questa operazione può essere eseguita più volte ma non all’infinito! • Deterministico: a ogni passo, il successivo deve essere uno e uno solo, ben determinato. Inoltre a parità di input devo sempre ottenere lo stesso output. • Non ambiguo: i passi devono essere interpretabili in modo univoco dall’esecutore. Per esempio una ricetta di cucina deve essere così chiara e precisa che chiunque sia in grado di leggerla capisca, preparerà sempre lo stesso identico piatto con lo stesso sapore. Le operazioni che compongono un algoritmo possono anche essere complesse (es. Nella preparazione della pasta potrebbe esserci scritto “prepara il ragù”), purché l’esecutore sappia esattamente cosa deve fare oppure abbia un algoritmo apposito per eseguire quell’istruzione complessa (es. “La ricetta del ragù”). • Generale: è bene che un algoritmo sia il più generico possibile per tutta una classe di problemi simili. In pratica deve sapere gestire correttamente tutti i possibili valori di input per quel particolare problema. Per esempio nel caso della ricetta per la pasta con il ragù, l’algoritmo deve permettere di preparare la giusta quantità di pasta a seconda delle persone, deve regolare i tempi di cottura a seconda del tipo di pasta che si vuole usare, ecc… I fondamenti matematici degli algoritmi e la nascita dei primi computer furono fondamentali per la nascita dell’informatica come la conosciamo oggi. Infatti, se per ottenere un certo risultato (risolvere un certo problema) esiste un procedimento infallibile, che può essere descritto in modo non ambiguo fino ai dettagli, e conduce sempre all’obiettivo desiderato in un tempo finito, allora esistono le condizioni per affidare questo compito a un computer, semplicemente descrivendo l’algoritmo in questione in un programma scritto in un opportuno linguaggio comprensibile al computer (in particolare alla CPU). È interessante, a questo proposito, ricordare la storia della baronessa Ada Lovelace, una grande amica di Charles Babbage, l’inventore della macchina analitica che abbiamo visto nel paragrafo 2.3. Ada, figlia del famoso poeta Lord Byron, s’interessò fin da giovane alle scienze matematiche e in particolare al lavoro di Babbage. Nel 1842 Charles Babbage fu invitato a dare un seminario all’Università di Torino sulla sua macchina analitica. Luigi Menabrea, un giovane ingegnere italiano, e futuro CAPITOLO 4. ALGORITMI, STRUTTURE DATI E PROGRAMMI 44 primo ministro dell’Italia, scrisse sulla conferenza di Babbage in francese. Babbage chiese ad Ada Lovelace di tradurre in inglese alcuni interessanti articoli di Menabrea e di aggiungere eventuali note. Ada per circa 9 mesi fece questo lavoro e in una nota descrisse quello che oggi viene considerato il primo programma di computer della storia: un algoritmo per calcolare i cosiddetti numeri di Bernoulli scritto usando le istruzioni della macchina analitica di Babbage. Ada è considerata quindi la prima programmatrice di computer nella storia e il linguaggio di programmazione Ada è stato chiamato così in suo onore. 4.2 Tipi di dati e istruzioni I dati, a seconda dell’oggetto che rappresentano, sono classificati in diversi tipi: • numerici. Rappresentano dei dati su cui si possono effettuare dei calcoli numerici. • stringhe (alfanumerici). Rappresentano dei simboli, come caratteri alfabetici, numeri, ecc…tutto quello che riguarda la scrittura. Sono possibili anche delle strutture dati molto più complesse ma le vedremo più avanti. Durante un algoritmo, i dati possono essere immagazzinati in una costante o in una variabile. Possiamo immaginare sia le costanti che le variabili come delle caselle in cui mettere un dato. La differenza è che una volta messo un dato nella costante, questo non può essere cambiato con un altro dato, cosa che invece è possibile con la variabile. Le variabili e le costanti sono identificate da un nome. Per esempio, in un algoritmo che permette il calcolo dell’area del cerchio, potremmo definire all’inizio la costante pigreco e “metterci dentro“ un valore sufficientemente vicino a 𝜋 (come sapete 𝜋 è un numero irrazionale e quindi servono infinite cifre per rappresentarlo). Una variabile potrebbe essere il raggio del cerchio che chiameremo raggio. “Mettere” un dato in una variabile o in una costante si dice assegnare un valore alla costante o variabile. È sembra buona norma inizializzare le variabili. Per esempio nel caso di variabili numeriche si potrebbe assegnare all’inizio sempre il valore 0. Questo permette di evitare molti problemi, tra i quali, per esempio, la lettura di una variabile che ancora non è stata creata o se è stata creata non contiene alcun valore. Vediamo ora le operazioni più semplici che si possono usare in un algoritmo. • Istruzione di lettura, nel senso di leggere in input un valore, per esempio dalla tastiera, per poi essere assegnato a una variabile. leggi(raggio) chiede di inserire un valore da tastiera e, una volta inserito, questo valore verrà “messo dentro” la variabile raggio. • Istruzione di scrittura, nel senso di riportare in output, per esempio sullo schermo o sulla stampante, un messaggio o il contenuto di una variabile. scrivi(raggio) scrive sullo schermo il valore contenuto nella variabile raggio. CAPITOLO 4. ALGORITMI, STRUTTURE DATI E PROGRAMMI 45 • Istruzione di assegnazione, come già detto sopra consiste nell’assegnare a una variabile un certo valore. A = 10 oppure A = B oppure ancora A = B + C sono tutte operazioni di assegnazione. Per comprenderle, leggete prima il valore a destra dell’uguale e poi immaginate di metterlo dentro la variabile scritta a sinistra dell’uguale. A seconda del linguaggio di programmazione usato, si avranno a disposizione diversi tipi di dato e diverse istruzioni utilizzabili. Quelli elencati sopra sono comunque i tipi di dato e le istruzioni che si possono trovare in tutti i linguaggi. 4.3 La rappresentazione di un algoritmo Per rappresentare un algoritmo si hanno due possibilità. O lo si rappresenta graficamente usando degli appositi simboli per le sue varie parti (diagramma di flusso), oppure lo si descrive usando un linguaggio, che può essere la propria lingua (italiano, inglese, …), un linguaggio di programmazione (C++, Python, Java, …) oppure un finto linguaggio di programmazione (pseudocodice). Parleremo della rappresentazione tramite i diagrammi di flusso e tramite lo pseudocodice. In realtà questi due metodi di rappresentazione degli algoritmi sono utili solamente per algoritmi relativamente semplici, per permettere agli studenti di imparare a pensare nella maniera corretta. In realtà, come riportato nella citazione a inizio capitolo, gli algoritmi vanno provati per vedere se funzionano e come funzionano. Gli informatici e i programmatori scrivono sempre gli algoritmi con un linguaggio di programmazione a loro scelta per poi farli eseguire al computer. I diagrammi di flusso e lo pseudocodice esistono invece solo sulla carta e per provare un algoritmo l’unico modo è quello di “eseguirlo a mano” leggendolo. 4.3.1 Il diagramma di flusso I diagrammi di flusso (in inglese flow chart) sono un caso particolare di diagrammi a blocchi e servono per rappresentare graficamente il flusso di un algoritmo. In figura 4.1 sono rappresentati i blocchi principali che si usano nei diagrammi di flusso. C’è il blocco iniziale e il blocco finale. C’è il blocco di input/output (lettura/scrittura), il blocco di elaborazione (assegnazione) e il blocco di controllo. La lettura di un diagramma di flusso procede in maniera sequenziale: 1. si parte dal blocco iniziale; 2. si segue la freccia in uscita; 3. si giunge al blocco successivo e si effettua l’operazione descritta nel blocco; 4. si procede iterando i passi 2 e 3 fino a giungere al blocco finale. Non tutte le combinazioni di questi simboli corrispondono a un algoritmo. Un diagramma di flusso rappresenta un algoritmo se: 1. inizia con il blocco iniziale e finisce con il blocco finale e se questi due blocchi compaiono una e una sola volta. 2. viene usato un numero finito di blocchi. 3. Ogni blocco soddisfa le condizioni di validità. Le condizioni di validità dicono che le frecce entranti e uscenti devono essere sempre come quelle in figura 4.1. Non ci possono essere più o meno frecce o frecce CAPITOLO 4. ALGORITMI, STRUTTURE DATI E PROGRAMMI (a) Blocco iniziale. (c) Blocco di elaborazione. 46 (b) Blocco finale. (d) Blocco di input/output. (e) Blocco di controllo. Figura 4.1. I blocchi più importanti che compongono i diagrammi di flusso. START Area quadrato IN Lato Area = Lato * Lato OUT Area END Area quadrato Figura 4.2. Diagramma di flusso che rappresenta un algoritmo estremamente semplice per il calcolo dell’area di un quadrato, dando in input la lunghezza del lato. Come si vede nel blocco iniziale e finale, il nome che abbiamo dato a questo banale algoritmo è “Area quadrato”. CAPITOLO 4. ALGORITMI, STRUTTURE DATI E PROGRAMMI 47 con dei versi cambiati. Inoltre, con le opportune condizioni, deve essere possibile raggiungere ogni punto del diagramma e raggiungere sempre il blocco finale. Nella figura 4.2 è riportato un semplice diagramma di flusso che rappresenta un algoritmo per il calcolo dell’area di un quadrato, dando in input la lunghezza del lato. In questi appunti, useremo i diagrammi di flusso e lo pseudocodice generati dal programma gratuito AlgoBuild (http://algobuild.com/, freeware, scritto in Java). 4.3.2 Lo pseudocodice Lo pseudocodice, detto a volte anche pseudocodifica, è un altro modo di rappresentare un algoritmo. Anziché essere grafico, come i diagrammi di flusso, è testuale. In maniera molto semplice, lo si può pensare come a una descrizione a parole di ciò che fa l’algoritmo. In realtà, come per i diagrammi di flusso, lo pseudocodice ha delle regole e delle istruzioni ben precise. Ecco un esempio di pseudocodice del solito algoritmo “Area quadrato”. 1 2 3 4 5 BEGIN "Area quadrato" IN Lato Area = Lato * Lato OUT Area END "Area quadrato" In questi appunti, useremo i diagrammi di flusso e lo pseudocodice generati dal programma gratuito AlgoBuild (http://algobuild.com/, freeware, scritto in Java). 4.4 Qualche esempio semplice di algoritmo Nell’introduzione avevamo fatto un esempio di vita quotidiana per descrivere un algoritmo. Si supponeva che un ragazzo volesse vedere un film in DVD ma che oramai si fosse messo sul divano e non si volesse alzare. Appena un componente della sua famiglia si avvicina lo chiama per fargli mettere il DVD. Da un punto di vista formale le istruzioni che il ragazzo dà al componente della famiglia sono un esempio di algoritmo. In figura 4.3 vediamo alcuni possibili algoritmi che il ragazzo potrebbe fornire al malcapitato (per forzare un po’ la situazione potremmo pensare che il ragazzo possa fornire l’algoritmo solamente scrivendolo sulla carta). Il primo algoritmo è il più semplice e si compone solamente di una sequenza di blocchi di elaborazione (i rettangoli). Il secondo prevede la possibilità che il malcapitato chieda quale DVD il ragazzo voglia vedere. Questo viene espresso grazie al blocco di input (il parallelogramma) in cui, come potete notare, il nome del film viene memorizzato nella variabile X. Infine l’ultimo esempio è un po’ più generico CAPITOLO 4. ALGORITMI, STRUTTURE DATI E PROGRAMMI 48 START Visione DVD START Visione DVD Accendi la TV Accendi la TV OUT "Quale film?" START Visione DVD OUT "Quale film?" IN X Accendi la TV IN X Prendi il DVD di Ritorno al futuro Prendi il DVD X Prendi il disco all'interno Prendi il DVD X F if Dischi presenti = 1 T Prendi il disco all'interno Prendi il disco 1 Accendi il Lettore DVD Accendi il Lettore DVD Apri il cassetto del Lettore DVD Apri il cassetto del Lettore DVD Inserisci il DVD Inserisci il DVD Prendi il disco all'interno Accendi il Lettore DVD Apri il cassetto del Lettore DVD Inserisci il DVD Chiudi il cassetto del Lettore DVD Chiudi il cassetto del Lettore DVD Chiudi il cassetto del Lettore DVD Spingi Play Spingi Play END Visione DVD END Visione DVD Spingi Play END Visione DVD Figura 4.3. Tre esempi di algoritmi per comandare a una persona di farci vedere un film in DVD. A sinistra un algoritmo molto semplice dove si usa solamente il blocco istruzione. La centro un algoritmo leggermente più generico, dove viene prevista la possibilità di scegliere il film. A destra un algoritmo che prevede la possibilità di trovare nella custodia del DVD uno o più dischi. e prevede, oltre alla scelta del film, anche come comportarsi se nella custodia vengono trovati uno o più dischi. Questo è rappresentato grazie al blocco di controllo (il rombo; F sta per FALSE, falso in inglese, e T sta per TRUE, vero in inglese). Questi algoritmi non esauriscono di certo tutte le possibilità che potrebbe incontrare l’esecutore, cioè la persona che deve mettere il DVD. Per esempio il ragazzo potrebbe chiedere di vedere un film che però non è presente in casa (perché mai acquistato o perché prestato ad amici). Oppure una volta aperta la custodia potrebbe non esserci alcun disco all’interno (perché perso oppure rimasto dentro al lettore DVD). E così molte altre possibilità. Se l’esecutore si trovasse di fronte a uno di questi casi non saprebbe cosa fare e se ne andrebbe. Passando a un contesto più reale, la stessa cosa accade per i computer. Quando la CPU esegue un programma, se a un certo punto si presenta una situazione non prevista (per esempio il programma ha bisogno di aprire un file ma questo file non esiste e il programmatore non ha pensato a questa possibilità) allora il programma si blocca. CAPITOLO 4. ALGORITMI, STRUTTURE DATI E PROGRAMMI 49 START Lotteria OUT "Inserisci un numero" IN X F if X = "83" OUT "Non hai indovinato!" END Lotteria T OUT "Hai indovinato!" 1 2 3 4 5 6 7 8 BEGIN "Lotteria" OUT "Inserisci un numero" IN X IF X = "83" GOTO 7 OUT "Non hai indovinato!" GOTO 8 OUT "Hai indovinato!" END "Lotteria" Figura 4.4. Algoritmo “Lotteria” per determinare se il numero inserito è uguale al numero dato. 4.5 Condizioni, cicli e l’istruzione GOTO Nel corso degli anni la maniera di scrivere i programmi si è evoluta di pari passo con i nuovi comandi messi a disposizione dai vari linguaggi di programmazione. I programmi realizzati fino agli anni 1970 erano una lunga sequenza di istruzioni. Il paradigma di programmazione di questi primi programmi, cioè la maniera in cui venivano scritti, prende il nome di programmazione imperativa. Con l’aumentare della complessità della logica dei programmi, i codici diventavano sempre più complessi e non facili da manutenere, soprattutto a causa dell’istruzione GOTO, che permetteva di passare da una parte all’altra del programma. Infatti GOTO significa in inglese vai a. Per capire di cosa stiamo parlando, proviamo a scrivere in pseudocodice alcuni algoritmi interessanti. In particolare vogliamo far vedere come sono difficili da leggere certi algoritmi scrivendoli con l’istruzione GOTO. Partiamo da un semplice algoritmo che abbia una condizione. Per esempio scriviamo un algoritmo che richieda un numero in input e che stampi la scritta “Hai indovinato!” se il numero inserito è uguale a 83 oppure “Non hai indovinato!” se il numero inserito è diverso da 83. In figura 4.4 viene mostrato il diagramma di flusso di questo algoritmo e la sua scrittura in pseudocodice. Si noti la difficoltà di leggere questo algoritmo usando l’istruzione GOTO. Questo appena visto è il più semplice esempio di condizione scritta usando l’istruzione GOTO. Ora vediamo invece come rappresentare un ciclo, cioè la ripetizione di una certa sequenza di operazioni fino al raggiungimento di una condizione prefissata. Facciamo un esempio. Supponiamo di voler scrivere un algoritmo che stampi tutti i numeri da 1 fino a 100. Una maniera stupida di scrivere questo algoritmo potrebbe essere quella di mettere 100 istruzioni di output del tipo “Scrivi 1”, “Scrivi 2”, “Scrivi 3” CAPITOLO 4. ALGORITMI, STRUTTURE DATI E PROGRAMMI 50 e così via. Chiaramente questo è un modo pessimo perché non generalizzabile. Una maniera intelligente è invece quella rappresentata dal diagramma di flusso nella figura 4.5. Anche in questo caso si noti la difficoltà di leggere questo algoritmo usando l’istruzione GOTO. 1 2 3 4 5 6 7 BEGIN "Contatore" N = 1 IF N = 100 GOTO 7 OUT N N = N + 1 GOTO 3 END "Contatore" Figura 4.5. Diagramma di flusso e pseudocodice dell’algoritmo “Contatore” per stampare i numeri naturali da 1 a 99. 4.6 La programmazione strutturata e procedurale Come abbiamo visto, con l’aumentare della complessità della logica dei programmi, i codici diventavano sempre più complessi e non facili da manutenere, soprattutto a causa dell’istruzione GOTO, che permetteva di passare da una parte all’altra del programma. Nel 1966 i matematici Corrado Böhm e Giuseppe Jacopini enunciano e dimostrano un famoso teorema, in cui si afferma che ogni algoritmo è sempre esprimibile usando tre sole strutture di controllo: la sequenza, la selezione e l’iterativa (detta anche ciclo). In questo modo dimostrarono che è sempre possibile eliminare l’istruzione GOTO dai programmi. Queste particolari strutture dovevano venire messe a disposizione dal linguaggio di programmazione usato, oppure dovevano essere create dal programmatore stesso. Da quel momento nacque quindi la programmazione strutturata, cioè un paradigma di programmazione secondo il quale i programmi andavano scritti in maniera chiara e organizzata, usando delle strutture di controllo come, appunto, la sequenza, la selezione, l’iterativa o altre derivate da esse. In realtà l’istruzione GOTO rimase in molti linguaggi di programmazione anche se fu fortemente sconsigliati il suo uso. CAPITOLO 4. ALGORITMI, STRUTTURE DATI E PROGRAMMI 51 Attualmente tutti i programmi sono scritti con uno stile ancora più moderno, ma di cui non ci occuperemo, chiamato programmazione orientata agli oggetti. Questo non significa che imparare la programmazione strutturata è inutile! Tutte le strutture di controllo della programmazione strutturata sono presenti anche nella programmazione orientata agli oggetti. Vedremo ora le strutture di controllo basilari secondo il teorema di Böhm-Jacopini e la loro rappresentazione: la struttura di sequenza, struttura di selezione, struttura iterativa e alcune strutture derivate. Per approfondire si veda il link http://it.wikipedia.org/wiki/Struttura_ di_controllo. 4.6.1 La struttura di sequenza La struttura di sequenza permette semplicemente l’esecuzione di più istruzioni una dopo l’altra. Queste istruzioni possono essere di qualsiasi tipo. Nella figura 4.6 è rappresentata la struttura di sequenza tramite un diagramma di flusso e in pseudocodice. Con l’espressione “istruzione generica” intendiamo un’istruzione o una struttura. Istruzione generica Istruzione generica ... ISTRUZIONE GENERICA 1 ISTRUZIONE GENERICA 2 ... Figura 4.6. La struttura di sequenza. A sinistra la sua rappresentazione in un diagramma di flusso e a destra la sua rappresentazione in pseudocodice. 4.6.2 La struttura di selezione La struttura di selezione serve per eseguire diverse istruzioni a seconda che una certa condizione sia vera oppure no. Nella figura 4.7 è rappresentata la struttura di selezione tramite un diagramma di flusso e in pseudocodice. Con l’espressione “istruzione generica” intendiamo un’istruzione o una struttura. 4.6.3 La struttura iterativa La struttura iterativa permette la ripetizione di un’istruzione (ciclo) finché è verificata una certa condizione. Quando la condizione non è più verificata la struttura termina e si passa alla struttura successiva. La verifica della condizione può essere fatta CAPITOLO 4. ALGORITMI, STRUTTURE DATI E PROGRAMMI FALSE Condizione Istruzione generica 52 TRUE Istruzione generica ... IF condizione THEN istruzione generica 1 ELSE istruzione generica 2 ENDIF ... Figura 4.7. La struttura di selezione. A sinistra la sua rappresentazione in un diagramma di flusso e a destra la sua rappresentazione in pseudocodice. FALSE Condizione Istruzione generica TRUE Istruzione generica TRUE Condizione FALSE ... WHILE condizione DO istruzione generica ... ... REPEAT istruzione generica UNTIL condizione ... Figura 4.8. La struttura iterativa. A sinistra la struttura iterativa con controllo in testa. A destra la struttura iterativa con controllo in coda. CAPITOLO 4. ALGORITMI, STRUTTURE DATI E PROGRAMMI 53 prima dell’istruzione (controllo in testa) oppure può essere fatta dopo l’istruzione (controllo in coda): nel secondo caso l’istruzione viene eseguita almeno una volta. Nella figura 4.8 sono rappresentate la struttura iterative tramite diagramma di flusso e pseudocodice. Con l’espressione “istruzione generica” intendiamo un’istruzione o una struttura. 4.6.4 Altre strutture derivate Da fare... 4.7 Esempi semplici 4.7.1 Stampare la tabellina del 2 fino a un numero dato Provate da soli a scrivere lo pseudocodice per questo algoritmo ma prima di tutto cercate di eseguire l’algoritmo passo passo, a mente o a voce alta. Solo in questo START Tabellina 2 OUT "Fino a che numero devo stampare la tabellina?" IN Nmax n=2 while n <= Nmax F T OUT n n=n+2 END Tabellina 2 Figura 4.9. Diagramma di flusso di un algoritmo che stampa la tabellina del due fino a un numero massimo dato. CAPITOLO 4. ALGORITMI, STRUTTURE DATI E PROGRAMMI 54 modo potrete capire come funzionano gli algoritmi (An algorithm must be seen to be believed). 4.8 La programmazione procedurale: sottoprogrammi e funzioni Nello stesso periodo si afferma anche la programmazione procedurale, cioè uno stile di programmazione in cui era possibile creare dei blocchi di codice, detti procedure, che potevano essere richiamati dal programma principale, quante volte si voleva. Immaginate un programma che deve eseguire spesso una certa operazione, per esempio risolvere un’equazione di secondo grado. È scomodo e problematico ripetere ogni volta il codice per la risoluzione! È invece molto più semplice scrivere il codice una volta sola e poterlo richiamare quando serve. 4.9 Alcuni esempi di algoritmi “veri” Esistono un’infinità di algoritmi specifici che vengono usati dalle macchine che ci circondano. Qui di seguito una lista di algoritmo o classi di algoritmi molto famosi. Fare delle tesine a gruppi da inserire nelle dispense. Ecco alcuni link di approfondimento: • Algoritmi di ordinamento • Algoritmi di ricerca • Come fa Google Maps a trovare il percorso migliore? L’algoritmo di Dijkstra • Algoritmi di compressione Breve corso sulla compressione dei file 4.10 Strutture dati Tipi di dato: numero intero, intero lungo, stringa. Strutture dati: array, matrice, record, lista, grafi, alberi 4.11 La creazione dei programmi Un computer può eseguire delle istruzioni solo se queste sono sotto forma di linguaggio macchina, che è sostanzialmente la “lingua” parlata dalla CPU. I programmi per computer quindi non sono altro che lunghissime sequenze di istruzioni scritte in linguaggio macchina. Un programmatore, cioè la persona che scrive un programma, non deve direttamente scrivere dei file contenenti le istruzioni in linguaggio macchina. Ciò sarebbe estremamente difficile per vari motivi: prima di tutto perché le istruzioni vanno CAPITOLO 4. ALGORITMI, STRUTTURE DATI E PROGRAMMI 55 scritte in binario; poi perché si hanno a disposizione solo istruzioni molto semplici, rendendo anche semplici programmi veramente lunghi da scrivere; infine perché tutta la gestione della memoria è manuale, cioè è il programmatore che deve decidere gli indirizzi della memoria centrale dove memorizzare le informazioni e così via. Normalmente un programmatore scrive i programmi usando un linguaggio di programmazione ad alto livello, cioè un linguaggio che usa parole chiave e comandi presi dal linguaggio umano (solitamente l’inglese). Il primo linguaggio di programmazione ad alto livello è stato il FORTRAN, tutt’ora usato in ambito scientifico nelle sue versioni più moderne. La maggior parte dei programmi odierni è però scritta usando il C, il C++, il C# o il Visual Basic. Il programmatore salva ciò che scrive in uno o più file di testo. Il programma così scritto non può essere eseguito dal computer perché non è scritto in linguaggio macchina! Questo insieme di file viene infatti chiamato codice sorgente del programma. Per trasformare il sorgente, scritto con un linguaggio ad alto livello, in un programma vero e proprio, cioè contenente istruzioni in linguaggio macchina, bisogna effettuare la cosiddetta compilazione. Per ogni linguaggio di programmazione esiste un programma speciale, chiamato compilatore, che traduce quel particolare linguaggio in istruzioni del linguaggio macchina. Possiamo immaginare il compilatore come un traduttore che traduce un libro scritto in una lingua (per esempio C++) in un libro in un altra lingua (linguaggio macchina). Alla fine quello che si ottiene è un programma eseguibile (in Windows i file eseguibili hanno comunemente l’estensione .exe). Una volta ottenuto il programma, questo può essere eseguito quante volte si vuole. I codici sorgenti non sono più necessari, a meno che si vogliano apportare delle modifiche. In quel caso bisogna ovviamente ricreare di nuovo il programma a partire dai nuovi sorgenti.1 Esistono anche altri linguaggi come il Java, il PHP, il Python, ecc…in cui il sorgente non viene tradotto per creare un file in linguaggio macchina ma viene tradotto riga per riga, tutte le volte che viene eseguito. Questi linguaggi si dicono interpretati. In questo caso la traduzione è affidata a un programma speciale chiamato interprete. Per continuare con l’analogia delle traduzione da una lingua all’altra, pensate all’interprete simultaneo. Il vantaggio di questo approccio è quello di non avere file eseguibili che per loro natura sono adatti solo a un tipo di CPU e di siste1 In realtà la compilazione non produce direttamente il file eseguibile, ma un file intermedio chiamato programma oggetto. Quando il programmatore scrive un programma, spesso usa funzioni già scritte da altre persone e presenti in particolari software, chiamati librerie. Il codice oggetto da solo quindi non può funzionare senza queste librerie. Il processo per trasformare un programma oggetto in un vero e proprio eseguibile è il linking, dall’inglese collegamento. In pratica un particolare software chiamato linker si occupa di “mettere insieme” nello stesso file, il codice oggetto creato dal compilatore e le librerie necessarie. Oggigiorno in realtà le librerie non vengono interamente copiate all’interno del programma eseguibile. I sistemi operativi moderni permettono il dynamic linking, collegamento dinamico, cioè l’eseguibile non comprende al suo interne le librerie ma solo dei rimandi ad esse. Le librerie vengono caricate in memoria solo al momento dell’esecuzione del programma. Questo è molto vantaggioso perché se 100 programmi usano la stessa libreria (per esempio la libreria con le funzioni matematiche), usando il dynamic linking avrò bisogno di avere una solo copia di questa libreria all’interno del mio computer. Se invece usassi il linking normale, sprecherei molto spazio perché ogni eseguibile conterrebbe al suo interno la stessa libreria. CAPITOLO 4. ALGORITMI, STRUTTURE DATI E PROGRAMMI 56 Figura 4.10. Rappresentazione schematica dei passaggi che servono per trasformare un codice sorgente in linguaggio macchina tramite compilazione. Come si vede questo processo crea un file binario eseguibile che è il programma vero e proprio. Figura 4.11. Rappresentazione schematica di come avviene l’esecuzione di codice scritto in un linguaggio interpretato. Come si nota, non viene creato un nuovo file come nel caso dei linguaggi compilati. Il codice viene invece ritradotto riga per riga tutte le volte e inviato direttamente alla CPU per essere eseguito. CAPITOLO 4. ALGORITMI, STRUTTURE DATI E PROGRAMMI 57 ma operativo. Un programma scritto con un linguaggio interpretato è più facile da far funzionare su computer diversi perché è sufficiente che ci sia un interprete per quel tipo di computer. Lo svantaggio di questi linguaggi è però la lentezza, dovuta al fatto che le istruzioni ad alto livello devono essere tradotte tutte le volte. Se però le prestazioni non sono fondamentali, e quello che conta è la portabilità del codice, allora questi linguaggi sono perfetti. Sono infatti molto usati, per esempio, per creare applicazioni web o per applicazioni che devono girare su macchine con caratteristiche tecniche molto differenti, come cellulari o tablet. Il processo di sviluppo del software è oramai standardizzato a livello industriale. Uno dei metodi tipici che vengono usati è il modello a cascata. In pratica ogni fase di sviluppo genera un prodotto materiale o immateriale per la fase successiva. Ecco le fasi: • Fattibilità. Si decide se è conveniente intraprendere lo sviluppo di un certo prodotto. • Analisi. Si decidono le caratteristiche del software, in pratica cosa dovrà essere in grado di fare. • Progettazione. Si progetta il software decidendo il linguaggio di programmazione, la sua struttura, la divisione dei compiti tra i vari programmatori, ecc… • Sviluppo. La scrittura vera e propria del programma secondo il progetto prestabilito. • Test. I singoli programmatori verificano il corretto funzionamento della parte di software a loro affidata. Dopodiché seguono i test per controllare il corretto funzionamento dell’intero programma dopo che le varie parti sono state messe insieme. • Manutenzione. A questo punto il software è pronto per essere consegnato al committente e ciò che rimane da fare è la manutenzione del software, che consiste nel correggere gli errori che pian piano gli utenti scopriranno e nell’implementazione di nuove funzionalità. 4.12 Esercizi • Cos’è un algoritmo? • Che caratteristiche ha un algoritmo? Per ognuna di essere fai un esempio di algoritmo che non abbia quella caratteristica. • Perché un computer deve essere programmato? • Cos’è un programma? • Quali sono i tipi di dato più semplici? CAPITOLO 4. ALGORITMI, STRUTTURE DATI E PROGRAMMI 58 • Quali sono le istruzioni più semplici? • Quali sono i modi per rappresentare gli algoritmi? • Quali sono i blocchi principali dei diagrammi di flusso? • Che differenza c’è tra variabile e costante? • Cos’è il GOTO? Fai degli esempi. • Cosa dice il teorema di Böhm–Jacopini? • Cos’è la programmazione strutturata? E quali sono le principale strutture? • Cos’è la programmazione procedurale? • Scrivi un algoritmo per stampare la tabellina del 4 • Scrivi un algoritmo per stampare una generica tabellina • Scrivi un programma in pseudocodice e il relativo diagramma a blocchi che legge da tastiera una sequenza di 10 numeri interi e, al termine, stampa a video il numero dei numeri letti che sono maggiori di zero, di quelli che sono minori di zero e di quelli nulli. • Scrivi un programma in pseudocodice e il relativo diagramma a blocchi che permette di capire se un numero intero dato dall’utente è primo oppure no (ricorda che un numero primo è un numero intero divisibile solo per se stesso e per uno). • Cos’è un linguaggio di programmazione ad alto livello? • Che differenza c’è tra un linguaggio di programmazione interpretato e uno compilato? • Qual è il modello di sviluppo software tipico? Di quali fasi si compone? • Per quale motivi gli errori nei programmi sono chiamati bug? • Scrivere dei programmi con un linguaggio di programmazione a vostro piacimento (consigliato C++ o Python) che risolvano i problemi esposti sopra (stampa di una tabellina, identificazione di un numero primo, ecc…). Studiate le basi del linguaggio scelto su qualche sito internet. Se non volete installare del software potete provare dei semplici compilatori/interpreti online che sono sufficienti per programmi semplici come i nostri (es. Inteprete online per Python 3 dell’Università di Waterloo, Inteprete online per Python 3 del liceo Holy Cross, Codepad: compilatore/inteprete online per diversi linguaggi) Capitolo 5 Sistemi operativi e programmi Software is like sex, it’s better when it’s free. Linus Torvalds In questo capitolo parleremo dei concetti utili a un semplice utente per il normale uso del computer. Parleremo quindi delle funzioni principali di un sistema operativo e dei programmi per ufficio più utili. Ricordiamo subito che i programmi si dividono in programmi di base (sistemi operativi, compilatori e editor di testo) e programmi applicativi che invece servono per compiti specifici non fondamentali come scrivere, vedere foto, ecc… 5.1 Il diritto d’autore per il software Prima di iniziare a parlare di programmi dobbiamo parlare di diritto d’autore e di licenze per il software. Il diritto d’autore è la condizione in cui si trova l’autore di un’opera dell’ingegno (per esempio un software) al quale i vari ordinamenti giuridici nazionali riconoscono la facoltà esclusiva di diffusione e sfruttamento, economico e morale. In Italia prende il nome di diritto d’autore, mentre negli stati anglosassoni, si chiama copyright (dall’inglese diritto di copia). Normalmente, se non si hanno i diritti su un’opera, in particolare un software, non si ha il permesso di usarla, distribuirla e modificarla. Il detentore del copyright concede però alcuni dei suoi diritti all’utente, obbligandolo ad accettare una licenza. Tra i diritti concessi c’è ovviamente il diritto a usare il software in questione. Praticamente ogni software è dotato di una licenza che deve essere accettata prima di poterlo usare, solitamente durante la fase di installazione o al momento dell’acquisto. Nel mondo anglosassone la licenza viene chiamata EULA (End User License Agreement) e ogni produttore decide quali diritti e doveri vengono concessi all’utente. Nel corso degli anni le restrizioni eccessive imposte dalle leggi in materia di diritto d’autore nella circolazione delle opere d’ingegno (software, medicinali, in59 CAPITOLO 5. SISTEMI OPERATIVI E PROGRAMMI 60 venzioni, ecc…) hanno fatto nascere movimenti di pensiero per cambiare lo stato attuale e permettere una circolazione più libera delle idee e un progresso più rapido delle tecnologie. Queste idee nacquero a metà degli anni 1980 nel campo informatico grazie a Richard Stallman. Dalle idee di Stallman nacque il concetto di copyleft, gioco di parole in contrapposizione a copyright. Il copyleft è un modello di gestione dei diritti d’autore dove il detentore dei diritti concede all’utente, tramite una licenza, molti più diritti di quanto facciano le classiche EULA, per esempio il diritto a ridistribuirlo a chiunque o a modificarlo a suo piacimento. L’idea del copyleft è quella però di obbligare a ridistribuire il software con la stessa licenza con cui lo si è ottenuto, mantenendo quindi in questo modo la libertà acquisita. Questa idea rivoluzionaria è stata per primo applicata al software, grazie alla licenza GNU GPL e successivamente anche alle opere artistiche con le licenze Creative Commons. Nel mondo software si usano molti termini di cui si deve conoscere il significato: • Software open source. Qualsiasi software di cui sia possibile ottenere legalmente il codice sorgente. • Software libero (free software). Qualsiasi software che sia distribuito con una licenza che risponda ai principi del copyleft. Tutti i software liberi sono anche open source, perché senza codice sorgente sarebbe impossibile modificarli. Inoltre molti dei software liberi sono anche gratuiti, anche se non sempre. • Software proprietario. Con questo termine si indica un software che ha delle restrizioni sul suo utilizzo, modifica, ridistribuzione, ecc…solitamente esercitate dal proprietario del copyright. In generale con questo termine si indica qualsiasi software che non sia software libero. Molto spesso un software proprietario è anche a pagamento. • Freeware. Un software proprietario che sia gratuito. • Shareware. Un software proprietario a pagamento che si può però utilizzare gratuitamente per un periodo di prova. • Pubblico dominio. Un software il cui codice è disponibile a chiunque e di cui nessuno detiene il copyright. È da ricordare che il solo fatto che un software sia gratuito o addirittura sotto una licenza che rispetta i principi del copyleft, non significa che questo software non possa comportare un guadagno per l’autore. Infatti, anche nel caso di software distribuiti gratuitamente, l’autore potrebbe fornire a pagamento le guide del software, o il supporto o l’implementazione di nuove funzionalità, ecc… 5.2 I sistemi operativi In informatica il sistema operativo, abbreviato in SO (in inglese OS, operating system) è un particolare software, installato su un computer, che ne garantisce l’operatività di base coordinando le risorse hardware di processamento, memorizzazione e CAPITOLO 5. SISTEMI OPERATIVI E PROGRAMMI 61 le periferiche e senza il quale quindi non sarebbe possibile l’utilizzo di altri software più specifici, come applicazioni o librerie software, e quindi in ultimo del computer stesso. Esso funge quindi da “base” al quale si appoggiano gli altri software, che dunque dovranno essere progettati in modo da essere riconosciuti e supportati da quel particolare sistema operativo. Per sistema operativo intendiamo quindi l’insieme dei componenti software che hanno il duplice scopo di gestire le risorse hardware e software del computer, e fare da interfaccia tra l’utente e l’hardware. Il sistema operativo è un insieme è responsabile: • del controllo e della gestione delle componenti hardware che costituiscono il computer (processi di input/output da e verso le periferiche collegate al sistema) • dell’esecuzione dei programmi che su di esso vengono eseguiti. • gestire l’archiviazione e l’accesso ai file. I programmi possono gestire l’archiviazione dei dati su memoria di massa (ottenendo strutture complesse, come un database), servendosi delle procedure messe a disposizione del sistema operativo. La componente del SO che si occupa di tutto ciò viene chiamata file system. • Infine, se è prevista interazione con l’utente, viene solitamente utilizzata allo scopo un’interfaccia software (grafica o testuale) per accedere alle risorse hardware (dischi, memoria, I/O in generale) del sistema. D’altra parte, un sistema operativo può essere utilizzato anche su una macchina che non preveda interazione diretta con un essere umano (per un esempio, vedi smart card o determinati sistemi embedded) spesso dunque più leggero e semplificato. Solitamente un sistema operativo installato su computer fornisce anche degli applicativi di base per svolgere elaborazioni di diverso tipo. Sebbene molte delle funzionalità sopraddette non siano spesso immediatamente visibili/percepibili dall’utente, l’importanza del sistema operativo di un calcolatore è cruciale: oltre alla necessità di gestione delle funzionalità di base sopraddette, al di là delle prestazioni massime offerte dall’hardware dell’elaboratore stesso, il sistema operativo determina di fatto efficienza e buona parte delle prestazioni effettive di funzionamento dell’intero sistema ad esempio in termini di latenze di processamento, stabilità, interruzioni o crash di sistema. Un generico sistema operativo moderno si compone di alcune parti standard, più o meno ben definite. • Il kernel: un gruppo di funzioni fondamentali, strettamente interconnesse fra loro e con l’hardware, che vengono eseguite con il privilegio massimo disponibile sulla macchina ossia in modalità kernel; il kernel fornisce le funzionalità di base per tutte le altre componenti del sistema operativo, che assolvono le loro funzioni servendosi dei servizi che esso offre. A seconda del tipo di sistema operativo il kernel può inglobare altre parti (kernel classico, monolitico o modulare) o fornire solo funzioni base delegando più funzioni possibile a oggetti/gestori esterni (microkernel). CAPITOLO 5. SISTEMI OPERATIVI E PROGRAMMI 62 • Il gestore di file system: si occupa di esaudire le richieste di accesso alle memorie di massa. Viene utilizzato ogni volta che si accede a un file sul disco, e oltre a fornire i dati richiesti tiene traccia dei file aperti, dei permessi di accesso ai file. Inoltre si occupa anche e soprattutto dell’astrazione logica dei dati memorizzati sul computer (directory, ecc). • Un sistema di memoria virtuale: che alloca la memoria richiesta dai programmi e dal sistema operativo stesso, salva sulla memoria di massa le zone di memoria temporaneamente non usate dai programmi e garantisce che le pagine swappate vengano riportate in memoria se richieste. • Uno scheduler: che scandisce il tempo di esecuzione dei vari processi e assicura che ciascuno di essi venga eseguito per il tempo richiesto. Normalmente lo scheduler gestisce anche lo stato dei processi e può sospenderne l’esecuzione nel caso questi siano in attesa senza fare nulla (esempio classico è la richiesta di dati da disco). Nei sistemi operativi realtime lo scheduler si occupa anche di garantire una timeline, cioè un tempo massimo di completamento per ciascun task in esecuzione, ed è notevolmente più complesso. • Uno spooler: che riceve dai programmi i dati da stampare e li stampa in successione, permettendo ai programmi di proseguire senza dover attendere la fine del processo di stampa. • Una interfaccia utente (Shell): che permette agli utenti di interagire con la macchina. Tra i sistemi operativi più famosi figurano le varie versioni Windows (Xp, Vista, 7) della Microsoft, i sistemi basati sul kernel Linux (Android, Ubuntu, SUSE, Gentoo, ecc…), i sistemi derivati da Unix (Mac OS X, BSD, Solaris) e molti altri. 5.2.1 Il filesystem In informatica, un file system è, informalmente, un meccanismo con il quale i file sono immagazzinati e organizzati su un dispositivo di archiviazione, come un disco rigido o un CD-ROM. Un file system è parte integrante di qualsiasi sistema operativo moderno. L’unico vero compito dei sistemi operativi dei primi microcomputer era proprio la gestione dei file, un fatto che si riflette nei loro nomi (per esempio DOS è l’acronimo di Disk Operating System). Con la parola file (archivio in inglese) si indica un insieme di dati che vanno a formare una certa entità coerente di dati, per esempio tutti i dati che servono per rappresentare un’immagine, vanno a formare il file di quella immagine. Il filesystem può lavorare sui file nascondendo all’utente la vera forma fisica in cui i dati sono effettivamente memorizzati su un certo supporto (per esempio in un disco rigido i dati sono divisi in settori, che però l’utente non vede. L’utente vede il file nella sua interezza!). CAPITOLO 5. SISTEMI OPERATIVI E PROGRAMMI 63 Normalmente i file per essere identificati hanno un indirizzo e una lunghezza. Una identificazione troppo difficile però per essere usata da un essere umano. Ecco così che il filesystem si occupa anche di poter dare dei nomi ai file e organizzarli in “cartelle”. In poche parole il filesystem associa i nomi agli indirizzi dei file. Tale associazione è invisibile all’utente che vede solamente i nomi. I filesystem hanno anche altre funzionalità come la gestione dell’accesso ai file (alcuni utenti del sistema operativo posso leggere, scrivere, eseguire certi file mentre altri utenti no). Oppure ancora i filesystem possono avere dei sistemi per garantire l’integrità dei dati (journaling). Esistono moltissimi filesystem, quello che usa Windows per memorizzare i dati sui dischi rigidi è NTFS. Una volta veniva usato il FAT32, tutt’ora usato per qualche chiavetta USB. I filesystem basati su Linux possono usare diversi tipi di filesystem, per esempio possono usare sia NTFS che FAT32 anche se quelli più usati e “naturali” sono Ext2, Ext3 ed Ext4. Il filesystem usato per memorizzare i dati sui CD-ROM è l’ISO9660. 5.3 Esercizi • Cos’è il diritto d’autore? E il copyright? • Cos’è una licenza? • Cos’è il copyleft? • Cosa significa open source? • Cosa significa software libero? • Cosa significa software proprietario? • Fai degli esempi di software di base. Perché si chiamano così? • Cos’è un software applicativo? Fai degli esempi. • Cos’è un sistema operativo? Quali sono i suoi compiti principali? • Cos’è un filesystem?