Appunti di informatica

Transcript

Appunti di informatica
Appunti di informatica
L'elaboratore elettronico
COSA SI IMPARA IN QUESTA LEZIONE:
Cosa studia l'informatica
Cosa è un algoritmo
Come è costituito un elaboratore
Come l'elaboratore esegue un proramma
Come l'elaboratore memorizza le informazioni
Cosa studia l'informatica
COSA NON È L'INFORMATICA
– L'informatica non è lo studio dei calcolatori (i calcolatori sono solo
degli apparecchi, strumenti usati in informatica)
– L'informatica non è imparare a scrivere programmi (anche i
programmi sono solo degli strumenti)
– L'informatica non è saper usare i programmi (così come guidare la
macchina non è ingegneria meccanica)
L'informatica non è nessuna di queste cose (ma le comprende tutte).
COSA È L'INFORMATICA
L'informatica è una scienza (in inglese: computer science).
L'informatica è la scienza che studia gli ALGORITMI e le loro:
–
proprietà formali (aspetti logico-matematici, teorici)
–
realizzazioni hardware, cioè elettroniche, cioè calcolatori
–
realizzazioni software, cioè i programmi
–
applicazioni pratiche: calcolo, organizzazione dati, comunicazione
1.1
Cosa è un algoritmo
Un algoritmo è la soluzione formale a un problema.
È una procedura che consta di un numero finito di passi.
È il modo per risolvere un problema in maniera automatica.
Un algoritmo è una cosa scritta con tanta pignoleria e puntigliosità che
anche un calcolatore, per quanto stupido, è in grado di eseguirlo.
ESEMPIO DI ALGORITMO
Programmare un videoregistratore
1. Se la data o l'ora non sono esatte,
vai a pagina 40 del manuale; esegui la procedura per impostare data e ora
2. Inserisci una cassetta vuota
3. Esegui da 4. a 7. tante volte quante sono le trasmissioni da registrare
4. Imposta il canale e premi il tasto CHAN
5. Imposta l'ora di inizio e premi il tasto START TIME
6. Imposta l'ora di fine e premi il tasto END TIME
7. Premi il tasto END PROG
8. Premi il tasto TIMER
Possiamo notare diverse caratteristiche generali in questo semplice
algoritmo.
Prima di tutto, non sono tenuto a sapere che cosa succede quando seguo
le istruzioni.
L'algoritmo è la soluzione automatizzata di un problema.
Notiamo inoltre che esistono tre tipi di successione temporale dei passi
dell'algoritmo, ossia il flusso di esecuzione può procedere in tre modi:
SEQUENZIALE. Dopo l'istruzione n viene eseguita l'istruzione n+1, in
sequenza. Nell'esempio: l'istruzione 2. è una istruzione che provoca un
flusso di esecuzione sequenziale (cioè non altera la sequenza naturale
delle istruzioni).
ITERATIVO o ciclico. Una sequenza di istruzioni viene ripetuta per un
certo numero di volte. Nell'esempio: l'istruzione 3. è una istruzione che
provoca un flusso di esecuzione iterativo (cioè altera la sequenza naturale
delle istruzioni introducendo una ripetizione).
CONDIZIONALE. L'istruzione n viene eseguita solo se si verifica una
condizione determinata. Nell'esempio: l'istruzione 1. è una istruzione che
provoca una esecuzione condizionale (cioè può alterare o non alterare la
sequenza naturale delle istruzioni a seconda del verificarsi della
condizione specificata).
Possiamo infine vedere che questo algoritmo fa uso di un
sottoprogramma.
1.2
Il sottoprogramma è un altro algoritmo (qui si trova a pagina 40 del
manuale del videoregistratore).
Di esso non conosciamo i dettagli. Di esso ci interessano solo gli effetti
(ossia che, una volta richiamato il sottoprogramma, data e ora siano
corrette).
Queste sono le basi della programmazione.
ESECUZIONE DI UN ALGORITMO
Un algoritmo deve essere eseguito da un qualche agente.
Per millenni, gli agenti che eseguivano gli algoritmi sono state le
persone. Gli algoritmi erano realizzati come istruzioni verbali.
Nel 1500, esistevano agenti meccanici in grado di eseguire algoritmi.
Essi erano gli automi. Gli algoritmi erano allora realizzati come strutture
meccaniche (p.es. il tamburo dentato del carillon).
Tra la fine del 1800 e la prima metà del 1900 esistevano macchine
elettromeccaniche per eseguire gli algoritmi. Gli algoritmi erano
realizzati ancora come strutture meccaniche o anche codificati su nastri o
schede perforate.
Infine, dagli anni '40 del 1900, sono stati inventati agenti elettronici:
l'elaboratore o calcolatore elettronico. Gli algoritmi sono realizzati come
programmi.
Un programma è un algoritmo realizzato e memorizzato in una forma
che il calcolatore è in grado di leggere ed eseguire.
Struttura dell'elaboratore
Il termine elaboratore o calcolatore elettronico indica una vasta gamma di
macchine, dai supercalcolatori per le analisi del Progetto Genoma o per le
simulazioni meteorologiche, fino ai microprocessori incorporati negli
apparecchi domestici (telefoni cellulari, televisori, lavatrici e frigoriferi).
Ma noi ci riferiremo in particolare al calcolatore destinato all'uso
generale, per applicazioni "da ufficio" o "da scrivania", il personal
computer o PC.
Un elaboratore (anche il PC più economico) è un apparato complesso,
quindi è costituito da più parti o componenti.
Alcuni componenti formano il nucleo centrale del calcolatore (il "cuore").
Essi sono detti componenti centrali. Nei calcolatori moderni, essi sono
tutti ospitati su un'unica scheda di circuito stampato, detta la scheda
madre (motherboard).
La maggior parte di essi trova addirittura spazio all'interno di un unico
circuito integrato, il microprocessore.
1.3
Questi componenti sono imprescindibili per il funzionamento del
calcolatore.
Altri componenti sono concettualmente esterni al nucleo centrale del
calcolatore, e sono pertanto detti componenti periferici o le periferiche.
Ovviamente, specie nel caso dei portatili, spesso una periferica è in realtà
fisicamente incorporata in unico blocco nel calcolatore.
I componenti periferici non sono in linea di principio indispensabili per il
funzionamento dell'apparato. In realtà, molti di essi sono necessari per
poter utilizzare il calcolatore (p.es. tastiera e schermo).
COMPONENTI CENTRALI PRINCIPALI:

Unità centrale di elaborazione/Central Processing Unit/CPU:
esegue i programmi. È temporizzata da un segnale, detto clock, che
imposta il ritmo di esecuzione delle operazioni ed è generato da un
apposito circuito presente sulla scheda madre. (Quindi la scheda
madre impone la frequenza di clock.)
La CPU è il componente principale del microprocessore, che può
contenere però anche parti ausiliarie: memorie temporanee,
elaboratori di istruzioni matematiche o di elaborazione segnali,
circuiti di controllo e accesso alla memoria RAM, ecc.

Memoria primaria: detta RAM (random access memory, memoria
ad accesso casuale) perchè ha la caratteristica che, richiedendo ad
essa un dato scelto a caso, essa è in grado di fornirlo in un tempo
costante. Questa proprietà non l'hanno, per esempio, i nastri
magnetici, che vanno prima avvolti fino a raggiungere il punto
desiderato. Quindi i nastri possono servire come memorie ad accesso
sequenziale.
La memoria primaria contiene i programmi in esecuzione e anche i
dati su cui i programmi stanno lavorando.
PERIFERICHE PRINCIPALI:

Tastiera: dispositivo di ingresso (input) di caratteri alfanumerici e
simboli.

Schermo/monitor: dispositivo di uscita (output) grafico.

Mouse: dispositivo di ingresso, usato per il puntamento.

Scheda video: dispositivo di conversione, codifica l'uscita grafica
destinata al monitor per renderla visualizzabile.

Disco rigido/Disco fisso/Hard disk: dispositivo di ingresso/uscita,
per memorizzare le informazioni in modo stabile ma reversibile (si
possono cancellare e modificare). È inamovibile (il disco è
fisicamente sigillato all'interno del lettore, il drive, e nemmeno l'aria
può raggiungerlo). Data la sua velocità, è usato anche come
estensione della memoria di lavoro.
1.4

Dischetto/Floppy disk: dispositivo di ingresso/uscita, per
memorizzare le informazioni in modo stabile ma reversibile. È
amovibile (posso sostituire un disco con un altro, semplicemente
togliendolo dal drive). È notevolmente più lento di un hard disk.
ALTRE PERIFERICHE:

Stampante: dispositivo di uscita su carta.

Lettore dischi ottici (CD-ROM, DVD-ROM): dispositivo di
ingresso, analogo a floppy disk perché amovibile, ma più capace e
non scrivibile.

Masterizzatore dischi ottici: scrive (tipicamente in modo
irreversibile) i dischi ottici. I dischi usati sono di un tipo apposito. In
lettura è identico al lettore descritto sopra.

Scheda di rete: dispositivo per trasmettere e ricevere dati su una rete
locale. Normalmente accetta un cavo di collegamento, ma può essere
anche wireless (senza fili, cioè radio).

Altre connessioni wireless: per trasmettere e ricevere dati su
collegamenti a breve raggio (10, max 100 metri) l’interfaccia
Bluetooth (radio a bassa potenza). Per collegamenti a brevissimo
raggio, a vista (max 1 metro) l’interfaccia Fast Infrared (FIR), a
tecnologia a infrarossi come il telecomando della TV.

Modem: dispositivo per il collegamento a una linea telefonica. In
versione “analogica” (56 Kb/s), ADSL (centinaia di kbps ma
prestazioni non garantite), ISDN (128 kbps con garanzie di
prestazioni)

Scheda audio: dispositivo per l'acquisizione, l'elaborazione e
l'emissione di informazioni acustiche, memorizzate in forma digitale.

Interfaccia universale USB (Universal Serial Bus): non è una
periferica in sé, ma vi si possono collegare moltissimi dispositivi
tradizionali come quelli elencati sopra (inclusi dischi rigidi esterni,
masterizzatori CD esterni...) e anche oggetti di nuova concezione
come memorie esterne di archiviazione dati.

Interfaccia multimediale Firewire o IEEE 1394: non è una
periferica in sé, ma è progettata per il collegamento di periferiche
audiovideo (dispositivi musicali digitali, videocamere digitali...).
1.5
Architettura interna dell'elaboratore
Architettura significa “come è costruito”.
Un personal computer è costruito secondo lo schema seguente.
PERIFERICHE
PERIFERICHE
PERIFERICHE
Processore
ALU
REGISTRI
MEMORIA
PRIMARIA
Unità di
controllo
BUS
Ogni “blocchetto” di questo schema rappresenta un circuito elettronico
con precise funzioni. I circuiti sono tutti collegati fra loro in modo da
poter interagire.
In particolare, possiamo dire che esistono:
parti per l’elaborazione dei dati (processore)
parti per la memorizzazione dei dati (memoria primaria; memorie
secondarie e “di massa” poste su periferiche, p.es. disco rigido)
parti per il trasferimento dei dati (all’interno: il bus; tra interno ed
esterno: periferiche)
Prima di vedere il funzionamento delle varie parti, consideriamo la
rappresentazione dell'informazione all'interno dell'elaboratore.
Rappresentazione dell'informazione
Informazione = Significato, Contenuto
L'elaboratore elettronico tratta informazione.
L'elaboratore elettronico è in grado di agire solo su numeri con
operazioni di tipo

aritmetico: A = B + C

logico: if A = 1 then ...
Perciò tutte le informazioni sono codificate in forma numerica.
1.6
MEMORIZZAZIONE DEI DATI
Dentro a un calcolatore, le informazioni sono costituite da unità
elementari, dette parole o word.
Ogni architettura di calcolatore (ogni "famiglia" di macchine) ha parole
di una data dimensione, prefissata e stabilita quando il calcolatore viene
progettato.
Questa dimensione dipende dalla struttura dei circuiti di memorizzazione
(memoria, registri), di trasferimento (bus) e di trattamento (CPU) delle
informazioni.
QUANTO È GRANDE UNA PAROLA?
Le dimensioni delle parole si misurano in byte.
Una parola può essere lunga da 1 a 4 o più byte. 4 byte è normale.
1 byte è costituito da 8 bit, cioè 8 cifre binarie (binary digit).
(C'è stato un tempo in cui anche i bit in un byte potevano essere 6, 7, o
9, ...)
RAPPRESENTAZIONE IN BASE 2
Una cifra binaria è un numero intero in base 2, ossia che va da 0 a 1.
Cioè, in pratica, può solo valere o 0 oppure 1.
Perchè base 2? Perchè 0 e 1 si possono rappresentare facilmente: con una
luce accesa o spenta; con una crocetta fatta o non fatta; con un
interruttore aperto o chiuso; con un circuito elettrico attivo o inattivo.
La matematica ci dice che un numero espresso in base A con N cifre può
rappresentare AN valori distinti.
Un byte (numero binario a 8 cifre) può quindi può rappresentare
numeri binari tra 0 e 28 – 1 = 255
(in informatica si conta sempre partendo da zero).
Quella che segue è una tabella completa di corrispondenze tra numeri in
base dieci (espressi con 3 cifre) e gli stessi in base due (a 8 cifre). La
tabella prevede valori tra 0 e 127. Per avere i valori tra 128 e 255, che è il
massimo ottenibile con 8 cifre binarie, occorre sommare 128 alla forma
decimale.
Nella forma binaria invece c'è un trucco molto comodo. Quello che
cambia è solo la prima cifra (che qui è zero e tra 128 e 255 è invece uno).
1.7
Decimale Binario
000
00000000
001
00000001
002
00000010
003
00000011
004
00000100
005
00000101
006
00000110
007
00000111
008
00001000
009
00001001
010
00001010
011
00001011
012
00001100
013
00001101
014
00001110
015
00001111
016
00010000
017
00010001
018
00010010
019
00010011
020
00010100
021
00010101
022
00010110
023
00010111
024
00011000
025
00011001
026
00011010
027
00011011
028
00011100
029
00011101
030
00011110
031
00011111
Decimale Binario
032
00100000
033
00100001
034
00100010
035
00100011
036
00100100
037
00100101
038
00100110
039
00100111
040
00101000
041
00101001
042
00101010
043
00101011
044
00101100
045
00101101
046
00101110
047
00101111
048
00110000
049
00110001
050
00110010
051
00110011
052
00110100
053
00110101
054
00110110
055
00110111
056
00111000
057
00111001
058
00111010
059
00111011
060
00111100
061
00111101
062
00111110
063
00111111
Decimale Binario
064
01000000
065
01000001
066
01000010
067
01000011
068
01000100
069
01000101
070
01000110
071
01000111
072
01001000
073
01001001
074
01001010
075
01001011
076
01001100
077
01001101
078
01001110
079
01001111
080
01010000
081
01010001
082
01010010
083
01010011
084
01010100
085
01010101
086
01010110
087
01011111
088
01011000
089
01011001
090
01011010
091
01011011
092
01011100
093
01011101
094
01011110
095
01011111
Decimale Binario
096
01100000
097
01100001
098
01100010
099
01100011
100
01100100
101
01100101
102
01100110
103
01100111
104
01101000
105
01101001
106
01101010
107
01101011
108
01101100
109
01101101
110
01101110
111
01101111
112
01110000
113
01110001
114
01110010
115
01110011
116
01110100
117
01110101
118
01110110
119
01110111
120
01111000
121
01111001
122
01111010
123
01111011
124
01111100
125
01111101
126
01111110
127
01111111
PERCHÈ BYTE E PAROLE?
La ragione per inventare il byte e tenerlo distinto dalla parola è che:

la parola è l'unità di rappresentazione all'interno di una macchina

il byte è l'unità di comunicazione tra macchine.
Quindi le informazioni, finchè sono memorizzate dentro una macchina,
sono organizzate in parole.
Quando però devono essere scambiate si organizzano in byte, perchè non
è detto che la macchina di origine e la macchina di destinazione usino la
stessa organizzazione interna.
Per esempio, una macchina potrebbe organizzare una parola nel modo
seguente:
parola
byte 1
byte 2
byte 3
byte 4
1.8
mentre un'altra macchina potrebbe organizzarla come segue:
parola
byte 4
byte 3
byte 2
byte 1
(notare che l'ordine è diverso e quindi non si possono sovrapporre).
Come si rappresenta l'informazione
CODIFICA
Per ogni tipo di informazione, esiste un codice.
Un codice è una legge che fa corrispondere a una determinata
informazione un determinato simbolo o una sequenza di simboli.
Questi simboli sono rappresentati nell’elaboratore come
numeri in base 2.
Quando ho un numero o una sequenza di numeri in base 2, se mi viene
detto qual è il codice di cui esso rappresenta un simbolo, allora posso
recuperare ed utilizzare l’informazione originale.
Quindi per usare un’informazione memorizzata in forma digitale devo
avere 2 cose:
•
L’elenco dei simboli che la rappresentano
•
Le regole di codifica (il “codice” usato)
TIPI DI INFORMAZIONI
L'elaboratore, al suo livello più basso (diciamo quasi al livello elettrico),
tratta essenzialmente i seguenti tipi di dati:
– Informazione testuale: testo
– Informazione numerica: valori numerici interi/reali
Esso ovviamente può trattare un gran numero di tipologie di
informazioni, ma questi sono i tipi di base, con cui vengono espressi gli
altri tipi di informazione.
Cominciamo dal testo che è più semplice.
INFORMAZIONI TESTUALI
Il byte è stato inventato come un gruppo di bit sufficienti a
rappresentare un carattere.
I caratteri dell'alfabeto inglese sono 26, quindi come minimo un byte
deve consentire 26 codici distinti.
Per fare questo non basterebbe un byte di 4 bit (24 = 16), ma uno di 5 bit
basterebbe (25 = 32 > 26)
1.9
In realtà, rappresentare solo i caratteri dell'alfabeto è limitativo.
Vorrei poter rappresentare anche le cifre.
Vorrei poter rappresentare anche la punteggiatura.
Vorrei poter rappresentare anche qualche simbolo (p.es. aritmetici).
Vorrei poter aggiungere "caratteri" speciali che marchino p.es. la fine di
una riga, l'inizio e la fine di una trasmissione, e svolgano altre funzioni di
controllo.
Vorrei anche il lusso di distinguere le 26 lettere in maiuscolo dalle stesse
26 lettere in minuscolo.
Una specie di "alfabeto esteso" di questo tipo è il codice ASCII
American Standard Code for Information Interchange.
Il codice ASCII è una convenzione per trasferire dell'informazione fra
architetture di calcolatori differenti. (Vedi esempio sopra.)
Nel seguito è presentata la tabella ASCII completa. I codici sono 127 in
modo da poter essere usati con vecchi byte di 7 bit.
I primi 32 codici si riferiscono a "caratteri" non stampabili ma usati per il
controllo della trasmissione (i "caratteri di controllo"). Il loro nome è
riportato nella tabella, e una breve spiegazione è riportata in coda alla
tabella.
Si può notare che, oltre al codice in base 10, sono riportati i codici in
base 8 (ottale/octal, "oct") e 16 (esadecimale/hexadecimal, "hex"). Il
motivo per usare queste basi è che:
 in base 16, ogni cifra corrisponde esattamente a un gruppo di 4 cifre binarie (in base 16
le cifre sono: 0 1 2 3 4 5 6 7 8 9 A B C D E F )
 in base 8, ogni cifra corrisponde esattamente a un gruppo di 3 cifre binarie
La conversione tra la base 2 e le basi potenze di 2 (4, 8, 16...) è quindi
velocissima, perché si può fare per gruppi di cifre, anziché solo per
valore totale.
Inoltre, se un byte è di 8 bit e uso la base 16, mi servono solo 2 cifre per
rappresentare qualunque valore, quindi la scrittura è molto più compatta.
BASE 2
B7 B6 B5 B4 B3 B2 B1 B0
----------- -----------
BASE 16
H1
H0
Esempio:
BASE 10
BASE 2
BASE 16
71
0
1
0
0
0
1
1
1
----------
----------
4
7
1.10
ASCII TABLE
----------Dec Hex Oct Char
Dec Hex Oct Char
Dec Hex Oct Char
Dec Hex Oct Char
----------------------------------------------------------------------0 00 000 NUL
32 20 040 SPace 64 40 100 @
96 60 140 `
1 01 001 SOH
33 21 041 !
65 41 101 A
97 61 141 a
2 02 002 STX
34 22 042 "
66 42 102 B
98 62 142 b
3 03 003 ETX
35 23 043 #
67 43 103 C
99 63 143 c
4 04 004 EOT
36 24 044 $
68 44 104 D
100 64 144 d
5 05 005 ENQ
37 25 045 %
69 45 105 E
101 65 145 e
6 06 006 ACK
38 26 046 &
70 46 106 F
102 66 146 f
7 07 007 BEL
39 27 047 '
71 47 107 G
103 67 147 g
8
9
10
11
12
13
14
15
08
09
0A
0B
0C
0D
0E
0F
010
011
012
013
014
015
016
017
BS
HT
LF
VT
FF
CR
SO
SI
40
41
42
43
44
45
46
47
28
29
2A
2B
2C
2D
2E
2F
050
051
052
053
054
055
056
057
(
)
*
+
,
.
/
72
73
74
75
76
77
78
79
48
49
4A
4B
4C
4D
4E
4F
110
111
112
113
114
115
116
117
H
I
J
K
L
M
N
O
104
105
106
107
108
109
110
111
68
69
6A
6B
6C
6D
6E
6F
150
151
152
153
154
155
156
157
h
i
j
k
l
m
n
o
16
17
18
19
20
21
22
23
10
11
12
13
14
15
16
17
020
021
022
023
024
025
026
027
DLE
DC1
DC2
DC3
DC4
NAK
SYN
ETB
48
49
50
51
52
53
54
55
30
31
32
33
34
35
36
37
060
061
062
063
064
065
066
067
0
1
2
3
4
5
6
7
80
81
82
83
84
85
86
87
50
51
52
53
54
55
56
57
120
121
122
123
124
125
126
127
P
Q
R
S
T
U
V
W
112
113
114
115
116
117
118
119
70
71
72
73
74
75
76
77
160
161
162
163
164
165
166
167
p
q
r
s
t
u
v
w
24
25
26
27
28
29
30
31
18
19
1A
1B
1C
1D
1E
1F
030
031
032
033
034
035
036
037
CAN
EM
SUB
ESC
FS
GS
RS
US
56
57
58
59
60
61
62
63
38
39
3A
3B
3C
3D
3E
3F
070
071
072
073
074
075
076
077
8
9
:
;
<
=
>
?
88
89
90
91
92
93
94
95
58
59
5A
5B
5C
5D
5E
5F
130
131
132
133
134
135
136
137
X
Y
Z
[
\
]
^
_
120
121
122
123
124
125
126
127
78
79
7A
7B
7C
7D
7E
7F
170
171
172
173
174
175
176
177
x
y
z
{
|
}
~
DEL
ASCII CONTROL CHARACTER ABBREVIATIONS
------------------------------------NUL
STX
EOT
ACK
null
start of text
end of transmission
acknowledge
SOH
ETX
ENQ
BEL
start of heading
end of text
enquiry
bell
BS
LF
FF
SO
backspace
linefeed
form feed
shift out
HT
VT
CR
SI
horizontal tabulation
vertical tabulation
carriage return
shift in
DLE
DC2
DC4
SYN
data link escape
device control 2
device control 4
synchronous idle
DC1
DC3
NAK
ETB
device control 1
device control 3
negative acknowledge
end of transmission block
CAN
SUB
FS
RS
DEL
cancel
substitute
file separator
record separator
delete
EM
end of medium
ESC escape
GS
group separator
US
unit separator
ETB end of transmission block
Questa tabella di codici è un po' antiquata, ma ancora usatissima come
"minimo comune denominatore" fra architetture differenti.
Per rappresentare un testo, è sufficiente usare una sequenza di byte in
cui ogni byte contiene un numero, il codice ASCII di un carattere.
Sapendo che si tratta di un testo, possiamo decodificarlo usando la tabella
ASCII. Esempio con codici in base 10 (prima colonna della tabella):
67
105
97
111
44
C
i
a
o
,
32
109 111 110 100 111
m
o
n
d
1.11
o
NUMERI INTERI
Abbiamo visto come le parole possono contenere codici di caratteri.
Ovviamente una parola di calcolatore può essere interpretata, secondo
necessità, come semplice valore numerico intero.
Se una parola è di 32 bit, i valori numerici rappresentabili possono essere
0 .. 232 – 1 = 4.294.967.295 (quattromiliardierotti).
Questo però implica solo valori positivi.
Se introduco anche il segno +/– , dovrò scegliere una convenzione per
rappresentare i numeri negativi.
Il risultato finale è che di questi quattromiliardi di valori, duemiliardi
saranno positivi e duemiliardi negativi.
NUMERI REALI
Potrei anche desiderare di fare dei calcoli su numeri reali.
Per rappresentare i numeri reali si usa la forma esponenziale.
Dei bit che compongono la parola, alcuni vengono interpretati come
mantissa, altri come esponente, Mantissa ed esponente sono valori interi
con i loro segni, e vengono interpretati come segue:
PAROLA
Mantissa
segno
valore
segno
bit 31
bit 30 bit 29
...
bit 21 bit 20
(L'esempio è con una parola a 4 byte, ossia 32 bit)
Esponente
valore
bit 19 bit 18
...
Valore = Mantissa  Base Esponente
La base è una costante (qui ovviamente vale 2)
Occorre memorizzare Mantissa ed Esponente.
Se la mantissa è positiva o negativa, il valore è rispettivamente positivo o
negativo.
Se l'esponente è positivo o negativo, il valore è rispettivamente maggiore
o minore di 1.
Quindi gli esponenti negativi caratterizzano i valori frazionari.
In questa forma è possibile rappresentare numeri in un intervallo molto
più esteso che non con la forma intera.
L'altro lato della medaglia è che i dati estremi (molto grandi e molto
piccoli) non si possono rappresentare con la stessa precisione di quelli
intermedi. Posso scegliere tra precisione ed estensione, ma non posso
pretendere entrambe.
L'unica via per aumentare la precisione rispetto all'esempio è usare
rappresentazioni più estese:
1.12
bit 0
1. rappresentazione in doppia precisione: usa due parole, quindi un
totale di 64 bit
2. rappresentazione in doppia precisione lunga: usa 80 bit
Come l'elaboratore esegue un programma
L’elaboratore dispone di vari programmi, che normalmente sono
archiviati su disco rigido (hard disk). Questa è la memoria secondaria.
Quando occorre eseguire un programma, esso viene trasferito in
memoria primaria (la RAM).
Una volta in memoria primaria, il programma può essere eseguito
istruzione per istruzione.
Un programma, poi, agisce su determinati dati.
Anche questi dati devono essere in memoria primaria. Andranno poi a
finire su memoria secondaria (p.es. sul disco rigido; p.es. su una memoria
esterna USB) una volta terminato il lavoro.
Vediamo ora il funzionamento delle parti illustrate nel diagramma già
visto, che replichiamo qui: bus, memoria, processore e periferiche.
PERIFERICHE
PERIFERICHE
PERIFERICHE
Processore
ALU
REGISTRI
MEMORIA
PRIMARIA
Unità di
controllo
BUS
IL BUS
Il bus è un circuito di collegamento, che si occupa:
1) di fare in modo che ciascun circuito possa collegarsi a tutti gli altri per
trasferire dati
2) di controllare che due circuiti non cerchino di trasferire dati
contemporaneamente.
Il nome deriva proprio dalla sua funzione di trasporto pubblico.
1.13
Possiamo pensare il bus come se fosse diviso in “corsie”: ciascuna cosria
trasporta informazioni di un determinato tipo.
dati
indirizzi
linee di controllo (comandi vari)
LA MEMORIA PRIMARIA (RAM)
La memoria è un circuito elettrico.
Dal punto di vista logico, ossia per il programma, essa è una sequenza di
parole.
Ogni parola ha una sua lunghezza (p.es. 32 bit = 4 byte).
Ogni parola ha anche una sua posizione. C'è una parola nella posizione 0,
una parola nella posizione 1, una parola nella posizione 2, una parola
nella posizione 3...
Il numero che indica la posizione della parola si chiama il suo indirizzo.
Quando sul bus dati compare, poniamo, l'indirizzo 12, la memoria sa che
deve accedere alla tredicesima parola (N.B.: SI CONTA DA ZERO).
Accedere per farne che cosa?
La memoria sarà in grado di ricevere un comando che dice se quella
parola va letta oppure scritta. Perchè dobbiamo ricordarci che stiamo
parlando della memoria di lavoro, in cui occorre scrivere i programmi da
eseguire e i dati, perchè successivamente il processore li possa leggere ed
eventualmente nuovamente scrivere una volta modificati.
Scrittura della memoria: sul bus compare un dato (nella “corsia”
riservata ai dati).
Poi sul bus compare un indirizzo (nella “corsia” riservata agli indirizzi).
Infine sul bus compare il comando di scrittura memoria (sempre in una
apposita “corsia”).
A questo punto, la memoria legge il dato e lo memorizza nella posizione
richiesta.
Lettura della memoria: sul bus compare un indirizzo (nella “corsia”
riservata agli indirizzi).
Poi sul bus compare il comando di lettura memoria (in apposita “corsia”).
A questo punto, la memoria prende il dato dalla posizione richiesta e lo
mette sul bus (sempre nella corsia apposita) perchè chi lo ha richiesto
possa leggerlo.
1.14
LE PERIFERICHE
Le periferiche sono dispositivi esterni, di cui abbiamo già visto un
elenco.
Si tratta degli oggetti che consentono la comunicazione con il mondo
esterno (con le persone, con altre macchine, con la rete telefonica...).
Possono avere funzione di ingresso (input): il mondo esterno introduce
informazione nel calcolatore. Esempi: la tastiera, il mouse.
Oppure possono avere funzione di uscita (output): il calcolatore emette
informazione nel mondo esterno. Esempio: la stampante, il monitor.
Oppure ancora possono avere entrambe le funzioni (input/output o I/O).
Esempio: la scheda di rete, il modem.
Una periferica normalmente si collega a una porta. Una porta è (come il
nome lascia intendere) un oggetto che consente l'ingresso o l'uscita di
informazioni.
Esistono vari tipi di porte. In generale ogni tipo di porta può essere usato
per più di un tipo di periferica. Ma qualcuna è più generale di altre. Per
esempio:
•
Le porte VGA si usano quasi solo per monitor video.
•
Le porte PS/2 si usano solo per mouse e tastiere.
•
Le porte “parallele” o “stampante” o “Centronics” si usano quasi solo
per le stampanti. Tendono comunque a essere sostituite dalle porte
USB.
•
Le porte Firewire si usano per qualunque dispositivo ad alta velocità
(audio/video, ma anche scanner, masterizzatori DVD...)
•
Le porte USB si usano per quasi qualunque tipo di periferica (mouse,
tastiera, modem, scanner, dischi esterni, interfacce Bluetooth,
periferiche di memorizzazione...)
Una porta è formata da:
1. un connettore: una presa elettrica dove si attacca fisicamente un cavo o
un apparecchio periferico. Esempio (schematico, visto di fronte):
(altri esempi si possono avere guardando sotto un telefono cellulare).
Ogni connettore ha una forma diversa da quelli di altri tipi di porte, per
evitare di fare collegamenti non permessi. Di conseguenza un tipo di
porta si può facilmente identificare guardando la forma del connettore.
2. un'interfaccia: alcuni circuiti elettronici che si occupano di consentire
la trasmissione dell'informazione verso l'esterno (nel caso di output) o
l'interno (nel caso di input). Per esempio, amplificatori che danno potenza
al segnale elettrico, per consentirgli di viaggiare su cavi lunghi qualche
metro. Altro esempio: circuiti che ricevono le parole “tutte in una volta”
1.15
(si dice: in parallelo) e le ritrasmettono “un bit alla volta in sequenza” (si
dice: in serie).
3. una memorietta piccola, che contiene una sola parola. Una memoria
simile si chiama un registro. In questo registro si posteggia il dato in
ingresso, in attesa che il calcolatore trovi un momento libero per
trasferirlo in memoria primaria, oppure il dato in uscita, in attesa che la
periferica se lo legga.
4. eventualmente, una memoria un po’ più estesa per parcheggiare più di
una parola per un tempo un po’ più lungo. Questa memoria si chiama un
buffer. Ma siccome le prestazioni degli elaboratori sono sempre più
elevate, spesso il buffer non si fa presso la porta ma direttamente
occupando uno spazio in memoria primaria (RAM), senza perdere in
efficienza.
IL PROCESSORE
Il processore è quello che esegue i programmi. È un circuito elettronico
molto complesso e quindi, al suo interno, si possono distinguere varie parti:
1. L'unità aritmetico-logica o ALU (arithmetic-logical unit). Essa esegue
le istruzioni, che sono di tipo aritmetico (A + B) o logico (IF A = B).
2. L'unità di controllo. Essa prende le istruzioni e i dati dalla memoria,
comanda la ALU perchè esegua le istruzioni, scrive i risultati in memoria, e
comanda il flusso di esecuzione (vedi spiegazione sugli algoritmi).
3. Alcuni registri. Nei registri vengono temporaneamente posteggiati
i dati che la ALU deve elaborare e vengono anche scritti i risultati.
Se l'elaboratore fosse il mio ufficio, la memoria primaria sarebbe la
scrivania su cui appoggio tutti i documenti che mi servono per il lavoro.
Invece i registri sarebbero quei due o tre fogli su cui sto lavorando
effettivamente in un dato momento.
Un registro molto usato (che spesso – come nell'esempio che segue –
è addirittura sottinteso nelle istruzioni) si chiama accumulatore.
Per capire cosa succede all'interno dell'elaboratore proviamo a
immedesimarci nel processore mentre esegue un pezzetto di programma,
e a far finta di non essere in grado di pensare.
La memoria primaria contiene questo programma (ogni istruzione è
indicata con accanto l'indirizzo a cui si trova):
Indirizzo
Contenuto cella
12 LOAD 2
13 ADD 1
14 STORE 100
(...omissis)
100 0
Spiegazione in linguaggio umano: l'istruzione all'indirizzo 12 carica
nell'elaboratore il numero “2”; l'istruzione all'indirizzo 13 gli somma il
1.16
numero “1”; l'istruzione all'indirizzo 14 scrive il risultato dentro la cella
di memoria all'indirizzo 100. Quello che c'è tra l'indirizzo 14 e l'indirizzo
100 non mi interessa e lo ho omesso.
In pratica vogliamo fare 2+1.
Vediamo passo passo cosa succede.
Tra i registri del processore, ce n'è uno che si chiama PROGRAM
COUNTER, contatore di programma.
Esso ha una funzione speciale. Esso contiene l'indirizzo della prossima
istruzione da eseguire.
All'inizio dell'esempio, quindi, esso conterrà l'indirizzo 12.
L'unità di controllo legge il program counter e sa che deve prendere
l'istruzione contenuta all'indirizzo 12.
Quindi l'istruzione all'indirizzo 12 viene letta dalla memoria primaria e
messa in un altro apposito registro.
A questo punto l'unità di controllo interpreta l'istruzione, comandando
alla ALU di eseguirla.
(Questa istruzione sarà ovviamente una parola, cioè un numero in base 2. Però l'unità di
controllo sa che questo numero è una istruzione di programma, e quindi lo interpreta
correttamente.
Per esempio, se l'istruzione LOAD 2 fosse codificata come 01110000, potrebbe essere
interpretata anche come il numero decimale 112, oppure come il carattere ASCII
numero 112, cioè una p minuscola. Invece l'unità di controllo sa che si tratta di una
istruzione e come tale va considerata.)
La ALU, l'unità di controllo, e tutto il resto sono circuiti elettronici.
Quindi, quando diciamo “comandare”, intendiamo qualcosa di simile ad
manovrare gli interruttori di una stanza per decidere quali luci vanno
accese e quali spente; oppure a premere i pedali di un'auto per stabilire se
aumentare, diminuire o mantenere la velocità.
L'istruzione LOAD 2 viene eseguita (e il suo effetto è di mettere il valore
2 in un registro, di solito l'accumulatore). L'accumulatore contiene
quindi, in questo momento, il valore 2.
A questo punto il program counter viene incrementato: 12 + 1 → 13.
Con un meccanismo simile a prima, viene caricata ed eseguita l'istruzione
SUM 1: viene sommato 1 al valore dell'accumulatore, e il risultato
rimesso nell'accumulatore.
A questo punto l'accumulatore contiene il valore 3.
Ulteriore incremento del program counter: 14 + 1 → 14.
L'istruzione all'indirizzo 14 dice di scrivere in memoria all'indirizzo 100.
(Scrivere che cosa? Sottinteso: il contenuto dell'accumulatore.)
Dopo che questa istruzione è stata eseguita, in modo analogo alle altre, in
memoria primaria ci sarà il risultato dell'elaborazione (cioè il valore 3) e
si troverà all'indirizzo 100.
1.17