Sei sulla pagina 1di 37

Informatica

Si definisce informatica quella scienza che ha per oggetto la creazione, la memorizzazione e la


gestione di informazioni mediante procedure completamente o parzialmente automatizzate. Si
distingue in informatica teorica, che tratta dei concetti fondamentali alla base dell’elaborazione
delle informazioni, in parte dedotte dalla logica, dalla matematica e dalla cibernetica, e in
informatica applicata, che spiega come tradurre tali fondamenti in algoritmi e procedure
automatizzate elaborabili dai computer. Il termine inglese computer è oggigiorno decisamente più
utilizzato dell’equivalente italiano “elaboratore elettronico” o “calcolatore” o dell’equivalente
francese ordinateur, quindi nel prosieguo si continuerà a usare tale termine. Il computer, essendo
essenzialmente un dispositivo elettronico, fa sì che l’informatica abbia forti connessioni con
l’elettronica.
Il termine informatica è la contrazione di due parole: informazione e automatica. Esso deriva dal
termine tedesco Informatik, in quanto è stato usato per la prima volta a metà del secolo scorso dallo
scienziato tedesco Karl Steinbuch.
Per sua natura, dovendo essere elaborata da un computer, che accetta solo una descrizione numerica
dei dati (ved. “Rappresentazione di numeri e dati”), l’informazione oggetto di questa scienza è
l’informazione digitale, ovvero esprimibile mediante numeri o simboli codificati da numeri. Anche
un’immagine o un suono, se elaborati in senso informatico, dovranno essere espressi e rappresentati
da un insieme di numeri, opportunamente codificati.
Una volta rappresentata l’informazione, essa può essere elaborata da programmi espressi in
linguaggi comprensibili al computer (ved. “I linguaggi di programmazione”). Anche se spesso i due
termini dati e informazione vengono usati in modo intercambiabile, è più corretto riferirsi a dati
intendendo le informazioni elementari che il computer è in grado di elaborare, come i numeri,
caratteri (o insiemi di caratteri, detti “stringhe”), o strutture dati più complesse (vettori, matrici), e
riservare al termine informazione il significato che tali dati assumono nell’ambito dell’applicazione
informatica utilizzata. Per esempio, la sequenza di numeri
18 19 20 24 25 21 18, media=20,7
è formata da semplici dati. Se poi i numeri costituiscono la temperatura massima misurata
nell’ultima settimana, allora l’informazione è “temperatura misurata” e la media è la temperatura
media degli ultimi sette giorni. Se invece i numeri sono i voti di uno studente universitario,
l’informazione è “voti registrati” e la media è il voto medio dello studente. I dati quindi sono gli
stessi, ma l’informazione è differente. In ultima analisi, il compito del programmatore è effettuare
calcoli, applicare operatori logici o effettuare elaborazioni più complesse per generare nuovi dati e
associare a essi il significato voluto per produrre informazione.
Poiché il computer è deputato all’effettuazione dei calcoli e alla esecuzione dei programmi, esso è il
cuore di un sistema informatico, che comprende anche tutte quelle parti adatte alla memorizzazione,
alla fruizione e alla trasmissione dei dati e delle informazioni. In un sistema informatico, quindi,
troveremo molto spesso, accanto a un computer, altri dispositivi come stampanti, lettori, memorie
esterne e la connessione a una rete che consenta la trasmissione ad altri computer o dispositivi.
Nel computer si è soliti distinguere due componenti: il software e l’hardware. Tali termini saranno
chiariti in seguito. Prima però è necessario capire in che modo il computer rappresenta i dati, ovvero
i fondamenti della numerazione e del codice binario.

La rappresentazione di numeri e simboli


La rappresentazione dei numeri è basata su un sistema di numerazione, che comprende i simboli
usati e le regole per interpretarli, ovvero calcolare il valore numerico corrispondente ai simboli
usati. Ogni sistema di numerazione è identificato innanzitutto da una base, un numero intero, e da
un insieme di simboli, detti cifre. Il numero di cifre sarà sempre pari alla base.
Per esempio, gli esseri umani adottano un sistema di numerazione in base dieci, il numero delle
nostre dita, e le dieci cifre del sistema decimale sono i dieci simboli seguenti: 0, 1, 2, 3, 4, 5, 6, 7, 8,
9. Un numero è quindi rappresentato da una sequenza di cifre.
Per interpretare un numero, ovvero conoscere il suo valore a partire dalla rappresentazione in cifre,
si deve considerare la posizione che la cifra occupa nella sequenza. La posizione è letta da destra a
sinistra: quella più a destra è detta cifra meno significativa, quella più a sinistra è detta cifra più
significativa. Infatti il peso che una cifra ha nel valore del numero cresce spostandosi da destra a
sinistra. Il peso è un numero pari alla base elevata alla posizione della cifra, imponendo la posizione
zero alla cifra meno significativa.
Consideriamo il valore di un numero rappresentato in un sistema in base b da una sequenza di cifre
xyztq
la forma polinomiale corrispondente è la seguente:

q·b0+t·b1+z·b2 +y·b3+x·b4
Per esempio, il numero in rappresentazione decimale rappresentato dalla sequenza di cifre
1458
ha un valore pari a:

8·100+5·10+4·102 +1·103=8+50+400+1000.
Se l’esempio in base decimale sembra ovvio, non altrettanto risulta essere un esempio in una base
meno familiare agli esseri umani. Per esempio, in base due, si hanno solo due cifre (0 e 1). Il
numero
1010
ha un valore pari a

0·20+1·21+0·22 +1·23=2+8=10.
Nel calcolo del valore, generalmente si usa la base dieci, più familiare agli umani, e quindi di fatto
la forma polinomiale può essere usata per trasformare una qualunque rappresentazione di cui siano
noti la base e i simboli, nell’equivalente rappresentazione in base decimale.
Nel caso dell’informatica, le rappresentazioni più usate sono la quella binaria (base due, cifre 0, 1)
e la quella esadecimale (base 16), i cui simboli sono le 10 cifre decimali con l’aggiunta delle lettere
A, B, C, D, E, F. La rappresentazione esadecimale è utilizzata spesso come forma compatta della
rappresentazione binaria, in quanto, vista la relazione che lega le due basi (16 è potenza di 2),
quattro cifre decimali corrispondono a una cifra esadecimale.
La locuzione inglese binary digit (cifra binaria) viene spesso contratta in bit, quindi, in ultima
analisi, qualunque numero viene espresso come sequenze di bit (uni e zeri). Otto bit vengono
convenzionalmente indicati con il termine byte. In base alla forma polinomiale, un byte può
rappresentare al massimo (cioè tutte le cifre uguali a uno) un numero pari a 255.
Quanto visto sulla rappresentazione dei numeri nelle varie basi faceva riferimento ai numeri interi
positivi, ma. con opportune ipotesi, la rappresentazione binaria può essere estesa anche a numeri
negativi, per esempio utilizzando un bit per il segno e i rimanenti bit per il valore assoluto. Per i
numeri reali, si utilizza una rappresentazione mantissa-esponente, ovvero esprimendo un generico
numero reale r come

r=m·2e
e assegnando un opportuno numero di bit per rappresentare la mantissa m e l’esponente e. Tale
rappresentazione si indica con il termine rappresentazione in virgola mobile.
In informatica quindi si assegna un numero opportuno di byte per rappresentare i numeri. Valori
tipici sono un byte (i numeri sono detti in singola precisione) o due byte (in doppia precisione).
Se, per effetto di operazioni aritmetiche, i valori ottenuti dovessero superare il massimo numero,
oppure, viceversa, i numeri dovessero essere troppo piccoli per il minimo numero rappresentabile in
base ai byte utilizzati, si verificano errori di calcolo, rispettivamente di overflow e underflow. È
compito del programmatore scegliere i tipi numerici opportuni nei programmi per evitare errori di
questo tipo.
Il sistema binario in informatica è così importante che è diventata prassi comune sostituire la base
dieci con la base due anche nella definizione dei più comuni prefissi di multipli o sottomultipli. Per
esempio, il prefisso giga, che nel Sistema di Numerazione Internazionale corrisponde a 109, ovvero
un miliardo (per esempio, un gigawatt esprime la potenza di un miliardo di watt), nel sistema
binario corrisponderebbe a 10243, ovvero 230. In realtà, nel Sistema Internazionale, il multiplo 230
non si indica con il prefisso G (giga), ma con Gi (per gigabinary). Sfortunatamente i prefissi del
sistema binario non sono mai entrati nell’uso comune e oggi spesso si fa riferimento con il termine
del sistema SI decimale alle potenze binarie, generando una certa ambiguità. Per esempio, capita di
indicare con kbyte il valore di 1024 byte (invece di 1000 byte). Si noti che la forma corretta delle
unità di misura adotta sempre la minuscola per il nome esteso, e la maiuscola per l’abbreviazione
(tranne per kb: ved. https://it.wikipedia.org/wiki/Gigabyte).

I codici
La rappresentazione numerica binaria è un esempio di codice; infatti, si usa spesso anche la
locuzione codifica binaria), anche se i termini codici e codifica sono più generali e si riferiscono a
sistemi in grado di rappresentare una data informazione a partire da un insieme finito di simboli e
da regole di codifica. Poiché il codice utilizzato dai computer è quello binario, anche tutte le
codifiche utilizzate in informatica, in ultima analisi, utilizzano i bit per rappresentare non solo i
numeri, ma qualunque altro tipo di dato e/o informazione. Oltre ai numeri, un caso particolare è
costituito dai caratteri (le lettere dell’alfabeto, le stesse cifre, i simboli di punteggiatura ecc.). Tutto
quanto è esprimibile come una sequenza di caratteri è detto stringa.
In informatica, il codice più utilizzato è il codice ASCII (acronimo di American Standard Code for
Information Interchange). Nella formulazione originale ogni carattere esprimibile dal codice era
rappresentato da un numero a 7 bit, anche se oggi è universalmente accettata la versione estesa
(Extended-ASCII) a 8 bit.
Naturalmente, principio fondamentale di ogni codice è l’univocità del sistema, ovvero a ogni
simbolo corrisponde una e una sola rappresentazione (e viceversa). Se un dato all’interno di un
programma per computer è definito come tipo di dato carattere (e non numerico), può essere
codificato in carattere ASCII in un numero espresso da un byte. I caratteri codificati sono
sostanzialmente tutti quelli digitabili da tastiera, più alcuni caratteri non stampabili (detti di
controllo), usati spesso per la trasmissione di dati tra dispositivi differenti (per esempio, dal
computer a una stampante).
Il codice ASCII è un esempio di codifica a lunghezza fissa (tutti i caratteri sono identificati da una
sequenza di 8 bit), ma esistono anche codifiche a lunghezza variabile, come l’UFT-8 (che usa un
numero variabile di byte ed è usato nei programmi di posta elettronica) o il codice Huffman, usato
nella compressione dei dati, che si basa sulla statistica della sorgente, ovvero sulla probabilità che
un dato simbolo si presenti nella stringa da codificare.

Tipi di dati più complessi: vettori e matrici


Accanto a numeri e stringhe, esistono strutture di dati più complesse in informatica: i vettori e le
matrici. A partire da questi ultimi poi, si possono strutture più complesse che consentono di
memorizzare i dati secondo schemi ben definiti, il più delle volte suggeriti dall’informazione che si
desidera rappresentare con i dati.
Per esempio, volendo memorizzare la temperatura media di ciascun mese dell’anno per più anni, si
può creare un vettore di 12 elementi; ognuno di essi memorizza la temperatura di un mese, e ci sarà
un vettore per ogni anno. Convenzionalmente, si indica un generico elemento di un vettore con il
suo nome seguito, tra parentesi dall’indice del vettore, ovvero il numero dell’elemento. Nel nostro
esempio Anno2015(3) indica la temperatura media del mese di marzo 2015. Alternativamente, si
può definire una matrice Temperature di cento righe e dodici colonne per memorizzare tutte le
temperature a partire dall’anno 2001, per tutto questo secolo. L’elemento della matrice
Temperature(15,3) indica la temperatura media di marzo 2015.
In questo esempio si presuppongono l’utilizzo della convenzione di numerare gli indici (di riga o di
colonna) a partire da 1 e l’uso delle parentesi rotonde, ma alcuni linguaggi di programmazione
prevedono di iniziare il conteggio degli indici da 0 e l’uso delle parentesi quadre. Il vincolo
principale dell’utilizzo di vettori e matrici è che gli elementi che li compongono devono
necessariamente essere dello stesso tipo, ovvero numeri interi, in virgola mobile, stringhe ecc.
Volendo creare un tipo di dati complesso che non sia limitato da questa regola, alcuni linguaggi di
programmazione prevedono l’utilizzo di strutture, in cui i vari campi potrebbero essere di tipo
diverso, per esempio un numero intero per esprimere l’anno, una stringa per indicare il luogo della
misurazione e un vettore di dodici elementi di numeri reali per indicare la temperatura media di
ogni mese.
Compito dei linguaggi di programmazione è specificare i tipi di dati che possono utilizzare e le
convenzioni per utilizzarli. Ciò permette di identificare le variabili, che in un programma hanno
appunto il compito di rappresentare e memorizzare i dati. Si hanno quindi variabili numeriche, di
stringa, vettoriali, matriciali e strutture. Si faccia riferimento al paragrafo “I linguaggi di
programmazione” per comprendere come possono essere utilizzate le variabili all’interno di un
programma informatico.
Le strutture sono particolarmente indicate per rappresentare modelli logici di dati complessi, come
gli alberi e i grafi. Gli alberi sono infatti strutture dati gerarchiche, dove da un nodo radice si
dipartono via via archi che portano ad altri nodi. Ogni nodo può avere due o più archi che
identificano altrettanto nodi figli. Gli archi possono collegare un nodo solo al nodo genitore oppure
ai figli (se esistono). La gerarchia è dovuta al fatto che in un albero si possono identificare più
livelli. I nodi al livello più basso (cioè più lontano dalla radice) sono detti nodi foglie. Se tutti i nodi
di un albero (tranne le foglie) hanno esattamente zero o due figli, l’albero si dice binario. Una
generalizzazione dell’albero è il grafo, ove viene a mancare la limitazione che un arco possa
collegare solo i nodi ai rispettivi figli/genitori.
Un semplice esempio di albero è la struttura a menù del sito albanesi.it in cui le foglie sono i menù
a più basso livello; per esempio un percorso può essere Menù generale-Sport e giochi-Running.

L'algebra binaria
Oltre a numeri e stringhe di caratteri, in informatica si usa un altro tipo di dato, il dato logico,
ovvero un dato che può assumere solo due stati o valori: vero e falso (indicati anche con
l’equivalente numerico di 1 e 0). Le operazioni che si possono compiere su un dato di questo tipo
sono definite dall’algebra binaria, o algebra di Boole, dal nome del matematico e logico inglese
considerato il fondatore di questa branca dell’algebra. Le variabili di tipo logico sono pertanto
spesso indicate con il termine di variabili booleane.
Gli operatori dell’algebra booleana più utilizzati in informatica sono i seguenti: NOT, AND e OR.
Operatori da essi derivati sono il NAND (NOT AND), il NOR (NOT OR) e l’OR esclusivo (XOR
oppure EX-OR).
L’operatore NOT realizza la funzione logica di negazione: quindi se una variabile booleana A è
falsa, NOT(A) sarà vera e viceversa.
Se A e B sono due variabili booleane, l’espressione
A AND B
è a sua volta una variabile booleana che vale “vero” se e solo se entrambi A e B sono veri.
Generalizzando a un numero finito, ma generico, di variabili, l’AND tra esse sarà vero se tutte le
variabili sono vere. Un operatore logico può essere anche indicato dalla sua tabella della verità,
che indica, per ogni possibile combinazione dei valori delle variabili in ingresso, il risultato
corrispondente. Per un AND definito tra due variabili A e B, la tabella della verità è la seguente:

A B A AND B
0 0 0
0 1 0
1 0 0
1 1 1
Se A e B sono due variabili booleane, l’espressione
A OR B
è a sua volta una variabile booleana che vale “vero” se almeno una delle due variabili (A o B) è
vera. Generalizzando a un numero finito, ma generico, di variabili, l’OR tra esse sarà vero se
almeno una delle variabili è vera. Pertanto, per un OR definito tra due variabili A e B, la tabella
della verità è la seguente:

A B A OR B
0 0 0
0 1 1
1 0 1
1 1 1
Tra gli operatori derivati dai tre fondamentali, particolare importanza ha l’OR esclusivo (o XOR, o
EX-OR), in quanto viene definito vero se e solo se le due variabili booleane sono diverse. Pertanto è
molto utile nei confronti di stringhe, numeri ecc. La sua tabella della verità è la seguente:

A B A XOR B
0 0 0
0 1 1
1 0 1
1 1 0
Accanto agli operatori fondamentali, l’algebra di Boole prevede alcune proprietà, come la
commutativa e l’associativa, e l’importante teorema della dualità, che afferma che ogni identità
rimane vera se si eseguono le seguenti sostituzioni:
• si scambia l’operatore AND con l’operatore OR (e viceversa),
• si scambia il valore logico 0 con il valore logico uno (e viceversa).
In base al teorema di dualità, si può ricavare il teorema di De Morgan, che permette di definire
l’equivalenza delle seguenti espressioni:
NOT (A OR B)=NOT(A) AND NOT(B)
o, nell’equivalente duale:
NOT (A AND B)=NOT(A) OR NOT(B).
L’algebra booleana è alla base della programmazione, in quanto permette di identificare se una
condizione, anche complessa, è vera oppure falsa e, conseguentemente, decidere quale istruzione
mandare in esecuzione.
A ogni operatore logico corrisponde anche una porta logica, ovvero un circuito digitale che
permette di combinare tra loro segnali digitali. Le porte logiche sono alla base dei comuni circuiti
digitali, dai più semplici, come quelli che si trovano in un telecomando, fino a quelli più complessi
che si trovano sulle schede dei computer.
L'architettura degli elaboratori
I moderni computer possono differire per velocità di calcolo, memoria utilizzata, linguaggi e
programmi eseguibili, dispositivi di ingresso e uscita e altre caratteristiche. Tutti però si rifanno a un
modello di architettura ben definito, chiamato macchina di Von Neumann, dal nome del
matematico e informatico inglese che ha proposto tale modello per la costruzione di uno dei primi
calcolatori della storia dell’informatica (l’EDVAC) a metà del secolo scorso. Un’architettura di un
computer descrive quali sono le varie parti che lo compongono e in che modo collaborano per
memorizzare, eseguire i programmi e generare i risultati di tale elaborazione. I componenti
fondamentali di una macchina di Von Neumann sono i seguenti:
• CPU, o Central Processing Unit (Unità di Elaborazione Centrale, anche se si usa
universalmente l’acronimo inglese).
• Memoria (detta anche memoria di sistema o memoria RAM, dall’acronimo Random
Access Memory).
• Bus di sistema.
• Una o più interfacce di periferica. Una periferica è un’apparecchiatura che consente al
computer di scambiare informazioni con il mondo esterno, mediante operazioni di ingresso
(o lettura, verso il computer) e uscita (o scrittura), verso l’esterno.
• La memoria di massa (per esempio dischi magnetici e ottici), ovvero dispositivi esterni per
la memorizzazione permanente dell’informazione.

La CPU è il “cervello” del computer, in quanto è l’unità in grado di leggere le istruzioni di un


programma, interpretarle ed eseguirle. Nel modello di Von Neumann, questa sequenza di operazioni
(lettura–interpretazione-esecuzione) viene fatta in serie, ovvero viene eseguita un’istruzione per
volta. Un’istruzione è un’operazione elementare che può comportare il trasferimento di dati dalle
varie parti del sistema (dalla memoria alla CPU, dalla memoria a una periferica, dalla CPU alla
memoria ecc.) oppure la richiesta di eseguire un’operazione tra dati (operazioni logiche o
aritmetiche).
La memoria RAM (o memoria centrale) è un dispositivo in grado di memorizzare in modo
semipermanente (ovvero fino a che non si toglie la tensione al computer) sia i dati, sia le istruzioni
del programma. È importante sottolineare questo fatto: nella macchina di Von Neumann non esiste
una memoria separata per i dati e una per le istruzioni, ma entrambe risiedono nello stesso
dispositivo. La memoria può essere vista concettualmente come una sequenza di celle elementari, in
grado di contenere una parola (o word). La dimensione di una cella di memoria è sempre un
multiplo in potenza di due di bit: valori tipici sono 8, 16, 32, 64 bit. Una memoria può essere vista
quindi come una matrice, avente tante righe quante sono le celle (capacità della memoria) e tante
colonne quante sono i bit della parola.
La caratteristica della memoria di una macchina di Von Neumann è che il modello è in grado di
leggere il contenuto di una cella per volta, mediante l’operazione di indirizzamento: l’indirizzo di
memoria è infatti la posizione della cella, ovvero la sua posizione relativa a partire dalla prima cella.
Usando il modello a matrice, la prima riga della matrice (prima cella) ha indirizzo zero, la seconda
uno ecc. Quindi l’indirizzo non è altro che l’indice di riga della matrice. Anch’esso espresso come
numero binario, nell’operazione di indirizzamento viene copiato in un dispositivo speciale della
CPU, detto registro degli indirizzi. Un registro è un dispositivo elettronico generalmente di
capacità limitata (pochi bit o byte) in grado di memorizzare un dato binario per successive
elaborazioni. A differenza della memoria, la sua lettura e la sua scrittura sono molto più veloci e
generalmente viene utilizzato per scopi limitati e ben precisi. Per esempio, il registro degli indirizzi
contiene sempre indirizzi di memoria e il suo contenuto è usato per accedere alla memoria nella
posizione opportuna in base alla fase di lettura-interpretazione-esecuzione in atto nella CPU. La
dimensione del registro degli indirizzi identifica anche la massima dimensione di memoria che la
CPU è in grado di leggere. Infatti, se il registro degli indirizzi è a k bit, riuscirà a indirizzare al
massimo 2k parole di memoria. Siccome la dimensione del registro degli indirizzi è fissa perché è
un elemento elettronico interno alla CPU, esiste una dimensione massima della memoria che ogni
processore è in grado di gestire (leggere/scrivere).
Le operazioni che possono essere fatte sulla memoria sono due: lettura e scrittura. Lettura
significa che l’indirizzo della cella che si vuole leggere viene copiato nel registro degli indirizzi e al
termine dell’operazione il contenuto della memoria all’indirizzo voluto viene copiato nel registro
dei dati (un altro registro interno alla CPU). La scrittura è invece l’operazione opposta, ovvero il
contenuto del registro dei dati viene copiato nella cella di memoria identificata dal dato presente nel
registro degli indirizzi.
Il bus di sistema è la componente che permette la connessione e il trasferimento delle informazioni
tra le varie parti del modello. Si tratta di un insieme di fili lungo i quali si trasmettono i bit. Dal
punto di vista fisico, il collegamento è sempre presente tra tutte le componenti del modello, ma dal
punto di vista logico, in un dato istante, solo il collegamento tra due componenti – quelle che
colloquiano per scambiarsi i dati – è attivo. Tra le due unità collegate, una trasmette i dati e l’altra li
riceve, ovvero la connessione è sempre unidirezionale. È la CPU che decide come pilotare il bus di
sistema, per attivare la connessione corretta e il trasferimento dati.
Per capire come un generico programma possa essere eseguito su una macchina di Von Neumann,
occorre considerare la rigida sequenzialità con cui questa operazione viene realizzata.
Le istruzioni di un programma vengono tradotte in operazioni elementari che la CPU è in grado di
comprendere e realizzare. Tutte le operazioni elementari sono sincronizzate da un orologio di
sistema (detto clock): ogni operazione è sincrona con la cadenza del clock. Nei computer moderni,
la CPU è rappresentata dal dispositivo elettronico chiamato microprocessore e la frequenza di
clock indica appunto il numero di operazioni elementari al secondo che il microprocessore è in
grado di realizzare. Maggiore è tale frequenza (misurata in Hz, ovvero numero di cicli al secondo)
maggiore è la “velocità” della CPU. I primi computer avevano una frequenza inferiore a 1 ciclo al
secondo, mentre i moderni personal computer arrivano a frequenze di clock dell’ordine di GHz.
Le istruzioni, al pari dei dati, sono memorizzate in codice binario. Esse sono costituite da due parti:
il codice operativo e gli operandi (uno o più). Per esempio, se devo sommare due numeri, il codice
operativo sarà quello dell’operazione di “somma aritmetica” e gli operandi sono i due numeri che
voglio sommare. Ogni processore è in grado di comprendere un numero finito di istruzioni
codificate e tale insieme costituisce il set di istruzioni eseguibili. La codifica delle istruzioni e le
convenzioni per identificare gli operandi costituiscono il linguaggio macchina del computer, che
quindi è specifico per una data CPU (o, passando dall’astrazione del modello alla realtà, per un dato
microprocessore).

L'hardware
Con il termine hardware si fa riferimento a tutti i dispositivi fisici presenti in un computer. Come
visto in precedenza, CPU, registri e memoria RAM costituiscono il “cervello” del computer e sono
fisicamente posizionati sulla sua scheda madre (si usa anche spesso il termine inglese
motherboard).
A seconda delle capacità di calcolo (e quindi del numero di processori presenti nell’hardware) e di
supportare il collegamento simultaneo di più di un utente, i computer si classificano in vari tipi, di
complessità (e costo) crescente: si va dal semplice computer monoutente, come i Personal
Computer (PC), alle workstation, macchine monoutente, ma in con una maggiore potenza di
calcolo, generalmente dotate anche di notevoli potenzialità di elaborazione grafica, ai mainframe,
grandi computer in grado di supportare centinaia di utenti simultaneamente, fino ai supercomputer,
dotati di migliaia di processori, in grado di raggiungere la massima potenza di calcolo oggi
disponibile (dell’ordine di trilioni di operazioni al secondo).
Oltre all’importante gruppo di circuiti elettronici che costituisce il gruppo del/dei microprocessore/i,
nel computer si trovano altri dispositivi hardware, tra cui i principali sono le memorie secondarie e i
dispositivi di ingresso/uscita.
Come visto dalla descrizione concettuale della macchina di Von Neumann, la memoria RAM è un
dispositivo di memorizzazione non permanente, in quanto allo spegnimento del computer il suo
contenuto volatile viene perso. Per riuscire a memorizzare permanentemente dei dati, un computer
utilizza la memoria secondaria, che può essere costituita da dischi rigidi, dischi ottici (CD, DVD) e
penne USB, che hanno sostituito gli obsoleti floppy disk e nastri magnetici.
Un disco rigido è un dispositivo di tipo magnetico, ovvero riesce a memorizzare i dati binari
sfruttando la direzione del campo di magnetizzazione che si riesce a indurre su un materiale
ferromagnetico grazie al passaggio della corrente. Un disco rigido può essere schematizzato come
uno o più piatti in rotazione, disposti a formare un cilindro: sui piatti vi sono le tracce concentriche
su cui sono memorizzate le informazioni. Ogni traccia è divisa in settori, e le operazioni di lettura-
scrittura avvengono per mezzo di testine che si avvicinano (senza toccarla) alla superficie del disco.
Dati su settori contigui costituiscono dei cluster, per esempio i dati di un archivio.

Le principali caratteristiche di un disco che riguardano le sue prestazioni sono la capacità (espressa
comunemente in Gbyte o Tbyte) e il tempo di accesso, definito come il tempo necessario per
reperire un dato da un punto qualsiasi del disco. Quest’ultimo è funzione anche della velocità di
rotazione (espressa in numero di giri al secondo) del disco, in quanto, più veloce è il disco a girare,
minore è il tempo per posizionare la testina di lettura/scrittura sul settore corretto.
Oltre ai dischi rigidi interni allo chassis (ovvero la struttura fisica) del computer, esistono anche
dischi rigidi esterni, spesso dotati di alimentazione propria, che sono visti dal computer come veri e
propri dispositivi esterni collegati all’elaboratore centrale tramite una porta. Una porta è un punto
in cui fisicamente sono convogliati i fili di un canale di connessione, su cui passano i dati
(esattamente come una persona passa da una porta per entrare/uscire da un edificio). Le porte si
distinguono in seriali e parallele, a seconda del tipo di trasferimento, seriale o parallelo appunto,
dei bit durante la trasmissione dell’informazione digitale. A ogni porta è associata un’interfaccia,
che permette il collegamento effettivo tra il dispositivo collegato alla porta e il computer.
Altro supporto di memoria di massa sono i dischi ottici, ove i dati digitali vengono registrati tramite
un raggio laser. Un disco ottico è comunemente un disco piatto e sottile costituito da del materiale
in policarbonato che racchiude al suo interno un foglio metallico. A questa classe di supporti di
memoria appartengono i comuni CD, DVD e dischi Blu-ray. I CD (acronimo di Compact Disk), a
loro volta, si distinguono in CD audio (che memorizzano solo informazione audio, come brani
musicali), CD-ROM (acronimo di Read Only Memory) che, come dice il nome, possono solo
essere letti dall’utente finale, una volta che i dati sono stati scritti in fase di produzione industriale,
CD-R e CD-RW, rispettivamente scrivibili una volta o riscrivibili più volte. Le dimensioni fisiche
esterne di tali supporti sono tutte uguali, 12 centimetri di diametro e 1,2 mm di spessore. Quello che
cambia sono le modalità di lettura/scrittura (a sola lettura, a una sola scrittura o riscrivibili più volte)
e la capacità (da poco meno di un Gbyte per i CD fino a 200 Gbyte per il Blu-ray). Se confrontati
con i dischi rigidi, i dischi ottici, seppure più comodi da usare, presentano una velocità di accesso
più bassa, che viene espressa come multiplo della velocità base di 150 kbyte per secondo. Pertanto,
per un CD ottico, le velocità di trasferimento dati variano da 150 kbyte (1x), fino a (56x) 8.400
kbyte al secondo.
Infine, un dispositivo di memorizzazione di massa molto utilizzato attualmente è la penna (o
chiavetta) USB (in inglese pen drive o flash drive). Una penna USB è così detta dall’acronimo
Universal Serial Bus, ovvero lo standard di interfaccia di comunicazione seriale che ha iniziato ad
affermarsi dal 1996, anno in cui comparì la prima versione di questo standard (USB 1.0). In seguito
sono state realizzate anche le versioni successive dello standard. La differenza sostanziale fra le
varie versioni è nella velocità di trasmissione, che nella versione “base” 1.0 parte da 1,5 Mbit per
secondo, fino ad arrivare a 10 Gbit per secondo nelle versioni più recenti. Una penna USB quindi è
un dispositivo di memorizzazione che viene visto come una periferica esterna, in grado di
colloquiare con il computer mediante una porta USB. La capacità delle penne USB è sempre più in
espansione, da pochi Gbyte fino ad arrivare al Tbyte.

Le periferiche
Altri dispositivi comuni che fanno parte di un computer sono i dispositivi di input/output; fra i più
noti ricordiamo il mouse, le tastiere, le stampanti e i monitor.
Altri dispositivi degni di menzione sono lo scanner (una sorta di “fotocopiatrice” che permette di
acquisire e trasferire nel computer disegni, fotografie, immagini di testi ecc. trasformandoli in
documenti digitali; il processo di acquisizione è detto scansione o, meno elegantemente,
scannerizzazione); la webcam (videocamera di piccole dimensioni che consente di effettuare
videotelefonate o videoconferenze grazie a un collegamento Internet); il microfono (dispositivo con
il quale è possibile introdurre nel dispositivo dei suoni che, eventualmente, potranno anche essere
modificati tramite apposito software; in molti casi è collegato alla scheda audio e può essere
integrato a un paio di cuffie o a una webcam) e gli altoparlanti (dispositivi che permettono di
percepire i suoni provenienti dal computer attraverso il collegamento con delle casse acustiche
all’uscita della scheda audio).
Tali dispositivi vengono anche denominati periferiche, intendendo la loro non appartenenza al
cuore centrale dell’elaboratore, anche se senza di essi verrebbe a mancare ogni interazione uomo-
macchina.

Il mouse
Il mouse (termine inglese che significa topo) è un dispositivo di input che consente all’utente di
puntare e controllare il cursore (o puntatore, il simbolo che appare sullo schermo del computer e
indicante la posizione in cui viene inserito il testo digitato sulla tastiera o sul quale ha effetto la
pressione dei pulsanti del mouse o di altre periferiche che possano controllarlo) inviando al sistema
comandi di vario tipo (apertura di una cartella o di un collegamento ipertestuale, esecuzione di un
programma ecc.). Quando il mouse viene spostato su una superficie piana (per esempio il
mousepad, o tappetino), il cursore si muove conseguentemente e assume forme diverse a seconda
dell’operazione che si sta eseguendo (scrittura di un testo, apertura di un link ecc.).
Un mouse standard è generalmente dotato di due pulsanti (destro e sinistro) e di una rotellina
centrale di scorrimento che talvolta funge anche da terzo pulsante.
La tastiera
La tastiera (keyboard in lingua inglese) è una periferica di input che serve a sia inserire
manualmente dati (numerici oppure alfanumerici) nella memoria del computer sia a inviare
comandi a quest’ultimo.
La tastiera può essere una periferica esterna oppure incorporata direttamente nell’unità centrale del
computer (come nel caso, per esempio, dei computer portatili, più comunemente detti notebook).
Nel caso la tastiera sia una periferica esterna, il collegamento con l’elaboratore elettronico può
essere cablato (tramite un cavo che può avere un collegamento USB, PS/2 o di altra natura) oppure
senza fili (wireless).
La tastiera può anche essere “virtuale”; in questo caso, essa non esiste fisicamente, ma compare
direttamente sullo schermo del dispositivo utilizzato (è il caso, per esempio di smartphone, tablet e
altri dispositivi touchscreen).
Visivamente, una comune tastiera si presenta come una serie ordinata di tasti (generalmente poco
più di 100) sui quali sono riportati vari tipi di segno grafico (lettere dell’alfabeto, caratteri speciali,
segni di punteggiatura, abbreviazioni di comandi ecc.). Ogni volta che un tasto viene premuto, il
computer effettua una conversione/associazione del segno grafico in formato digitale.
Alcuni tasti riportano un solo segno grafico, in altri, invece, ne sono presenti due o anche tre; in
questi ultimi due casi, la scelta del segno grafico viene effettuata tramite la pressione
contemporanea di un determinato tasto-funzione.
Esistono diversi schemi per la disposizione dei tasti delle tastiere alfanumeriche; il più
comunemente utilizzato è lo schema QWERTY (il termine deriva dalla sequenza delle lettere dei
primi sei tasti della prima riga della tastiera che contiene le lettere dell’alfabeto).

Virtualmente possiamo suddividere la tastiera in 5 zone: tasti alfanumerici, tasti di spostamento,


tasti di controllo, tasti funzione e tastierino numerico.
La zona dei tasti alfanumerici è quella centrale ed è la più estesa; questi tasti permetto di digitare le
lettere dell’alfabeto, i segni di punteggiatura, i numeri e vari simboli; la zona dei tasti di
spostamento è quella che comprende i tasti che vengono di norma usati per spostarsi all’interno dei
documenti o per effettuare alcune modifiche; nella zona dei tasti di controllo sono presenti invece
quei tasti che, usati da soli o in combinazione con altri, consentono lo svolgimento di particolari
operazioni; la zona dei tasti funzione (contrassegnati da una F seguita da un numero che va da 1 a
12) è quella in cui si trovano quei tasti che permettono lo svolgimento di funzioni di vario tipo a
seconda del software che si sta utilizzando; la zona del tastierino numerico, infine, è quella che
serve a digitare i numeri e i vari simboli aritmetici
Da tempo in commercio sono presenti tastiere che, oltre ai tasti standard, prevedono la presenza di
tasti dedicati o personalizzabili che servono a svolgere vari tipi di operazione (controlli
multimediali, apertura di determinati programmi ecc.).

La stampante
La stampante (printer in lingua inglese) è una periferica di output del computer che serve a
effettuare la stampa di dati (testi o immagini) su carta di vario tipo e altri supporti (lucidi per
presentazioni, CD e DVD stampabili, tessuti ecc.).
Il collegamento di una stampante al computer può avvenire con varie modalità; per esempio tramite
cavo USB (il collegamento attualmente più comune), cavo di rete, porta parallela (collegamento
ancora esistente, ma ormai obsoleto) o collegamento wireless (senza fili).
Fra le varie caratteristiche di una stampante si devono soprattutto ricordare la risoluzione (che
generalmente viene espressa in punti per pollici (DPI, dots per inch) e la velocità di stampa
(espressa di solito in pagine per minuto o per caratteri al secondo).
Si possono distinguere essenzialmente due categorie di stampanti: a impatto e senza impatto.
Alla prima categoria appartengono le stampanti a matrice di aghi e quelle a caratteri; queste
ultime, ormai obsolete, hanno un funzionamento che è simile a quello delle macchine per scrivere;
sono infatti dotate di un nastro con i caratteri che vengono prima spinti contro un nastro inchiostrato
e poi sulla carta; quelle a matrice di aghi, invece, sono dotate di un certo numero di aghi che
spingono il nastro inchiostrato sulla carta. I limiti principali delle stampanti a impatto sono la
lentezza e, soprattutto, la limitatezza di ciò che può essere stampato (grafica praticamente assente e
font fissi). Per quanto surclassate dalle stampanti senza impatto, le stampanti a matrice di aghi sono
ancora utilizzate a scopi aziendali.
Le stampanti della seconda categoria sono caratterizzate dal fatto che riescono a creare la stampa
senza che il meccanismo tocchi la carta. Si possono distinguere: stampanti a getto d’inchiostro (le
cosiddette ink jet), stampanti laser e stampanti termiche.
Le ink jet hanno dei piccoli fori che spruzzano l’inchiostro liquido sulla carta generando la stampa;
le stampanti laser, invece, funzionano in modo diverso in quanto incollano l’inchiostro secco (il
cosiddetto toner) sulla carta tramite carica elettrostatica.
Le stampanti termiche sono suddivise in due tipologie: stampanti a trasferimento termico (TT) e
stampanti termiche dirette (DT). In entrambi i casi la testina di stampa scalda i punti dove deve
avvenire il trasferimento termico del simbolo. Nelle stampanti TT la testina riscalda un nastro
carbongrafico che trasferisce il colore sul sottostante supporto di stampa (carta, tessere magnetiche,
badge ecc.); nelle stampanti DT non si utilizza un nastro carbongrafico, bensì etichette in carta
termica (etichette per uso commerciale, scontrini ecc.) che reagisce al calore emanato dalla testina
di stampa colorando il supporto di stampa; le stampanti termiche dirette non danno la possibilità di
scegliere il colore (stampano solo il nero).
Relativamente ai colori, si distinguono stampanti monocromatiche (impiegano un solo colore, di
norma il nero), tricromatiche (utilizzano giallo, ciano e magenta), quadricromatiche (giallo,
ciano, magenta e nero) ed esacromatiche (oltre ai quattro colori previsti per le quadricromatiche
sono presenti anche due tinte più chiare di ciano e magenta).
Un cenno va alle cosiddette stampanti 3D (tridimensionali), dispositivi che consentono di
riprodurre in tre dimensioni oggetti di varie fogge e dimensioni. Sono basate su una serie di testine
disposte opportunamente dalle quali viene estruso il materiale (generalmente una resina) che
costituirà l’oggetto finito.

Il monitor video
Il monitor video (spesso anche semplicemente schermo o video) è una periferica che permette la
visualizzazione di tutte quelle informazioni che vengono generate dalla scheda video del computer.
Nel caso dei PC, il monitor video è una periferica esterna all’unità centrale, mentre nel caso dei
computer portatili (notebook) risulta incapsulata a essa.
Si possono essenzialmente distinguere due tipologie di monitor video: i CRT (Cathode Ray Tube,
tubo a raggi catodici), ormai in disuso, e gli LCD (Liquid Cristal Display, schermo a cristalli
liquidi).
Il collegamento fra il computer e il monitor video può essere effettuato attraverso cavi di diverso
tipo; i più conosciuti sono il VGA (Video Graphics Array), sempre meno utilizzato, l’USB
(Universal Serial Bus), il DVI (Digital Visual Interface), il DisplayPort e l’HDMI (High-
Definition Multimedia Interface); quest’ultimo è attualmente lo standard per quanto concerne le
moderne schede video.
Le principali caratteristiche di un monitor video sono la sua dimensione, la sua risoluzione e la
frequenza di refresh.
La dimensioni dello schermo viene definita facendo riferimento alla lunghezza in pollici (“) della
diagonale dal vertice più basso al vertice opposto più alto dello schermo. Fino a pochi anni fa,
buona parte dei computer utilizzava schermi da 14″, mentre adesso si è passati a dimensioni
maggiori (17″, 21″, 24” ecc.). La dimensione dello schermo non è direttamente legata alla qualità
della sua risoluzione.
La risoluzione corrisponde al numero di pixel, orizzontali e verticali, di cui si compone lo schermo.
I pixel sono elementi puntiformi di dimensioni ridottissime; praticamente, ciò che vediamo sul
monitor video di un computer è paragonabile a un mosaico fatto di tantissimi puntini colorati che
danno vita alle immagini. Quanto più la risoluzione è alta, tanto più la qualità delle immagini sarà
migliore. Un monitor video con una risoluzione di 1920×1080 pixel è composto da 2.073.600 pixel.
Risoluzioni più elevate permettono la visualizzazione di un maggior numero di elementi sullo
schermo dove risulteranno più piccoli e più nitidi rispetto a quelli visualizzati su un monitor con una
risoluzione più bassa. I sistemi operativi di un computer consentono, entro certi limiti, di variare la
risoluzione dello schermo per poterla adattare alle varie esigenze dell’utente.
La frequenza di refresh (spesso anche indicata con i termini inglesi refresh rate), che viene misurata
in hertz (Hz), è invece il numero di volte al secondo in cui lo schermo “accende” ogni singolo pixel;
maggiore è la frequenza di refresh e più stabili e fluide sono le immagini. Una frequenza di refresh
troppo bassa dà luogo al cosiddetto “sfarfallio”. La gran parte dei monitor LCD ha un refresh rate di
60 Hz, ma vi sono anche schermi con refresh rate più elevati.

I linguaggi di programmazione
Come visto descrivendo il funzionamento della CPU, un computer è in grado di comprendere le
istruzioni di un programma solo se queste sono espresse in linguaggio macchina, ovvero
opportunamente tradotte in codice binario.
Un livello più complesso di linguaggio di programmazione è costituito dai linguaggi assembly, in
cui le variabili sono identificate da nomi e i codici delle istruzioni da stringhe di caratteri invece che
da numeri. Per tradurre un programma scritto in assembly nel relativo codice eseguibile dalla CPU
è necessario usare un assemblatore, che effettui la “traduzione” da un linguaggio all’altro. Tuttavia,
i linguaggi macchina e assembly, oltre che essere dipendenti dal microprocessore, sono molto
lontani dalla modalità in cui un programmatore “umano” è portato a pensare e lavorare. Per questo
motivo, nella seconda metà del secolo scorso sono nati i linguaggi ad alto livello, così chiamati
perché il programmatore non deve preoccuparsi delle peculiarità del microprocessore su cui il
programma verrà eseguito.
Per passare alla programmazione ad alto livello è necessario quindi introdurre una certa astrazione
nella definizione delle variabili, nell’accesso alla memoria e nella realizzazione di operazioni
aritmetiche logiche. Inoltre, nei linguaggi ad alto livello, sono stati introdotti particolari costrutti di
controllo per effettuare cicli iterativi e test. I costrutti di controllo permettono di combinare assieme
istruzioni elementari per creare blocchi di codice strutturati in cui il programmatore può facilmente
controllare il flusso dell’esecuzione.
Anche in questo caso, per tradurre un programma da un linguaggio ad alto livello al linguaggio
macchina è necessario utilizzare un programma ad hoc, che può essere un compilatore o un
interprete. Concettualmente sono simili a un assemblatore, ma sono molto più complessi perché,
mentre esiste una corrispondenza uno-a-uno tra le istruzioni in assembly e le relative istruzioni in
linguaggio macchina, nel caso dei linguaggi ad alto livello, una singola istruzione può corrispondere
a parecchie istruzioni a livello più basso del microprocessore.
La differenza fondamentale tra un compilatore e un interprete è che il primo esegue la traduzione di
tutto il codice sorgente in una volta sola generando il codice oggetto che poi si può eseguire, mentre
nell’uso dell’interprete, la traduzione viene fatta istruzione per istruzione e seguita dalla sua
esecuzione, quindi, nel caso dell’interprete, traduzione ed esecuzioni sono operazioni che si
susseguono di volta in volta e al termine non esiste una generazione di un codice oggetto. Volendo
mandare in esecuzione il programma con l’interprete, è necessario quindi effettuare di nuovo la
traduzione. Per questo motivo, l’uso dell’interprete è meno efficiente e in generale più lento
dell’utilizzo di un compilatore.
L’utilizzo di compilatori e interpreti non solo semplifica il lavoro al programmatore, ma consente di
utilizzare linguaggi ad alto livello che non sono dipendenti dall’architettura della CPU utilizzata. I
programmi scritti in linguaggi ad alto livello hanno una maggiore semplicità di sviluppo, di debug
nonché maggiori portabilità e semplicità di manutenzione. Il termine debug è un termine tecnico
che deriva dall’inglese to debug, (mettere a punto, eleminare gli errori), ovvero togliere i bachi, o
bug, del programma. La fase di debug è fondamentale per assicurarsi che il programma sviluppato
sia esente da errori, non solo sintattici (legati al linguaggio usato), ma anche da errori run-time,
ovvero malfunzionamenti che si verificano in fase di esecuzione. Gli errori run-time possono essere
generati da molteplici cause: errate letture di dati, situazioni di overflow o underflow, errata
allocazione di memoria o altre situazioni non previste dal programmatore nelle fasi iniziali dello
sviluppo del software e che portano a un comportamento del programma non aderente alle
aspettative e alle specifiche prefissate.
Per quanto riguarda la portabilità, un programma scritto in linguaggio ad alto livello (indicato con
codice sorgente) può essere mandato in esecuzione su computer diversi, a patto di utilizzare
l’opportuno compilatore (che genera il codice oggetto). Nella scrittura di programmi ad alto livello,
il programmatore può anche usare più volte porzioni di codice, riutilizzandolo sotto forma di
chiamate a funzioni o routine.
I linguaggi ad alto livello si distinguono in due grandi classi: linguaggi imperativi e linguaggi
dichiarativi (anche detti funzionali). I primi comprendono la maggior parte dei linguaggi
strutturati utilizzati attualmente per sviluppare software, come il linguaggio C, il Pascal, i linguaggi
a oggetti o i linguaggi paralleli. I linguaggi funzionali comprendono il linguaggio Lisp e il Prolog.
Nei linguaggi imperativi, il modello di programmazione si basa sul paradigma di cambiamento di
stato della memoria del computer. Se si effettua la somma di due variabili e si assegna il risultato in
una terza, per esempio:
A=B+C
tale operazione può essere vista come il cambiamento di una cella di memoria dove viene
memorizzata la variabile A. Un programma scritto in un linguaggio imperativo può essere visto
come una successione di stati (cambiamenti della memoria) che porta a uno stato finale (l’esito
complessivo del programma).
Un linguaggio di tipo funzionale invece è basato su un insieme di funzioni o relazioni e
l’elaborazione consiste nella valutazione delle relazioni esistenti tra entità diverse (per esempio
postulati logici o booleani) mediante il calcolo di tali funzioni matematiche. I linguaggi funzionali
sono propri dell’intelligenza artificiale.
Un’importante ulteriore suddivisione tra i linguaggi imperativi individua la classe dei linguaggi di
programmazione a oggetti (C++ o Java), in cui la programmazione avviene utilizzando il modello
astratto delle classi, ovvero oggetti software (porzioni di codice) in grado di scambiarsi
informazioni sotto forma di messaggi. Caratteristiche di un linguaggio a oggetti sono
l’incapsulamento (ovvero in una classe si distingue chiaramente l’interfaccia, verso altri oggetti, e
il suo stato interno), l’ereditarietà (una classe può essere definita a partire da un’altra classe di cui
eredita le caratteristiche) e il polimorfismo (la stessa porzione di codice può essere usata all’interno
di classi diverse).
Oggigiorno esistono molti linguaggi di programmazione ad alto livello, e una distinzione
ragionevole è per quale tipo di applicazione si vuole sviluppare il software. Come indicazione di
massima, si può pensare di utilizzare i linguaggi Fortran o C per il calcolo scientifico, Prolog, Lisp,
C per l’intelligenza artificiale, Cobol, o C per le applicazioni gestionali, C++, Visual C o Visual
Basic per applicazioni grafiche o pittoriche (anche dette applicazioni visuali) e linguaggi Java,
PHP o ASP per applicazioni web.
I programmi in linguaggio ad alto livello, come pure i relativi codici oggetto e i dati, vengono
memorizzati in file. Un file è infatti un’astrazione logica con cui, mediante un nome e una sua
posizione (percorso al file), si può accedere a un insieme di dati presenti sulle memorie di massa
del sistema. Tali dati rappresentano il contenuto del file. Nei moderni sistemi, i file sono
organizzati in modo gerarchico in directory (contenitori di file che possono essere via via contenuti
uno nell’altro in modo nidificato).

Costrutti di controllo
Nella programmazione informatica è molto importante comprendere i principali costrutti di
controllo che permettono di modificare o controllare il flusso sequenziale delle istruzioni in base a
precise condizioni impostate dal programmatore. I costrutti di controllo sono definiti
indipendentemente dal linguaggio di programmazione ad alto livello utilizzato e a ognuno di essi
corrispondono generalmente una o più istruzioni definite dalla sintassi del linguaggio stesso.
I principali costrutti di controllo si distinguono in iterativi e di selezione. I costrutti iterativi
permettono di scrivere una volta sola un’istruzione (o un blocco di istruzioni), che viene ripetuta per
più volte, costituendo quindi un ciclo di istruzioni. Il numero di volte che un ciclo viene ripetuto
dipende dalle condizioni specificate nel costrutto. I principali costrutti di controllo iterativi sono il
ciclo do-while e il ciclo for.
while (condizione)
(istruzione)
 Ove il blocco istruzione viene ripetuto fino a che la condizione è soddisfatta. Ovvero, la condizione
viene verificata all’inizio di ogni ciclo: se la condizione è verificata, il blocco istruzione viene
eseguito, altrimenti il controllo dell’esecuzione del programma esce dal ciclo e si passa
all’istruzione successiva a quella iterativa. Una variante è il do:
do (istruzione)
while (condizione)
A differenza del precedente, il blocco istruzione viene eseguito almeno una volta, prima della prima
verifica della condizione. Il ciclo for è un costrutto più flessibile che permette di specificare una
condizione iniziale, come essa si modifica da un ciclo all’altro, e la condizione finale che provoca
l’uscita dall’iterazione. Il ciclo for è quindi definito come:
for (inizializzazione);(condizione);(incremento)
(istruzione)
ove l’inizializzazione viene eseguita una sola volta all’inizio del primo ciclo, e istruzione viene
eseguita fino a che la condizione non si verifica, e da un ciclo a quello successivo si effettua
l’incremento. Per esempio, volendo sommare, elemento per elemento, due vettori a e b, ponendo il
risultato in un vettore c, si può scrivere:
for (i=0; i<10; i=i+1)
c[i]=a[i]+b[i]
In questo semplice esempio, l’inizializzazione consiste nel porre l’indice a zero indicando che si
vuole partire dal primo elemento dei vettori, la condizione esprime il concetto che si è arrivati alla
fine degli elementi che si vuole sommare, e l’incremento esprime il concetto che da un ciclo
all’altro ci si sposta di un elemento al successivo. L’istruzione è costituita dalla vera e propria
operazione di somma e inizializzazione del terzo vettore che conterrà il risultato.
Infine, importante costrutto di programmazione non iterativo, ma di selezione, è if-then-else:
if (condizione) then
(istruzione1) else
(istruzione2)
In questo caso non c’è alcuna iterazione, ma il costrutto permette di eseguire un blocco di istruzioni
o un altro a seconda che la condizione sia verificata oppure no. Nel primo caso si esegue il blocco
istruzione1, altrimenti il blocco istruzione2. La parte else istruzione2 è opzionale e può mancare; in
questo caso, se la condizione non è verificata, non si esegue nulla e si passa all’istruzione
successiva al costrutto if-then.
Usando le istruzioni di controllo elementari fin qui viste, è possibile scrivere in un linguaggio ad
alto livello un programma in grado di realizzare qualunque algoritmo.

Gli algoritmi
Il termine algoritmo deriva dal nome del matematico persiano che per primo ne definì il significato.
Si tratta di un concetto fondamentale dell’informatica, anche se non ne esiste in realtà una
definizione ben precisa. Si può indicare, infatti, con il termine algoritmo, un generico procedimento
che permette, a partire da dati (o condizioni iniziali), in un numero finito di passi, di raggiungere il
risultato voluto.
Un algoritmo, di per sé, non viene espresso in un particolare linguaggio di programmazione:
piuttosto, è una descrizione del tutto generale dei vari passi e della loro corretta sequenza, che
occorre compiere per arrivare a un determinato risultato. Una volta definito e descritto
opportunamente un algoritmo, si può pensare di tradurlo in un programma mediante una codifica in
un linguaggio ad alto livello. Per esempio, si può parlare di un algoritmo per ordinare gli elementi
di un vettore, oppure per determinare quali sono i primi 100 numeri primi. Gli algoritmi più comuni
possono essere classificati in algoritmi di ordinamento, di ricerca, genetici, di compressione ecc.
Per definire in modo formale un algoritmo si può fare riferimento al modello matematico astratto
della macchina di Turing (dal nome del matematico inglese che nel secolo scorso definì tale
concetto). Si tratta di una macchina ideale, in grado di leggere e manipolare i dati che scorrono su
un nastro infinito, in base a regole prefissate. Le operazioni che la macchina di Turing è in grado di
fare sono: cambiamento del suo stato interno, lettura o scrittura su nastro, spostamento della testina
di lettura/scrittura su nastro di una posizione.
Per definire in modo formale un algoritmo, si indica come algoritmo una qualsiasi elaborazione che
può essere portata a termine sulla macchina di Turing. Le caratteristiche che deve avere la
descrizione di un algoritmo sono le seguenti:
• deve essere costituito da un numero finito di passi.
• I passi devono essere elementari, ovvero non scindibili in operazioni più semplici.
• La loro interpretazione deve essere univoca, ovvero non deve dar luogo ad ambiguità.
• L’esecuzione deve avvenire in un tempo finito.
• Il risultato deve essere univoco.
Di notevole importanza assume in informatica anche lo studio della complessità degli algoritmi,
che tende a stimare come si modificano il tempo di esecuzione di un algoritmo e/o la sua
occupazione di memoria, al crescere della complessità del problema. Per esempio, un algoritmo di
ordinamento di un vettore di numeri avrà una complessità espressa in funzione del numero di
elementi del vettore che devono essere ordinati.

Il sistema operativo
Il termine software indica l’insieme di programmi che possono essere elaborati da un dato
computer. Si è soliti fare una grande distinzione tra il software del sistema operativo e il software
applicativo.

Il sistema operativo
Il sistema operativo è un insieme di programmi di particolare importanza perché ha il compito di
gestire tutte le risorse hardware del sistema (CPU, memoria, dispositivi periferici ecc.) e fornire i
servizi di base ai programmi applicativi in modo che essi possano essere eseguiti. Senza un sistema
operativo installato, un computer è di fatto inutilizzabile, perché i programmi applicativi non
riuscirebbero a usare la CPU, i dischi, le periferiche e la rete.
Un sistema operativo si dice monoutente o multiutente, a seconda che uno solo o più utenti si
possano collegare al computer e utilizzarne le risorse. Il sistema operativo vede tutti gli altri
programmi in esecuzione sulla CPU come processi.
Un processo, a sua volta, può essere distinto in vari thread, porzioni di codice in esecuzione che
non possono essere ulteriormente suddivise. I thread appartenenti a uno stesso processo possono
condividere spazi di memoria o informazioni di stato in modo da poter comunicare informazioni.
Un sistema operativo multi-thread può ammettere anche l’esecuzione in parallelo (concorrente) di
più thread.
Un sistema operativo è costituito da diverse parti, ovvero da diversi insiemi di routine. Il kernel del
sistema operativo è la parte fondamentale per la gestione di tutte le risorse del microprocessore. Tali
routine sono le più importanti e sono dotate del massimo livello di privilegio del sistema (detto
appunto livello kernel).
Il gestore della memoria consente la gestione della memoria fisica e la realizzazione della
memoria virtuale. La locuzione memoria virtuale indica il fatto che la CPU può vedere uno spazio
di indirizzamento molto più ampio della memoria fisica, mediante l’utilizzo di più pagine di
memoria virtuale che vengono continuamente copiate nella memoria fisica per far sì che la CPU
possa accedere ai dati. Con questo “trucco”, il sistema operativo è in grado di simulare la presenza
di una memoria molto più capace rispetto a quella fisicamente presente nell’hardware del sistema.
Lo scheduler è un altro importante componente del sistema operativo che decide quale, tra tutti i
processi del sistema in attesa di essere eseguito, può fisicamente accedere alla risorsa CPU.
Il file system è la parte del sistema operativo che permette di accedere ai file memorizzati su disco
o su ogni altro dispositivo di memorizzazione di massa installato nel sistema.
Lo spooler di stampa è invece quell’insieme di routine che consente di trasferire dati e comandi
alla stampante collegata al sistema.
Infine, l’interfaccia utente (indicata anche dal termine inglese shell, guscio, perché è la parte più
esterna del sistema) è l’insieme di routine che consente l’interazione del sistema con l’utente, e
comprende per esempio tutte le routine per far apparire sullo schermo una console di lavoro.
Oggigiorno, la forma più familiare di interfaccia utente è quella grafica, in cui, su una scrivania
virtuale (detta desktop), file e directory sono raffigurati da cartelle e i comandi non si digitano
direttamente da tastiera con un’interfaccia da linea di comando, ma sono scelti con il mouse da una
lista (menu).

Il software applicativo
Il software applicativo viene definito per differenza rispetto al sistema operativo (detto anche
software di base), in quanto è costituito da tutti i programmi, sviluppati nei vari linguaggi, che non
fanno parte del sistema operativo del computer. Una classe particolarmente importante, con
l’avvento dei Personal Computer, è il cosiddetto software per la produttività personale, che
comprende i programmi come gli elaboratori di testi, i fogli di calcolo, i programmi per la posta
elettronica.
Un elaboratore di testi permette di memorizzare in un file un documento testuale, al cui interno è
però possibile inserire oggetti più complessi, come immagini, tabelle, grafici, istantanee di
schermate ecc. I moderni elaboratori di testi possiedono anche caratteristiche avanzate, come la
correzione ortografica e grammaticale in più lingue e la possibilità di esportare il file di testo in altri
formati, utili per scambiare informazioni tra programmi applicativi diversi o generare versioni del
documento più adatte ad altri scopi o ambienti, come la stampa o la pubblicazione sul Web.
I fogli di calcolo (detti anche fogli elettronici), invece, consentono di inserire e organizzare in un
file dati testuali e/o numerici, con la classica struttura tabellare di righe e colonne. La peculiarità di
un foglio elettronico è che la cella può contenere anche formule, per esempio la formula che indica
che il contenuto della cella deve essere la somma dei contenuti di un gruppo di celle. In tal modo è
possibile simulare situazioni molto complesse: variando i dati di una cella varieranno tutti i valori a
essa collegati; per esempio, si possono realizzare modelli economici e simulare cosa accadrebbe al
mutare del valore di certe variabili. Accanto alle più semplici funzioni di ordinamento dei dati e alla
visualizzazione in forma grafica, alcuni fogli elettronici prevedono la possibilità di usare funzioni
statistiche complesse, filtrare (ovvero selezionare) i dati secondo particolari criteri specificati
dall’utente o proteggere i documenti con password.
I software di posta elettronica sono generalmente programmi client che si connettono a server di
posta elettronica per leggere i messaggi inviati all’utente presso una o più caselle di posta
elettronica e per inviare messaggi ad altri utenti.
Molti programmi differenti di produttività personale sono spessi riuniti in pacchetti completi, che
vengono detti suite (per esempio la Suite di Office).
Per quanto riguarda il diritto di utilizzare i programmi dei software applicativi, si distinguono due
grandi classi: software proprietario, ovvero commercializzato da aziende informatiche e il cui
utilizzo è subordinato all’acquisto di licenze d’uso, e software libero, molte volte anche gratuito,
che l’utente è libero di installare, ma anche modificare e ridistribuire a sua volta.

Database o basi di dati


Un caso particolare di strutturazione di dati digitali sono i database (o anche basi di dati). Si tratta
di archivi di dati fortemente strutturati, ovvero in cui i dati sono memorizzati e modellizzati con
strutture standard predefinite, in base a un modello logico ben preciso. In base a tale modello, si
distinguono i database gerarchici, in cui i dati sono memorizzati in strutture logiche ad albero, e i
database relazionali, in cui il modello logico è la relazione (o tabella). Questi ultimi sono di gran
lunga i più diffusi, ed esempi sono i prodotti commerciali più comuni, come Access, Oracle o DB2.
Una relazione è un modello di dati in cui essi sono strutturati secondo una tabella di righe e
colonne. Le colonne sono dette attributi, e le righe sono dette tuple. Un semplice esempio di
relazione può essere il seguente: una relazione Impiegati è definita con cinque attributi: Numero
matricola, Cognome, Nome, Indirizzo, Città. In base a questa struttura, un esempio di relazione
Impiegati è il seguente:

Numero_matricola Cognome Nome Indirizzo Città


01232456 Rossi Mario Via Puccini 3 Pavia
12348900 Bianchi Maria Via Verdi 8 Milano
12398768 Verdi Susanna Via Mascagni Parma
12309876 Rossi Mario Via Leoncavallo Livorno
Come si vede dall’esempio, ogni tupla rappresenta tutta l’informazione relativa all’entità Impiegato.
Alcuni valori di attributi possono essere uguali (nell’esempio il cognome Rossi), ma i dati relativi a
ogni Impiegato devono poter essere univocamente identificati. Per questo ogni relazione ha una
chiave primaria, ovvero un attributo che non può assumere un valore nullo e che è univoco (cioè
non ripetuto) su tutte le tuple. Nell’esempio, si usa il campo Numero_matricola come campo chiave
primaria, presupponendo che nella propria base di dati non esistano due impiegati con lo stesso
numero di matricola.
Le informazioni di tabelle diverse possono essere messe in relazione le une alle altre, mediante
attributi comuni. Per esempio, una seconda tabella chiamata Mansione memorizza, per ogni
impiegato, in quale divisione opera:

Numero_matricola Divisione
01232456 Anagrafica
12348900 Portineria
12398768 Vendite
12309876 Vendite
A tale scopo, si definisce la chiave primaria Numero_matricola, specificando che è una chiave
esterna, ovvero che fa riferimento a un altro attributo chiave di un’altra tabella. Il modello logico di
un database relazionale prevede anche l’esistenza di vincoli di integrità, che permettono di evitare
che si inseriscano informazioni incoerenti nella base di dati. Per esempio, se la tabella Mansione
contenesse un numero di matricola che non esiste nella tabella Impiegati, ciò violerebbe un vincolo
di integrità tra chiave primaria ed esterna, in quanto non sarebbe possibile sapere chi è l’impiegato
in questione e risalire a tutti i suoi dati. I vincoli sono definiti in particolare sulle chiavi primarie o
su tutti gli altri attributi per cui devono sussistere limitazioni relative a definizione, utilizzo e
inserimento/cancellazione.
L’insieme di tutte le routine che consentono di definire la struttura logica dei dati, le loro
memorizzazione, lettura e scrittura e i vincoli associati costituisce un particolare software che va
sotto il nome di DBMS (Database Management System). L’operazione fondamentale che si può
compiere su un oggetto di un Database è la transazione, un’operazione atomica (cioè non
ulteriormente suddivisibile) di lettura o scrittura di un dato all’interno del database.
Per effettuare le transazioni di un database relazionale si utilizza uno standard di linguaggio ad alto
livello detto SQL (Structured Query Language). Il termine query indica infatti l’operazione più
comune che un utente può fare in un database, e il termine inglese query viene generalmente
preferito a quello italiano (interrogazione) in quanto non indica solo la semplice lettura, ma una
serie di altre operazioni. Infatti, mediante il linguaggio SQL è possibile:
• interrogare la banca dati. Questa parte di SQL si definisce DQL, ovvero Data Query
Language;
• creare e modificare i modelli logici del database, ovvero le strutture delle sue tabelle. Questa
parte di SQL si definisce DDL, ovvero Data Definition Language;
• inserire, modificare e gestire dati memorizzati. Questa parte di SQL si definisce DML,
ovvero Data Manipulation Language;
• creare e gestire strumenti di controllo e accesso ai dati, per esempio per la definizione di
vincoli o la limitazione di accesso per la sicurezza. Questa parte di SQL si definisce DCL,
ovvero Data Control Language.
L’SQL è un linguaggio testuale molto semplice e intuitivo. Per esempio, la query che consente di
recuperare tutte le informazioni relative all’impiegato “Bianchi Maria” è la seguente:
SELECT *
FROM Impiegati
WHERE Cognome = “Bianchi” AND Nome = “Maria”;
dove il simbolo * è un’abbreviazione per indicare “seleziona tutti gli attributi”, e le parole SELECT,
FROM e WHERE sono clausole del linguaggio standard SQL.
La grande diffusione del linguaggio SQL è dovuta, oltre alla sua facilità di utilizzo e alla sua
standardizzazione (il che significa che le clausole sono sempre le stesse, a prescindere
dall’implementazione commerciale del database), anche alla possibilità di richiamare query in SQL,
da parte di porzioni di codice in altri linguaggi di programmazione, per esempio per effettuare
l’accesso a un database in rete mediante una pagina web.
L’evoluzione della tecnologia e dei linguaggi per i database sono stati due aspetti fondamentali che
hanno permesso che l’informatica “invadesse” tutti i principali settori produttivi e dei servizi: senza
i database e gli strumenti per la loro gestione non sarebbe possibile oggi effettuare una prenotazione
di un albergo, consultare l’estratto conto dalla propria banca o iscriversi a un corso on line.
Negli ultimi anni si sono sviluppati anche database non relazionali che hanno come modello logico
le tabelle, ma senza i vincoli di integrità classici dei database relazionali, oppure modelli diversi
come documenti, mappe, alberi e grafi. Tali database sono detti database No-SQL, in quanto non
basandosi sulla struttura logica della relazione, non utilizzano il linguaggio SQL per l’accesso e la
definizione dei dati. Tali database sono particolarmente utilizzati per memorizzare le informazioni
dei social network e dei motori di ricerca. Esempi più comuni sono Neo4j (per database a grafo,
sviluppato interamente in Java) e BigTable (usato da Google). Tali database No SQL, pur
rinunciando ai controlli di integrità dei database relazionali, presentano prestazioni più elevate in
termini di scalabilità (capacità di un sistema di “crescere” o diminuire di scala in funzione delle
necessità e delle disponibilità), soprattutto per l’accesso a dati di notevoli dimensioni (anche
dell’ordine di Pbyte). Essi sono usati dai più importanti motori di ricerca e dai programmi che
accedono a molti social network.

Le reti informatiche
Oggigiorno, un utente di un computer difficilmente potrebbe fare a meno della connessione a
Internet, non solo per cercare informazioni o scambiare messaggi con altri utenti, ma anche per
molte altre operazioni di uso comune: utilizzare software installato, ma che prevede una licenza
attivabile da Internet, aggiornare i programmi applicativi o del sistema operativo a una nuova
versione, mandare in stampa un file su una stampante di rete non connessa fisicamente alla propria
postazione di lavoro ecc.
Internet è solo l’esempio più conosciuto di una rete di computer, estesa a livello planetario. In
informatica le reti di computer si distinguono per distribuzione geografica, topologia di connessione
e protocolli utilizzati. Relativamente alla geografia, si distinguono i seguenti tipi di rete:
Local Area network o LAN. Il termine Local (locale) indica che diversi computer sono
interconnessi tra loro, ma l’estensione della interconnessione è geograficamente limitata, per
esempio un’azienda, un campus universitario, un polo ospedaliero. Oltre a computer, sulla rete
possono trovarsi altri dispositivi in grado di scambiare informazioni, come stampanti, plotter (unità
periferica per la stampa in alta qualità di disegni tecnici) o dispositivi elettronici dedicati.
Metropolitan Area Network, o MAN. Si tratta di un livello intermedio di rete, diffusa
geograficamente su un’area metropolitana di una città.
Wide Area Network, o WAN. Il termine Wide (= estesa, ampia) indica che i diversi computer sono
collegati su un’area molto più estesa, rispetto a una LAN o una MAN, interconnettendo tra loro più
MAN o LAN.
A prescindere dalle dimensioni dell’area geografica su cui si sviluppano, le reti possono avere
differenti topologie, ovvero schemi di interconnessione tra i vari nodi (intendendo con nodo un
computer o qualunque altro dispositivo interconnesso in grado di comunicare sulla rete). Si
distinguono le seguenti topologie:
Topologia punto a punto: due nodi sono collegati direttamente da una linea bidirezionale della rete.
Si tratta del caso più semplice di topologia. In una LAN, questa topologia può essere rappresentata
dal collegamento tra due computer in due uffici diversi dello stesso edificio. In ambito WAN, un
esempio di rete con topologia punto a punto può essere l’interconnessione di due computer di due
sedi diverse di un’azienda, per esempio una sede a Milano e una a Roma.
Topologia a bus: tutti i nodi insistono su un bus che li collega e che costituisce la risorsa condivisa
di trasmissione dati. In ogni istante sul bus transitano i dati relativi a una sola comunicazione tra due

nodi della rete.


Topologia ad anello: tutti i nodi insistono su un anello: il percorso che compie l’informazione è
quindi un percorso chiuso e ogni nodo ritrasmette i dati al successivo fino a che essi non arrivano al
nodo di destinazione.
Topologia a stella: un nodo centrale, spesso identificato con il termine server, è collegato a
ciascuno degli altri nodi come se fosse il nucleo (centro) di una stella. Questa topologia si adatta
bene al modello di rete di tipo client-server, in cui i dati si trovano soprattutto concentrati sul nodo
centrale (server), ove avviene principalmente anche la loro elaborazione, mentre gli altri nodi
(client) si limitano ad effettuare richieste di trasferimenti dati o altre operazioni.

Per consentire la comunicazione di computer eterogenei (cioè dotati di microprocessori e sistemi


operativi diversi tra loro) è necessario che la comunicazione che passa tra i vari concentratori (o
router) delle comunicazioni rispetti un’architettura standard. Essa è descritta mediante un modello a
strati (ISO/OSI) definito su 7 livelli: fisico, data link, rete, trasporto, sessione, presentazione e
applicazione. Ogni livello prevede particolari protocolli di comunicazione, ovvero insieme di regole
accettate e riconosciute dai due protagonisti della comunicazione (chi spedisce i dati e chi li riceve).
I primi due livelli (fisico e data link) riguardano più da vicino come i bit vengono “impacchettati” a
formare il flusso dell’informazione digitale sulla rete. Lo standard IEEE 802 è quello più diffuso e
riguarda appunto i primi due livelli dello standard ISO/OSI.
Per ogni livello è possibile individuare o uno o più protocolli standard la cui diffusione ha fatto sì
che le reti di computer si diffondessero in modo globale. Per esempio, i protocolli TCP/IP e HTTP
sono i più diffusi nella realizzazione della rete Internet. Il primo permette di identificare
univocamente qualunque computer sulla rete mediante un indirizzo, detto indirizzo IP (da Internet
Protocol), un numero a 32 o 128 bit (a seconda che si usi il protocollo IPv4 o IPv6). Un esempio di
indirizzo IP è per esempio:
172.36.28.214
Ove il primo numero identifica la rete (172), quindi le varie sotto-reti, fino al numero del computer
(214), nodo o host di rete.
Il protocollo HTTP (o HyperText Transfer Protocol, protocollo di trasferimento di un ipertesto) è un
protocollo a livello applicativo usato come principale sistema per la trasmissione d’informazioni sul
World Wide Web. Esso utilizza, a sua volta, il protocollo IP a livello di trasporto.

Internet
Internet si è evoluta a partire dalla metà del secolo scorso e la sua diffusione è stata così globale
grazie non solo ai progressi dell’elettronica delle telecomunicazioni e ai protocolli standard di rete,
ma anche grazie a interessi economici e militari. Nacque infatti negli Stati Uniti per opera
dell’agenzia governativa ARPA (Advanced Research Project Agency), ente di ricerca per lo sviluppo
di tecnologie strategiche, principalmente in ambito militare. Presso l’ARPA si sviluppò un primo
prototipo di rete che divenne poi l’ARPA Computer Network (o ARPANET), di fatto la
progenitrice di Internet, come la conosciamo oggi.
Il numero di nodi collegati da ARPANET cresceva sempre più, partendo da poco più che una decina
negli anni Settanta del secolo scorso. Parallelamente, cominciarono a svilupparsi nel mondo altre
reti civili, come per esempio BITNET, che collegava le principali università. StatNet fu invece la
prima rete di collegamento satellitare in grado di attraversare l’oceano. Nel 1985 ebbe inizio il
programma NSFNET della National Science Foundation, una rete di supercomputer dedicati alla
ricerca e alla didattica per la quale viene scelto il protocollo TCP/IP. Solo alla fine del secolo scorso
questa rete globale divenne accessibile anche per usi commerciali e quindi si arriva a Internet nella
forma attuale.
Tra il 1989 e il 1991, Tim Berners-Lee propone e realizza un sistema per documenti ipertestuali da
usare nella rete locale del CERN (Conseil Européen pour la Recherche Nucléaire) di Ginevra. Il
linguaggio di formattazione del testo, chiamato HTML (HyperText Markup Language), diventerà lo
standard di descrizione delle pagine web. Dopo due anni, il CERN decise di rendere pubblico il
protocollo e rendere così possibile la nascita del World Wide Web su scala planetaria.

Il World Wide Web


Il World Wide Web (o semplicemente, il Web) è il risultato della diffusione e della
standardizzazione di Internet e dei suoi protocolli di rete. Senza la sua infrastruttura tecnologica,
non sarebbe possibile leggere una pagina di un sito web residente su un server in un punto qualsiasi
del globo, comodamente dal proprio computer di casa o dell’ufficio. Tuttavia, il Web è molto di più
di Internet: tecnicamente è un servizio di Internet, ovvero un servizio a disposizione degli utenti di
un computer basato sui protocolli di trasmissione e comunicazione di Internet e la topologia classica
di tipo client-server. Il computer sul quale risiedono le pagine del sito web è il server, mentre viene
definito client il computer che richiede, tramite un programma apposito, detto browser, le
informazioni grafiche e testuali del sito.

I siti web
Un sito web (o sito Internet) è un insieme di pagine web correlate, cioè una struttura ipertestuale di
documenti che risiede su un server web. I siti sono accessibili all’utente client che ne inoltri
richiesta di accesso tramite un web browser, digitando in esso direttamente l’indirizzo IP oppure,
nella stragrande maggioranza dei casi, una stringa che identifica il sito; tale stringa è costituita da
una radice comune (detta “nome di dominio”, per esempio “www.kernel.org”), seguita da una serie
opzionale di “sottocartelle” e dal nome della pagina. Il nome completo di ogni pagina è detto
“indirizzo web” o, più tecnicamente, URI (o URL).
Le informazioni di un sito web sono organizzate in pagine ove, oltre al testo, alle immagini e ad
altri oggetti grafici, sono presenti iper-collegamenti o link ad altre pagine web. Facendo clic con il
mouse su un link, il protocollo di rete a livello applicativo rende disponibile al client la pagina web
(o in generale l’oggetto, come un’immagine, un video o un audio) associata al link. Tale
caratteristica, detta ipertesto (testo contente collegamenti cliccabili ad altro testo) è ciò che
contraddistinse il Web fin dalla sua nascita, da qualunque altro tipo di archivio digitale di
informazioni in rete.
Il World Wide Web è reso possibile non solo dall’infrastruttura di rete, ma anche da particolari
linguaggi che servono per creare le pagine web sul server e renderle accessibili al client. Tali
linguaggi sono l’HTML, il CSS, il PHP e il JavaScript.

Il linguaggio HTML
Innanzi tutto occorre puntualizzare un concetto importante: l’HTML non è un linguaggio di
programmazione in senso stretto e come è stato definito precedentemente, ma un linguaggio di
descrizione di pagine web.
HTML è la sigla delle parole inglesi HyperText Markup Language: è un linguaggio per ipertesti
basato su marcatori che consente di descrivere la struttura della pagina web. È stato sviluppato
verso la fine degli anni Ottanta del secolo scorso, con lo scopo di permettere la formattazione di
documenti (le pagine web) per la loro diffusione e la loro visualizzazione attraverso reti di computer
collegati fra loro.
La parte innovativa e fondamentale da evidenziare è il termine ipertesto, ossia una sorta di testo
potenziato: l’idea era quella di creare testi interconnessi mediante i cosiddetti collegamenti
ipertestuali. A giudicare dalla dimensione odierna del World Wide Web a livello globale, possiamo
dire che il risultato è stato brillantemente raggiunto!
L’HTML consente di dare forma alle pagine che troviamo quotidianamente sul Web; la sintassi di
questo linguaggio permette di impostare il layout e l’aspetto del contenuto in modo “asettico”. In
altre parole, con l’HTML possiamo comunicare al browser che uno specifico testo è il titolo
principale dell’articolo di una pagina, e poi possiamo usare un altro linguaggio, come il CSS, per
decidere quale impostazione grafica dare ai titoli (e a tutti gli altri elementi) della pagina HTML. In
assenza del foglio di stile CSS, potrà essere il browser a decidere l’impostazione sulla base delle
impostazioni stabilite dall’utente finale che legge la pagina sullo schermo del suo dispositivo.
La funzione di “contenitore” dell’HTML, però, va ben oltre la semplice disposizione degli elementi
sullo schermo di smartphone e computer e il loro design grafico. Navigando oggi sul Web è
evidente come le pagine HTML siano uno strumento in grado di eseguire operazioni diversissime,
dall’esecuzione di un video alla compilazione di un modulo. Questo avviene perché nelle pagine si
possono includere file esterni di vario tipo (audio, video, Flash, Java ecc.) e script, per esempio in
formato JavaScript, per l’esecuzione di operazioni che il codice HTML di per sé non può effettuare.
Ecco brevissimo esempio di codice HTML:
<p>Per altre informazioni leggi la nostra
<a href=“http://www.sitoqualsiasi.com/guida”>guida</a>.</p>
Queste righe di codice creano un collegamento ipertestuale all’interno di un paragrafo. Il testo del
collegamento letto dall’utente sarà guida e la pagina web che contiene il codice indicato appare la
seguente riga:
Per altre informazioni leggi la nostra guida.
e facendo clic su guida il navigatore finirà nella pagina indicata dal riferimento nel codice, ovvero
http://www.sitoqualsiasi.com/guida.
Mediante l’HTML è possibile descrivere la struttura di una pagina web, usando degli opportuni
marcatori. Una pagina web viene quindi definita da un documento HTML, costituito da una serie
di tag, cioè di istruzioni che definiscono la presentazione della pagina web secondo
l’interpretazione del browser.
Ogni pagina inizia con il tag <html> e termina con il tag </html> (dopo un’istruzione che specifica
il tipo e la versione di linguaggio HTML usati). Tra queste due istruzioni si trova tutto il contenuto
del file che il browser deve “interpretare”. Inoltre, all’interno della pagina web troviamo due sezioni
fondamentali: head e body.
La prima riga del documento HTML contiene la dichiarazione DOCTYPE (il tipo di documento)
che comunica al browser quale “versione” di linguaggio HTML viene usato per la composizione del
documento. Per esempio, la dichiarazione per HTML5 è
<!DOCTYPE html>
Tutti i documenti HTML devono contenere lo start tag <html> all’inizio del file e l’end tag
</html> alla fine del file: in pratica, una pagina web costruita con il linguaggio HTML ha questa
semplice struttura di base dopo la dichiarazione DOCTYPE:
<html>
… contenuto …
</html>
Queste istruzioni comunicano al browser che il file è un documento HTML. Gli altri tag sono
racchiusi tra queste due istruzioni.
Dopo la dichiarazione DOCTYPE e il tag html di apertura, la pagina è ulteriormente suddivisa nelle
due sezioni principali individuate dai tag: head (l’intestazione) e body (il corpo).
La sezione compresa fra i tag di apertura e chiusura <head> e </head> contiene perlopiù
informazioni relative alle modalità di lettura e interpretazione del documento, per esempio dati
relativi a codifica dei caratteri, titolo della pagina, fogli di stile, script ecc. L’unico elemento inserito
nella sezione head che risulta direttamente visibile agli utenti è il titolo della pagina, definito dai tag
<title> e </title>.
Vediamo alcuni tag generalmente inseriti nella sezione head della pagina web:
• Tag meta per la codifica dei caratteri del documento. Esempio: <meta http-equiv=“Content-
Type” content=”text/html; charset=ISO-8859-1″>.
• Tag title, per il titolo del documento che viene visualizzato nella barra del titolo della pagina
web. Esempio: <title>Titolo del documento</title>.
• Tag meta con altre informazioni sulla pagina. Esempio: <meta name=“Copyright”
content=“Informazioni sul copyright”>.
Nella sezione body troviamo il reale contenuto della pagina e la sezione si occupa di definire come
il contenuto apparirà all’utente.

Il linguaggio CSS
Un altro linguaggio descrittivo pensato per il Web è il linguaggio CSS, acronimo di Cascading
Style Sheets, ossia “fogli di stile a cascata”. Il CSS, come l’HTML, non è un linguaggio di
programmazione: è un linguaggio che definisce lo stile e il layout delle pagine web. HTML e CSS
sono due elementi fondamentali per dare vita al Web. Semplificando molto, diciamo che:
• il linguaggio HTML si occupa della struttura delle pagine,
• il linguaggio CSS si occupa di layout e presentazione dei contenuti delle pagine.
Con il linguaggio CSS si creano file specifici con estensione .css, i cosiddetti fogli di stile, che
contengono una serie di definizioni che indicano al browser come visualizzare gli elementi della
pagina web che esso presenta all’utente, sia per quanto riguarda la loro posizione in pagina, sia per
quanto riguarda il loro aspetto visivo. I file .css sono collegati ai file .html mediante istruzioni
specifiche inserite in questi ultimi. Ecco un brevissimo esempio.
Il file HTML vendere-casa.html comunica al browser che una certa frase è il titolo principale di una
pagina web, marcando quella frase con il tag H1. Il file HTML comunica inoltre al browser che la
definizione degli stili si trova nel file del foglio di stile CSS collegato stilevendita.css. Il file CSS
stilevendita.css comunica al browser che il titolo H1 della pagina web vendere-casa.html dev’essere
visualizzato centrato, con un certo font e con un certo colore.
Si può anche inserire direttamente il codice CSS all’interno della pagina HTML (nell’intestazione
del file o all’interno dei singoli elementi della pagina), ma è un approccio meno efficiente rispetto
all’impiego di un file di stile esterno e autonomo dal file della pagina web, perché in questo modo si
rinuncerebbe alla potenza dei fogli di stile. Grazie alla possibilità di separare la struttura del
contenuto dalla presentazione del contenuto, l’impiego di file esterni di stile in linguaggio CSS ha
molti punti di forza nella creazione e gestione di pagine e siti web. Vediamone alcuni:
• snellisce i file delle pagine web, che così si caricano più rapidamente, dal momento che tutte
le informazioni sullo stile e sul layout per un sito web possono essere inserite nel file .css,
caricato una sola volta nella cache (un’area di memoria estremamente veloce, ma di ridotte
dimensioni) del browser, e non devono essere inserite in ogni singola pagina .html.
• Semplifica l’editing dei siti web: se volete cambiare l’aspetto dei titoli H3 non dovete
intervenire su ogni singolo file del sito, vi basta modificare il file del foglio di stile.
• Velocizza l’editing dei siti web: la modifica del foglio di stile ha effetto immediato e questo
vi consente anche di fare qualche “esperimento” al volo prima di prendere una decisione
(fate sempre un backup dei file prima di modificarli).
• Consente di creare siti web con pagine omogenee: applicando lo stesso foglio di stile a un
insieme di pagine, quelle pagine avranno lo stesso aspetto e lo stesso layout.
• Adatta le pagine web a dispositivi diversi: con particolari accorgimenti, la stessa pagina può
essere presentata in modo diverso su dispositivi diversi, da monitor di grandi dimensioni a
smartphone e tablet.
Il codice CSS viene strutturato sotto forma di una serie di regole che definiscono i valori delle
proprietà da applicare ai selettori. Il selettore indica l’elemento della pagina web a cui applicare lo
stile (titolo principale, testo ecc.), la proprietà indica lo stile dell’elemento su cui si interviene
(colore, tipo di font ecc.), il valore indica la modalità con cui si interviene sullo stile (blu o rosso per
il colore, Arial o Times New Roman per il font ecc.).
Ecco un paio di semplicissimi esempi di codice CSS, per avere un’idea di cosa succede in un file di
stile .css collegato a un file .html:
• colore del testo: per applicare il colore rosso (color red) a tutto il testo in grassetto (tag b)
della nostra pagina HTML possiamo scrivere semplicemente: b { color: red; }
• Colore e font: per visualizzare in blu e con il font Arial tutti i titoli h3 della pagina html
possiamo scrivere: h3 { font-family: Arial; color: blue; }.

Il linguaggio PHP
PHP è un linguaggio di scripting utilizzato soprattutto per lo sviluppo in ambito web. Infatti è
generalmente utilizzato per codificare programmi operanti sui server in cui risiedono i dati dei siti
web. I punti di forza di PHP sono soprattutto le sue velocità, flessibilità ed efficacia e anche
l’enorme diffusione. Con PHP è possibile realizzare soluzioni in grado di svolgere molti compiti
diversi come, per esempio, la valutazione dei dati in un modulo web, la realizzazione di contenuto
personalizzato per il browser, le comunicazioni con i database dei server web, la trasmissione dei
cookie, la scrittura in un database ecc. A sua volta, un codice in PHP può essere usato per generare
altro codice HTML.
I principali punti di forza del PHP sono riassumibili come segue:
• diffusione: probabilmente il PHP è il più diffuso linguaggio lato server, questo significa che
è usato su milioni di server nel mondo.
• Open source (un software di cui gli autori, detentori dei diritti) rendono pubblico il codice
sorgente, permettendo a programmatori indipendenti di apportarvi modifiche ed estensioni);
PHP è molto popolare nel mondo degli sviluppatori open source, dunque c’è una
grandissima quantità di sviluppatori in grado di usarlo.
• Relativa facilità di apprendimento: chiariamo che PHP è un linguaggio di programmazione a
pieno titolo, diversamente da HTML e CSS, perciò imparare seriamente PHP richiede molto
impegno e molta pratica. È anche vero però che PHP è uno dei linguaggi di programmazione
meno complicati da apprendere. Inoltre qualche semplice riga di codice PHP può già fare
qualcosa di utile, perciò potrete cominciare subito a vedere il risultato della vostra fatica.
• Integrazione con HTTP e HTML: PHP è perfettamente integrato con HTML, il linguaggio
delle pagine web, e con HTTP, il protocollo di comunicazione del World Wide Web.
• Interattività: PHP consente alle pagine web di interagire con gli utenti in modi che sono
impossibili da ottenere con il solo HTML, per esempio con forum interattivi, sistemi di
messaggistica, moduli per la posta elettronica, carrelli di e-commerce.
• Ampia documentazione e supporto online: data la sua diffusione, potete trovare in Rete tutte
le informazioni che vi servono sul linguaggio PHP, i suoi metodi e le sue funzioni, senza
contare la vastissima comunità di utenti ed esperti a cui è possibile rivolgersi.

Il linguaggio JavaScript
JavaScript (anche abbreviato con JS) è un vero e proprio linguaggio di programmazione, simile a
Java, che ha trovato il suo massimo successo nelle pagine web, per la sua capacità di “aggiungere”
funzionalità ai linguaggi HTML e CSS che non sono dei veri e propri linguaggi di programmazione.
Assieme ad HTML, CSS e PHP, il linguaggio JavaScript è uno degli strumenti fondamentali e
irrinunciabili per chiunque voglia occuparsi seriamente di pagine e siti web. E non vogliamo
riferirci solo ai programmatori e agli sviluppatori web, ma soprattutto a chi intende creare e
pubblicare un sito web che abbia un successo duraturo nel tempo. Esso infatti permette di gestire il
comportamento delle pagine web inserendo codice ad hoc per produrre risultati a partire dai dati
contenuti nella pagina o introdotti dall’utente in forma interattiva durante la navigazione. JavaScript
utilizza un metodo standard per elaborare il codice HTML e produrre una serie di risultati; infatti è
in grado di manipolare il DOM (Document Object Model), cioè lo standard ufficiale per l’accesso
agli elementi HTML.
JavaScript è un linguaggio di programmazione lato client, a differenza di altri che vengono utilizzati
(come PHP) per applicazioni lato server. Questo vuol dire che le operazioni vengono eseguite sul
computer client, ovvero quello dell’utente), e ciò è molto utile a chi vuole gestire un proprio sito
senza passare attraverso web agency o programmatori di un certo livello.

Il browser
Il browser web (o web browser) è un software installato sul dispositivo usato dall’utente per
connettersi al World Wide Web e che recupera le risorse informative che l’utente stesso richiede: il
browser individua la risorsa desiderata, la recupera, la analizza e la presenta sullo schermo del PC o
del cellulare.
Le pagine HTML di un sito si trovano immerse in un oceano di dati, in compagnia dei milioni di siti
che costituiscono appunto il World Wide Web. Lo scopo dei browser web è quindi quello di
consentire all’utente di visitare le pagine e di eseguire le applicazioni che si trovano in Rete. In
effetti, i browser possono essere impiegati anche per l’accesso a informazioni con altre modalità,
ma qui ci focalizziamo sul loro impiego su Internet. Questi sono i browser attualmente più diffusi:
• Google Chrome
• Microsoft Internet Explorer
• Mozilla Firefox
• Apple Safari
• Opera.
Spesso l’utente finale non sceglie consapevolmente il browser, ma utilizza quello preinstallato sul
suo dispositivo, soprattutto se parliamo del mondo mobile. Mentre, per esempio, è facile per un
utente con un PC Windows passare da Internet Explorer a Chrome, la grande maggioranza di chi
usa uno smartphone per navigare sul Web spesso non ha nemmeno la competenza sufficiente per
sapere qual è il browser in uso. Le funzioni dei browser possono essere comprese considerando
un’ipotetica sequenza semplificata del lavoro di un browser.
L’utente digita l’URL della risorsa a cui vuole accedere, per esempio https://www.albanesi.it/. Il
prefisso, in questo caso http:, identifica il tipo di risorsa e determina gli eventi successivi; questo
specifico prefisso indica che la risorsa è reperibile con il protocollo http. Altri prefissi indicano
risorse diverse:
• che possono essere direttamente elaborate dal browser;
• che possono richiedere funzionalità supplementari (come un plugin per le applicazioni
Flash);
• che vengono “passate” ad applicazioni diverse dal browser (il prefisso mailto:, per esempio,
richiede l’applicazione per la gestione della posta elettronica).
Se il browser è in grado di elaborare la risorsa richiesta, la recupera e quindi la trasforma nel corso
della fase di rendering, traducendola nel documento che viene presentato sul dispositivo utilizzato.
Una parte dei dati viene memorizzata nella cache del browser per velocizzare eventuali accessi
successivi.
A questo punto il browser resta in attesa dell’interazione dell’utente con le risorse visualizzate e
reagisce all’interazione secondo quanto previsto dal codice contenuto nella pagina. Per esempio:
• carica una pagina diversa quando l’utente clicca su un collegamento ipertestuale (link);
• visualizza un’immagine diversa quando l’utente clicca sulla freccia di uno slider;
• aggiunge un prodotto a un carrello di e-commerce quando l’utente clicca sul pulsante
Compra.
Browser diversi si basano su diversi motori di rendering per trasformare le informazioni di markup
(il codice HTML) e quelle di formattazione (per esempio CSS) nella pagina con il layout e lo stile
che viene visualizzato su computer, tablet o smartphone.

Internet e mobile
Da diversi anni Internet è disponibile anche sui cellulari, anzi la percentuale di traffico si sta sempre
più spostando verso il traffico mobile (su cellulare), anziché verso il traffico desktop (sui computer
“normali”). La situazione rende spesso difficile la portabilità di un sito sui dispositivi (computer e
cellulari) molto diversi come ampiezza della pagina e risoluzione dello schermo. Esistono
sostanzialmente tre soluzioni:
• un solo sito che viene visto sui cellulari con tutta la limitazione che è loro propria come
ampiezza della pagina; spesso l’utente deve ingrandire le parti che gli interessano per
leggerle in modo efficiente e deve continuamente spostarsi per visualizzare la porzione di
pagina voluta. Si tratta della soluzione a più basso contenuto tecnologico.
• Due siti, uno per il mobile l’altro per l’ambiente desktop; un opportuno controllo sul
dispositivo posseduto dall’utente consente di accedere alla versione mobile o alla versione
desktop del sito. Si tratta di una soluzione accettabile per l’utente, ma molto onerosa per la
gestione del sito, di certo non ottimizzata.
• Un sito responsive; si tratta di un sito creato in un ambiente (per esempio l’ambiente
WordPress, una piattaforma software di personal publishing e content management system
-CMS-, cioè un programma che, girando lato server, consente la creazione e distribuzione di
un sito Internet) che sfruttando opportune risorse (che permettono di configurarlo secondo
gli scopi voluti) si adatta automaticamente al dispositivo.

La sicurezza informatica
La crescente diffusione delle reti e la possibilità che un computer sia raggiungibile da informazioni
inviate da altri computer ha messo in una posizione di massima rilevanza il problema della
sicurezza informatica. Infatti, tra i programmi che potenzialmente possono raggiungere il nostro
computer, oltre a quelli leciti e intenzionalmente scaricati dalla Rete e successivamente installati sul
dispositivo, ve ne sono altri indicati con il termine di malware, che possono danneggiare il
computer. Il danno può essere di varia entità: si va dalla semplice interruzione di un servizio (per
esempio il collegamento alla rete) alla negazione dell’accesso a una risorsa (per esempio.
l’incapacità di leggere una parte del disco rigido) fino alla cancellazione di dati o alla lettura di
informazioni riservate.
Della categoria del malware fanno parte i virus e i vermi informatici, le bombe e i cavalli di
Troia. Si tratta di porzioni di codice che scatenano il loro effetto dannoso in diversi modi, o con
l’intervento esplicito dell’utente (per esempio facendo click su un determinato link o aprendo un file
allegato a un messaggio di posta elettronica), oppure in modo indipendente al raggiungimento di
certe condizioni (per esempio, come nel caso delle bombe, al raggiungimento di una particolare data
o al riempimento di un’area di memoria).
I programmi antivirus permettono di analizzare il comportamento del sistema informatico ed
evidenziare le possibili tracce lasciate da un programma malware, in termini di eccessiva
occupazione di CPU, di memoria ecc. La presenza di un firewall, un particolare programma per la
gestione della sicurezza informatica, consente invece di proteggere il computer dalle minacce di
rete, bloccando richieste sospette di accesso alla memoria o al disco rigido ed evitando che il
malware causi un danno al sistema o effettui una lettura non autorizzata di dati.

La multimedialità
La moderna informatica ci ha abituato alla visualizzazione dei dati in forma grafica, per esempio
alla visualizzazione di file di testo con icone raffiguranti dei fogli, directory come cartelle, file audio
con icone di altoparlanti ecc.
Accanto a queste semplici applicazioni di interfaccia, vi sono programmi più complessi di grafica
computerizzata, dalla realtà virtuale 3D ai videogiochi.
La grafica può essere vista come una parte dell’aspetto multimediale della moderna informatica, in
cui la rappresentazione delle informazioni viene fatta usando più di un mezzo di rappresentazione
(testo, grafica, immagini, video ecc.).
Un’immagine digitale usata in informatica, e visualizzabile sul monitor di un computer, è una
rappresentazione digitale di un’immagine bidimensionale. Ne esistono di due tipi: immagini a
matrice di punti (o pixel contrazione di pixel element), dette anche immagini raster e immagini
vettoriali.
Nelle immagini di tipo raster, l’informazione visuale è costruita da una matrice di punti. Il numero
di righe e colonne di tale matrice costituisce la risoluzione dell’immagine. Per esempio, un formato
standard di un’immagine è di 640×480 pixel.
Ogni pixel è rappresentato da un numero, che codifica l’informazione a livello di grigi o colori
dell’immagine. Per un’immagine a colori, un metodo comune di rappresentazione del colore è lo
spazio RGB (da Red, Green e Blue), ove ogni colore è rappresentato da una combinazione di una
componente rossa, verde e blu, secondo la stessa sensibilità all’intensità cromatica dell’occhio
umano. Pensando di assegnare un byte per ogni componente di un colore, lo spazio necessario per
memorizzare un’immagine digitale in formato matriciale cresce enormemente al crescere della
risoluzione spaziale, fino ad arrivare a parecchi Mbyte. Per questo motivo, si sono affermati
algoritmi di compressione in grado di ridurre lo spazio necessario per memorizzare un’immagine.
Tali algoritmi possono essere con o senza perdita di informazione, a seconda che l’immagine
compressa, una volta decompressa e visualizzata sullo schermo, contenga o un’informazione ridotta
oppure, al contrario, la stessa informazione dell’immagine originale non compressa.
Il più famoso algoritmo e formato di compressione di immagini con perdita di informazione è il
JPEG, acronimo del Joint Photographic Experts  Group, il gruppo di esperti che si occupa appunto
di algoritmi di compressione di immagini e che ha definito tale formato. Pertanto, i file con
suffisso .jpg sono file di immagini digitali in formato raster compresse con l’algoritmo JPEG.
Nell’algoritmo è possibile specificare un fattore di qualità che indica quanta informazione si perde
nella compressione. Il fattore di qualità è un numero da 0 a 100, ove con 0 si indica la massima
compressione raggiungibile (e quindi la peggior qualità) e con 100 la compressione senza una
perdita di fatto visibile di informazione. Il fattore di qualità più usato (e quello impostato di default
in molti programmi di image editing) è 75 o 80, un buon compromesso tra la perdita di
informazione e la qualità.
Ecco un esempio di un’immagine digitale compressa con un fattore 75%, 10% e 1%. Come si vede,
l’algoritmo JPEG è particolarmente efficiente, in quanto la perdita di informazione comincia a
essere visibile solo per fattore di qualità molto bassi (10 e 1), mentre l’immagine al fattore 75 è di
fatto indistinguibile dall’originale, ovvero senza distorsioni percepibili dall’occhio umano.
Questa è la ragione per cui l’algoritmo JPEG si è imposto di fatto come lo standard attualmente nel
campo delle immagini digitali. Le dimensioni di tali file sono rispettivamente 714, 166 e 130 kbyte,
a fronte di per un’immagine originale di partenza di 3.166 kbyte.
Altri formati di immagini digitali di tipo raster sono BMP (non compresso), PNG, GIF e TIFF (tutti
e tre compressi, ma senza perdita di informazione come nel caso del JPEG).
L’inconveniente delle immagini di tipo raster è la limitatezza della risoluzione, che provoca artefatti
e perdite di dettagli non appena si cerca di ingrandire un’immagine per aumentarne la risoluzione
spaziale. Per ovviare a questo inconveniente, si possono utilizzare immagini vettoriali, in cui
l’informazione visuale non viene definita punto per punto, ma come risultato di linee o forme
geometriche, anche complesse, a cui si attribuiscono proprietà, come il colore, lo spessore ecc.
Le immagini vettoriali hanno il grande pregio di poter essere ingrandite a piacere senza perdere in
risoluzione, perché l’informazione può essere “ricreata” alla risoluzione voluta partendo dalle
equazioni matematiche che definiscono le figure geometriche. Le immagini vettoriali sono tipiche
delle applicazioni della grafica, in cui operazioni di zoom devono essere compiute velocemente e
senza l’introduzione di distorsione: si pensi per esempio alle immagini di un videogioco, con
repentini cambi di scena e passaggi tra primi piani e riprese a campo medio o lungo.
Il principale svantaggio delle immagini vettoriali è che la loro generazione necessita di parecchia
potenza di calcolo, a causa delle notevoli operazioni matematiche alla base delle equazioni di
generazioni delle varie curve e forme geometriche. Per questo motivo sono nati dei processori
dedicati alla grafica, in grado di eseguire istruzioni particolarmente adatte alla generazione
(renderizzazione) e alla manipolazione delle immagini vettoriali. I processori grafici e l’hardware
necessario per l’elaborazione di immagini vettoriali sono spesso integrati nelle workstation o nei
Personal Computer di fascia alta, o possono essere acquistati separatamente per fare elaborazioni
molto veloci e complesse, specialmente nel settore dei videogiochi e della realtà virtuale 3D.
La realtà virtuale si basa sulle più avanzate tecnologie informatiche per simulare ambienti e
proiettarli su monitor o visori specializzati, dando l’impressione all’utente di essere veramente
immerso in tale realtà, generando stimoli visivi o sensoriali in grado di ingannare i sensi dell’essere
umano e far sembrare “vera” una realtà solo ricreata al computer.
Negli ultimi anni si va affermando anche la realtà aumentata, che consiste nell’aggiungere
informazioni, spesso tridimensionali, a immagini effettivamente riprese a partire da ambienti reali, a
cui vengono aggiunti particolari per arricchire l’esperienza sensoriale dell’utente. L’esempio più
conosciuto di realtà aumentata è il gioco di Pokémon GO, in cui si può dare la caccia a
mostriciattoli immersi nell’ambiente reale dallo schermo dello smartphone.

I video
I video digitali sono un formato ancora più complesso delle immagini, in quanto si tratta di
immagini fisse riprodotte in sequenza un certo numero di volte al secondo, per simulare il
movimento, secondo il principio alla base del cinema. Quindi l’informazione non è semplicemente
bidimensionale, ma si aggiunge la terza dimensione del tempo. Per questo motivo le dimensioni di
un video digitale creato per essere visualizzato su un computer possono raggiungere parecchi Gbyte
di occupazione su disco (e in memoria).
In informatica sono molto studiati e via via via perfezionati algoritmi di compressione di video
digitali, per permettere di inviarli o scaricarli dalla Rete anche in presenza di una banda molto più
limitata di quanto sarebbe necessario per un video senza compressione. Per esempio, solo un minuto
di un filmato in Full HD occuperebbe senza compressione più di 10 Gbyte. Gli algoritmi di
compressione più usati per i video digitali sono l’MPEG1, l’MPEG2 e l’MPEG4.
Un video digitale per computer è costituito da un insieme di immagini fisse di tipo raster, dette
frame, visualizzate sullo schermo un certo numero di volte al secondo. Il numero di frame al
secondo, se per lo standard televisivo è fissato a 25 o 30, sullo schermo di un computer può essere
inferiore, in quanto la risoluzione di un video digitale è di solito più bassa oppure perché, anche se
essa arriva alla risoluzione di un film televisivo, il video viene generalmente proiettato su uno
schermo di dimensioni molto più piccole (di un computer o uno smartphone).
Volendo visualizzare un filmato digitale senza perdere informazioni (ovvero senza introdurre
distorsioni) è importante scegliere la risoluzione del dispositivo di visualizzazione (schermo della
TV, del computer o dello smartphone) compatibile con quella del video digitale in questione. Ecco
un elenco di risoluzioni tipiche dei dispositivi di visualizzazione (e, conseguentemente, di video
digitali) con i corrispondenti numeri di pixel (righe per colonne):

Risoluzione (Numero pixel per frame) Numero bit/pixel Utilizzo standard


640×480 4,8 Computer, VGA
800×600 4 Computer, SVGA
720×480 24 Televisivo NTSC
720×576 24 Televisivo PAL
1280×720

1360×768
24 HD Ready
1366×768

1920×1080 24 Full HD
2048×1080 48 2K
3840×2160 24 Super HD
4096×2160 48 4K
7680×4320 30 Ultra HD (8K)
Alcune risoluzioni sono particolarmente importanti perché corrispondono a sigle commerciali ben
conosciute, come Full HD o 4K.
Se fino a poco tempo fa le risoluzioni più alte erano appannaggio dei soli monitor televisivi, oggi,
con il progresso dell’elettronica e dell’informatica (con la nascita di algoritmi di compressione
video particolarmente efficaci), non è raro trovare risoluzioni molto elevate (come il Full HD e
oltre) anche su monitor di computer o schermi di smartphone.

I suoni
Il suono che l’orecchio umano è in grado di percepire è di tipo analogico, un’onda generata nell’aria
che si propaga e colpisce la membrana del timpano. L’uomo è in grado di percepire suoni compresi
tra 20 e 20.000 Hz. I computer però sono in grado di elaborare solo informazioni discrete e binarie,
quindi è necessario passare da un suono analogico a uno digitale. Un segnale audio, sia esso la
registrazione della nostra voce, una canzone o un brano di un’orchestra sinfonica, è rappresentato
informaticamente da un file audio, costituito da numeri binari, che codificano mediante algoritmi
particolari, i valori dei campioni sonori. Un segnale analogico di un suono, per essere rappresentato
da una sequenza di numeri, deve essere opportunamente campionato e quantizzato. Al termine di
queste due operazioni, il suono è “tradotto” in numeri binari. La frequenza di campionamento e il
numero di bit associati a ogni campione nella fase di quantizzazione determinano la “fedeltà”
dell’audio digitale al segnale analogico di partenza. La frequenza più alta di campionamento
digitale per segnali audio è la qualità DVD Blu-ray, ovvero la frequenza pari a 96 KHz (e 24 bit per
campione).
Compito degli algoritmi di decodifica audio e dei programmi di elaborazione dei suoni è leggere tali
numeri e tradurli in segnali opportuni da inviare alla scheda audio del computer. Questa è un
dispositivo in grado di generare l’audio digitale che viene convogliato alle casse del computer, che
sono, il più delle volte (come nei Personal Computer) integrate nell’hardware del sistema.
Il formato audio più conosciuto è l’Mp3, derivato dalla componente audio di un formato di
compressione video MPEG.
Nei moderni sistemi informatici, come le immagini e i video, anche i suoni hanno raggiunto un
grado di fedeltà e di ricchezza di informazioni di alta qualità. La difficoltà principale
nell’elaborazione dell’audio non è tanto la sua compressione o la sua riproduzione, ma soprattutto la
sincronizzazione con altri eventi che si verificano in un sistema multimediale, per esempio la
riproduzione di un filmato o la visualizzazione di immagini.
Un settore particolarmente evoluto dell’informatica moderna è il riconoscimento vocale, utilizzato
in moderni sistemi di autenticazione o database multimediali.