Il software

Nelle sezioni precedenti è stata analizzata la struttura hardware di un elaboratore. L'hardware è una componente fondamentale per il funzionamento di un elaboratore ma non è la componente sufficiente. Come anticipato nelle parti precedenti, una delle caratteristiche peculiari dei moderni elaboratori è quella di poter eseguire dei programmi. Si ha allora che il software (ossia l'insieme di programmi eseguiti dalla macchina) gioca un ruolo rilevante nel trasformare un insieme di circuiti elettronici in un oggetto in grado di svolgere funzioni di varia natura per l'utente. La macchina hardware discussa precedentemente, è una macchina programmabile, tuttavia essa non è direttamente utilizzabile dagli utenti, in quanto il suo uso richiederebbe di avere conoscenza sulla organizzazione fisica della macchina stessa e sul suo linguaggio macchina (ogni programma dovrebbe essere scritto usando il linguaggio macchina dell'elaboratore). Inoltre, si avrebbe un uso differente per ogni piccola differenza hardware, cosa del tutto inaccettabile. D'altro canto l'utente finale vuole:

  • Poter astrarre dalla organizzazione fisica della macchina;

  • Poter usare nello stesso modo (nel modo più simile possibile) macchine leggermente differenti dal punto di vista hardware, ad esempio l'utente non vuole usare in modo differente macchine con 2 o 4 GByte di memoria o macchine con hard disk diversi o ancora macchine con video (o stampanti o qualunque altro tipo di periferica) di modello diverso;

  • Al limite, poter usare in modo simile macchine con hardware profondamente differente;

  • Avere un linguaggio di interazione semplice per usare la macchina (per dare comandi alla macchina). In altri termini, si vuole avere un linguaggio di comandi ad alto livello per dare ordini ad un elaboratore, senza doversi preoccupare di come le operazioni (funzioni) corrispondenti verranno svolte fisicamente. Si pensi alla richiesta di stampa di un file; si vuole avere un comando di stampa che permetta di non preoccuparsi della connessione fisica tra elaboratore e stampante e così via.

  • Avere un linguaggio semplice e ad alto livello per programmare la macchina. Ciò significa che, per scrivere programmi, non si vuole dover sempre utilizzare il linguaggio macchina e il suo semplice insieme di istruzioni a basso livello, ma si vogliono avere linguaggi più astratti e vicini al modo di pensare degli utenti che permettano una più facile codifica dei modi di risoluzione dei problemi che si vogliono affrontare;

  • Avere un insieme di programmi applicativi ad alto livello per svolgere vari tipi di funzioni, quali ad esempio, elaborare un testo, mantenere un archivio di informazioni, gestire una contabilità, ....

Questi obiettivi vengono raggiunti dai moderni insiemi di elaborazione mediante la realizzazione di macchine virtuali al di sopra della macchina reale fornita dall'hardware, come schematizzato nella figura 1. L'idea è cioè quella di creare al di sopra della macchina hardware reale (HW) una macchina virtuale astratta che abbia le funzionalità desiderate e che sia facile da utilizzare per l'utente fornendo funzioni ad alto livello.

L'utente interagisce solo con tale macchina virtuale che si deve preoccupare di fare in modo che ogni comando ad alto livello fornito dall'utente venga "tradotto" nell'opportuno comando (o sequenza di comandi) che realizza la stessa funzione sulla macchina fisica. Tale traduzione è necessaria in quanto la macchina fisica potrà eseguire solamente programmi nel suo linguaggio macchina.

Figura 1 - Il concetto di macchina virtuale

La macchina realizzata al di sopra della macchina fisica si dice virtuale in quanto essa non esiste fisicamente; essa viene infatti realizzata mediante software, ossia mediante un insieme di programmi. Tale software prende generalmente il nome di "software di base".

IL SOFTWARE DI BASE

Il software è costituito da un insieme di programmi; un programma è una sequenza di istruzioni in un linguaggio di programmazione. Un linguaggio di programmazione definisce un insieme di possibili istruzioni e il loro significato e un insieme di regole per combinare istruzioni (associando un significato anche a tali costruttori di istruzioni complesse). In altri termini, un linguaggio è definito dalla sua sintassi (insieme di istruzioni e regole per combinarle) e dalla sua semantica (significato). Ogni elaboratore fornisce un suo linguaggio macchina, ossia un linguaggio di programmazione le cui istruzioni sono direttamente eseguibili dalla macchina hardware. Al di sopra di tale linguaggio macchina è possibile definire altri linguaggi di programmazione e interazione con la macchina, fornendo delle regole per tradurre le istruzioni di tali linguaggi in opportune sequenze di istruzioni in linguaggio macchina. Ritorneremo più diffusamente su tali argomenti nella parte concernente la programmazione. Per il momento è sufficiente pensare al software di base come ad un insieme di programmi in linguaggio macchina la cui esecuzione permette di creare l'ambiente virtuale con cui l'utente si trova ad interagire.

Per fissare le idee, consideriamo un semplice esempio. Supponiamo che l'utente debba dare un comando di stampa di un file. Si è osservato che a livello fisico tale operazione è complessa, richiedendo operazioni di trasferimento dati dal disco alla stampante (via memoria centrale). La macchina virtuale (e, quindi, il software di base) fornisce all'utente un semplice comando, ad esempio:

print file

mediante il quale l'utente può richiedere la stampa delle informazioni in un file. Il comando viene dato dall'utente alla macchina virtuale; in corrispondenza a tale comando l'insieme di programmi che costituiscono la macchina virtuale compie le seguenti operazioni:

  • Riconosce se il nome di comando fornito dall'utente è uno di quelli validi. Il software di base fornisce un insieme finito di comandi; l'utente deve quindi dare uno dei comandi conosciuti alla macchina virtuale altrimenti la macchina non saprà che cosa l'utente vuole fare (e non sarà in grado di fare una traduzione per la macchina HW). L'insieme di comandi prende il nome di "linguaggio di comandi". Ciò non significa che l'utente non possa richiedere alla macchina altre funzioni, al di fuori di quelle di base fornite dal linguaggio di comandi. In questo caso, però, l'utente dovrà fornire anche il programma per realizzare la nuova funzione che vuole svolgere;

  • Traduce il comando astratto fornito dall'utente nella opportuna sequenza di comandi a basso livello per la macchina fisica e fa eseguire tali comandi. Solitamente le sequenze di istruzioni (programmi) in linguaggio macchina corrispondenti ai comandi del linguaggio usato dall'utente vengono generate una volta per tutte e memorizzate su un supporto di memoria secondaria. Questo significa che non è necessario effettuare la traduzione di un comando ogni volta; tale traduzione viene semplicemente reperita sul disco. In questo modo si può direttamente eseguire il programma che realizza il comando sulla macchina. Si noti che questo è possibile solo perché i comandi a disposizione dell'utente sono in numero finito e noto a priori;

  • Fornisce in risposta all'utente informazioni riguardo l'avvenuta esecuzione del comando richiesto.

In questo modo l'utente non vede assolutamente come la macchina fisica sia fatta e come il suo comando sia stato fisicamente eseguito, e può semplicemente usare il linguaggio di interazione fornito dalla macchina virtuale. Si può quindi astrarre dalle caratteristiche fisiche della macchina e si può anche fare in modo che macchine fisicamente differenti siano usabili in modo simile; si tratta, infatti, di costruire al di sopra delle macchine fisiche diverse delle macchine virtuali uguali (in particolare, questo richiede che si abbiano, per ogni comando della macchina virtuale, diversi programmi di traduzione dei comandi in comandi a livello della macchina fisica: un traduttore per ogni macchina fisica differente o, in altri termini, una traduzione differente per ogni macchina con hardware differente).

Nella discussione fino ad ora abbiamo immaginato che al di sopra della macchina fisica possa essere realizzata una macchina virtuale che interagisce con l'utente. In realtà, non vi sono limiti al numero e la tipo di macchine virtuali che possono essere realizzate. Il software di base moderno può anzi essere visto come strutturato a diversi livelli definendo così una gerarchia di macchine virtuali come mostrato in figura 2.

Figura 2 - Gerarchia di macchine virtuali

Ogni macchina virtuale definisce un livello di astrazione a cui è possibile utilizzare la macchina fisica; in particolare, ogni livello fornisce un insieme di funzioni (sempre più astratte man mano che ci si allontana dalla macchina fisica). Per ogni funzione fornita da un livello, deve essere fornito anche il modo di traduzione in funzioni di livelli sottostanti. Ciò permette, infatti, di tradurre ina qualsiasi funzione di qualunque livello nella opportuna sequenza di istruzioni sulla macchina fisica (magari attraverso più traduzioni intermedie). La struttura che si realizza in tal modo prende di solito il nome di "struttura a cipolla".

Si noti che le macchine astratte virtuali non permettono di fare permettono solo di svolgere alcuni compiti in modo più semplice (un solo comando da parte dell'utente invece di una complessa sequenza di comandi o un programma in linguaggio macchina). Una funzione non eseguibile dal calcolatore non è comunque possibile a livello di macchina virtuale in quanto non si sarebbe in grado di darne una traduzione a livello di macchina fisica.

Alcuni dei livelli di macchina virtuale vengono forniti direttamente dal software di base, altri possono essere creati dagli utenti. Programmare un elaboratore non vuol dire altro se non costruire un nuovo comando virtuale; la traduzione di tale nuovo comando virtuale è il programma stesso che è la sequenza di istruzioni che devono essere svolte per realizzare il comando. Tale sequenza può essere specificata direttamente in linguaggio macchina o in un qualche linguaggio intermedio (nel linguaggio di una qualche macchina virtuale) che verrà poi tradotto in linguaggio macchina.

Questo meccanismo di astrazione e di costruzione di nuove astrazioni per realizzare, nel modo più semplice possibile, le funzioni che interessano agli utenti è ciò che rende estremamente potenti e flessibili gli elaboratori. Si può anzi affermare che senza tali meccanismi l'uso degli elaboratori sarebbe ancora oggi confinato a pochi ambiti tecnici o di ricerca. La possibilità di costruire livelli di uso astratto e funzioni di alto livello e soprattutto la possibilità di configurare tali funzioni a seconda delle necessità di vari tipi di utenti, ha fatto si che l'uso degli elaboratori si sia diffuso ai livelli attuali.

Nel seguito, per rendere più chiaro il concetto di struttura gerarchica a cipolla vedremo un semplice esempio che non riguarda direttamente il software di base.

Esempio

Supponiamo di avere a disposizione una semplice calcolatrice che a livello fisico è in grado di eseguire solo le seguenti operazioni: sommare uno ad un numero, sottrarre uno ad un numero, confrontare due numeri. Supponiamo tuttavia che tale calcolatrice sia programmabile, ossia sia possibile scrivere programmi (sequenze delle tre operazioni che la calcolatrice sa svolgere). Supponiamo di voler fare operazioni più complesse: ad esempio somme, prodotti o elevamenti a potenza. Ovviamente tali operazioni possono essere fatte sulla nostra semplice calcolatrice eseguendo lunghissime sequenze di operazioni di somma di una unità. Vediamo come sia possibile realizzare macchine virtuali astratte che permettano una facile esecuzione di tali calcoli.

Livello 0 (HW): la macchina sa eseguire solo quattro operazioni:

  • somma-1 a un numero;

  • sottrai-1 a un numero;

  • confronta due numeri;

  • salto del flusso di esecuzione;

Livello 1: si definisce una funzione ad alto livello "somma di due numeri"; l'utente può sommare con una sola operazione (facile) ma non può ancora fare in modo facile dei prodotti. Poiché la macchina fisica non è in grado di svolgere direttamente un'operazione di somma di due numeri, ci deve essere una funzione di traduzione da livello 1 a livello 0, ossia una definizione di somma in termini di somma-1 e sottrai-1 in modo tale che dato il comando alla macchina virtuale di sommare due numeri X e Y, questo sia tradotto nella opportuna sequenza di operazioni elementari somma-1 e sottrai-1 che, quando eseguite dalla macchina HW, esegue la somma desiderata. L'idea è la seguente: "dati X e Y da sommare, si esegue somma-1 a X per Y volte", ossia

  1. confronta Y con 0, se sono uguali il valore attuale è X;

  2. se non sono uguali, allora somma-1 a X e sottrai-1 a Y e ritorna al passo 1;

In questo modo si ha che viene sommato 1 a X per Y volte. La traduzione a livello basso e l'esecuzione avvengono di nascosto per l'utente. L'esempio mostra quindi come sia possibile realizzare una macchina virtuale per eseguire delle somme a partire da una semplice macchina fisica. Tala possibilità è dovuta principalmente al fatto che la macchina fisica è programmabile e al fatto che si sia potuto scrivere un programma di traduzione per la funzione astratta "somma".

Livello 2: a partire dalla funzione somma del livello 1 è possibile definire una funzione "prodotto" che consenta all'utente di fare in modo semplice il prodotto di due numeri. L'idea è che il prodotto può essere definito nel modo seguente: "dati X e Y da moltiplicare, sommare X per Y volte", per cui può essere definita una traduzione della funzione prodotto:

  1. poni Z=X e confronta Y con 1, se sono uguali il valore attuale di Z è il prodotto tra X e Y;

  2. se non sono uguali, allora somma X a Z e sottrai-1 a Y e ritorna al passo 1.

Si noti che in questo modo la funzione astratta "prodotto" del livello 2 è realizzata in termini di operazioni del livello 1 ("somma") e del livello 0 ("sottrai-1" e "confronta").

In modo analogo si potrebbero definire livelli più astratti con funzioni più sofisticate (in particolare si può dimostrare che a partire dal livello 0 scelto è possibile, usando vari modi di combinare tali funzioni, riprodurre qualunque funzione matematica calcolabile).

L'aspetto importante che questo esempio permette di mettere in evidenza è il fatto che ad ogni comando astratto per la macchina virtuale deve corrispondere un programma (una sequenza di operazioni) sulla macchina HW fisica che sia equivalente, ossia permetta di svolgere la stessa funzione. Senza tali programmi non sarebbe possibile per l'utente usare un elaboratore. I programmi che corrispondono alla traduzione dei comandi dell'utente vengono mantenuti perennemente in memoria secondaria.

In conclusione, è quindi importante osservare che il software è fondamentale per poter usare un calcolatore, l'hardware da solo, sebbene concettualmente permetta di svolgere qualunque operazione, non sarebbe sufficiente. Il software e la possibilità di scrivere dei programmi per svolgere sempre nuove funzioni sono la caratteristica fondamentale degli elaboratori e ciò che rende l'elaboratore utilizzabile dagli utenti.

FUNZIONI DEL SOFTWARE DI BASE

Il software di base di un moderno sistema di elaborazione svolge un numero considerevole di funzioni. In particolare, tali funzioni possono essere, a livello molto grossolano (e tenuto conto degli aspetti che prenderemo in considerazione), suddivise in due parti:

  • Sistema operativo: è un insieme di programmi il cui compito è la gestione dell'elaboratore e la sua facile utilizzazione da parte dell'utente; tra le funzioni che svolge vi sono:

    • configurazione e accensione della macchina;

    • gestione delle informazioni in memoria secondaria: il file system;

    • strumenti per l'accesso a tali informazioni;

    • gestione del processore e della memoria principale (ossia loro uso ottimale);

    • gestione delle risorse (stampanti, dischi, nastri ...); ad esempio uso semplificato e astratto delle risorse per l'utente, uso ottimale per il sistema;

    • fornisce un linguaggio di comandi astratto per l'interazione tra l'utente e il sistema;

    • supporto per la comunicazione tra utenti e tra elaboratori (software di rete per il caso di elaboratori connessi in rete);

    • supporto per programmi applicativi.

  • Linguaggi e ambienti di programmazione ad alto livello: il software di base fornisce cioè strumenti per l'uso di linguaggi di programmazione ad alto livello, ad esempio:

    • interpreti e compilatori per tali linguaggi (ossia strumenti per tradurre programmi in linguaggi ad alto livello, in programmi a linguaggio macchina);

    • strumenti per lo sviluppo di programmi.

In seguito analizzeremo in dettaglio tali funzioni svolte dal software di base; in particolare dapprima analizzeremo i sistemi operativi.

Last updated

Was this helpful?