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".
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. 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.
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.
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. (a) macinacaffè (b) sbattiuova
Fig. 157. 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.
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. |
|