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 350
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. |