19. Dagli algoritmi alle macchine virtuali |
|
Lavorare con un calcolatore non significa solo
lavorare con uno strumento elettronico. Ogni volta che accendiamo un
calcolatore agiscono due componenti fondamentali ed entrambe
necessarie: hardware (HW): è la parte fisica del calcolatore e
comprende i circuiti elettronici e tutti gli altri dispositivi
fisici presenti nel calcolatore; software (SW): è la componente non
fisica del calcolatore ed è costituita dai programmi memorizzati
dentro il calcolatore; è il SW a rendere così flessibile il
comportamento di questa macchina rendendola in grado di eseguire una
varietà infinita di compiti.
Precursori del sofware sono
stati gli algoritmi numerici introdotti fin dall'antichità per
risolvere problemi matematici di vario genere: l'esecuzione delle
istruzioni che componevano tali algoritmi era affidata alle facoltà
"meccaniche" dell'intelletto umano.
Nella scrittura del SW
giocano un ruolo fondamentale i linguaggi di programmazione. La loro
evoluzione ha caratterizzato fortemente i diversi settori della
informatica condizionando talvolta la stessa progettazione dei
calcolatori.
A partire dagli anni '50 si è compreso che il
SW permette di trasformare una "macchina primitiva" in una macchina
più ricca di funzionalità o radicalmente diversa rispetto a quella
fisica. Una siffatta macchina, ottenuta grazie ad un opportuno
software, viene denominata "macchina virtuale". |
|
Fig. 150. Algoritmo di
Euclide per il calcolo del massimo comun divisore. Alla base dello
sviluppo di software (cioè, i programmi per il funzionamento del
computer) c'è il concetto di algoritmo. Infatti, un algoritmo è un
procedimento risolutivo costituito da un insieme finito di
istruzioni che, eseguite in ordine e in modo preciso, permettono di
determinare i risultati del problema a partire dalle informazioni a
disposizione. Ogni istruzione deve essere sufficientemente
elementare per poter essere eseguita 'meccanicamente' e senza
ambiguità. La parola "algoritmo" proviene dal nome dello
studioso persiano al-Khowarizmi, il cui testo di aritmetica (825
d.C. circa) conteneva numerosi procedimenti per risolvere problemi
algebrici. L'algoritmo di Euclide rappresenta un esempio classico di
algoritmo non banale e si trova descritto negli Elementi di Euclide
(circa 300 a.C.). Questo algoritmo permette di determinare il M.C.D.
di due numeri naturali ed è molto più efficiente del metodo che
richiede di elencare tutti i divisori dei due numeri considerati.
Non sappiamo se esso sia stato effettivamente scoperto da Euclide,
oppure fosse già noto. |
Algoritmo di Euclide
Sia a > 0, b ³ 0 e
a ³ b
inizio
mentre b ¹ 0 esegui
le seguenti tre istruzioni
1. r ¬ a mod
b
2. a ¬ b
3. b ¬ r
scrivi "Il M.C.D. è ", valore di a
fine |
|
Fig. 151. Alan M. Turing.
Tra i pionieri che negli anni ’30 arrivarono a definire in modo
rigoroso le proprietà degli algoritmi va sicuramente ricordato il
grande matematico inglese Alan M. Turing. Egli introdusse un modello
astratto di calcolatore universale e studiandone le caratteristiche
derivò numerosi ed importanti risultati ponendo le basi teoriche
dell'informatica. Successivamente negli anni della seconda guerra
mondiale fu coinvolto nel progetto segreto per la realizzazione del
Colossus. Contribuì poi direttamente alla progettazione dei primi
calcolatori elettronici a valvole in Gran Bretagna. |
|
|
Fig. 152. Pannello di
programmazione con fili e spinotti impiegato nei sistemi
meccanografici a schede perforate. Anche nei primi calcolatori (ad
esempio, l'ENIAC) la programmazione della macchina era basata sulla
riconfigurazione di un numero enorme di cavi ed interruttori. Tale
metodo era molto scomodo e faticoso e dava origine facilmente ad
errori. |
|
|
Fig. 153. Uno dei primi
programmi scritto da Tom Kilburn nel 1948 per il calcolatore
Manchester Mark I. La lingua che il computer è in grado di
comprendere si chiama Linguaggio Macchina. In questo linguaggio sia
i dati che le istruzioni sono rappresentate mediante stringhe di 0 e
1, come si nota nelle colonne di destra. |
|
|
Fig. 154. Alcune
istruzioni del microprocessore Motorola 6502, utilizzato all'inizio
degli anni '80. La preparazione e l’introduzione nel calcolatore di
programmi scritti nel linguaggio macchina caratterizzò la
programmazione negli anni '40 e nei primi anni '50. Poiché la
programmazione mediante questo tipo di linguaggio era
particolarmente difficile, si cercarono ben presto delle strade per
facilitare questo compito con l'introduzione dei linguaggi
simbolici. |
|
Istruzioni in linguaggio
macchina |
Significato |
|
10100101
00000110 |
Preleva dalla sesta posizione di
memoria RAM il dato e trasportalo nel registro interno
(ACCUMULATORE) dell'unità di elaborazione (CPU). |
|
01100101
00000111 |
Preleva il dato contenuto nella
settima posizione di memoria RAM e sommalo al dato contenuto
nel registro interno (ACCUMULATORE) della CPU. |
|
10000101
00000100 |
Trasferisci il risultato
dall'ACCUMULATORE alla quarta locazione di memoria
RAM. | |
|
Fig. 155. Grace Hopper.
Poiché il calcolatore è in grado di comprendere solo il linguaggio
macchina, l'utilizzazione di linguaggi di programmazione simbolici
pose il problema della traduzione: tutte le istruzioni di un
programma, prima di essere eseguite, devono essere tradotte in
linguaggio macchina. L'idea chiave fu quella di affidare questo
compito al calcolatore stesso. L’idea arrivò attorno al 1950 e una
delle prime persone a sperimentare un programma di traduzione
(compilatore) fu Grace Hopper (1906-1992), la quale nel 1951
implementò il primo compilatore A-0. |
|
|
Fig. 156. John Backus.
Nel 1954, iniziò insieme ad alcuni collaboratori presso l'IBM a
progettare il linguaggio di programmazione ad alto livello FORTRAN
(FORmula TRANslator). L’introduzione di questo linguaggio
rappresentò un passo molto importante poiché per la prima volta,
diversamente dal linguaggio macchina e dall’assembler, permise di
scrivere programmi in una forma vicina al modo con cui noi
ragioniamo sui problemi matematici. Questo linguaggio si può
considerare il progenitore di tutti i linguaggi di programmazione ad
alto livello. |
|
|
Fig. 157. a. b. Un
elettrodomestico multifunzionale: macinacaffè e sbattiuova.
Diversamente dai calcolatori, affinché l'elettrodomestico possa
svolgere una diversa funzione, è necessario sostituire una
componente fisica. Il calcolatore programmabile è come l’argilla:
può essere modellato a piacere per ottenere una varietà infinita di
macchine diverse. Poiché il SW può essere modificato con facilità,
il vantaggio di questo sistema è che la stessa macchina può svolgere
funzioni svariatissime. |
a. macinacaffè
a. sbattiuova |
|
Fig. 158. Coprocessore
matematico Intel 80387/DX-20. Nei primi personal computer le
operazioni matematiche più complesse potevano essere svolte da un
apposito circuito integrato, denominato coprocessore matematico,
oppure mediante una serie di programmi ad hoc. In questo caso, la
componente fisica può essere sostituita (virtualizzata) da un
programma SW. |
|
|
Fig. 159. Un manuale del
sistema operativo DOS versione 1.10. L'utilizzo di un calcolatore
non comporta semplicemente l'acquisto delle parti fisiche ma,
indipendentemente dall'applicazione specifica che richiediamo alla
macchina, include una serie di programmi essenziali per il
funzionamento della macchina stessa: l'insieme di questi programmi
va sotto il nome di sistema operativo (SO). I sistemi operativi
conferiscono all'hardware dei computer la capacità di dialogare in
modo amichevole con l'utente. In tal modo, l'utente dialoga con il
computer come se avesse di fronte una "macchina virtuale" dotata di
funzionalità molto più ricche di quelle offerte dalla macchina
fisica (hardware). |
|
|
Fig. 160. Simulatore di
volo per personal computer. Analogamente a quanto visto per i
sistemi operativi, un opportuno programma può trasformare un
computer in una macchina virtuale dedicata ad un compito specifico.
Il simulatore di volo costituisce un esempio emblematico di tale
processo di virtualizzazione. Con sistemi più sofisticati del
personal computer la vitualizzazione può essere spinta fino a
comprendere le sensazioni fisiche del volo. |
|
|
Copyright 1999-2001 Paolo Giangrandi - realizzazione
web Tecnoteca
s.r.l.
|