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?