giovedì 2 dicembre 2010

Lezione del 2 dicembre 2010 /2

... Dalla teoria alla pratica.

Questa lezione inaugura la rotta di avvicinamento al computer come oggetto reale, cercando di comprendere come applicare gli algoritmi visti a lezione al mondo reale del computer.

In primo luogo bisogna riconoscere che anche i semplici programmi che abbiamo scritto possono essere (precisamente come le lettere e i caratteri) codificati con dei numeri. I programmi stessi quindi diventano dei dati e trovano una loro collocazione fisica nella memoria, nella stessa memoria che abbiamo finora considerato dedicata solo ai dati. (i programmi SONO dati, in fin dei conti. Dati che vengono interpretati in un certo modo dal computer, che vengono interpretati come istruzioni ed eseguite sugli altri dati presenti in memoria)

Per ragioni di tipo tecnologico, le prime memorie erano molto contenute ed estremamente costose, quindi se da una parte la teorizzazione di una memoria infinita è un comodo concetto, dall'altra è decisamente irrealistica, almeno per quello che erano i computer ai loro primordi. Ma sono queli che hanno dato il modello di quelli attuali quindi, anche se la tecnologia cambia rapidamente, lo schema base di funzionamento è ancora quello degli anni '50.

Programmi e dati devono essere in memoria per poter operare insieme, ma non tutti i dati devono necesariamente stare in memoria nello stesso tempo. Per esempio, se i nostri dati fosero i nomi degli iscritti all'università, non sarebbe sempre necessario averli interamente in memoria. Potremmo pensare di scriverli da qualche parte con un apparecchio esterno, e richiamarli ogni volta che diventano necessari, e magari solo quei dati che ci sono necessari. Questo "apparecchio esterno" è quello che oggi si chiama Hard Disk. Quando vogliamo che un dato resista all'"azzeramento" della memoria che avviene ogni volta che si toglie la corrente al computer, bisogna registrarlo su un qualche supporto che abbia la caratteristica di poterlo mantenere per un tempo indeterminato, e di poterlo recuperare quando è necessario. Questa modalità di gestione della memoria è utile anche per ragioni di efficienza, e permette di non sprecare una risorsa preziosa come la memoria operativa (la RAM, Random Access Memory). I programmi quindi, attraverso specifiche istruzioni, sono in grado di scrivere da qualche parte il contenuto di alcune aree della propria memoria, e di scrivere nella memoria valori letti dal disco. Questa serie di operazioni però è molto impegnativa, e non vorremmo dover scrivere in ogni programma delle istruzioni dettagliate su come fare. Sarebbe utile che ci fosse una specie di "servizio" cui noi chiediamo di salvare una certa area di memoria sul disco, e questo lo fa a nostro nome.

Inoltre nei nostri esempi è semrpe stato dato per implicito che un computer potesse eseguire solo un programma. Nella nostra espeirnza quotidiana sappiamo che così non è, che in un computer più programmi possono essere eseguiti contemporaneamente. Come è possibile ottenere questo risultato? La soluzione consiste nel creare un mega-programma il cui funzionamento sia quello fondamentale, e che si occupi di gestire tutte le risorse connesse al computer, come le periferiche, ma anche gestire il funzionamento dei programmi veri e propri del genere che noi abbiamo visto negli esempi. Questo programma deve essere il primo che viene eseguito e deve rimanere sempre in esecuzione. Deve permettere di recuperare dati dall'hard disk e anche programmi (che, per quanto detto all'inizio SONO dati anche loro). Il nome di questo programma speciale è sistema operativo.

Il sistema operativo permette l'esecuzione (apparentemente) contemporanea di diversi programmi, compreso se stesso. La simulazione della contemporaneità di esecuzione avviene perché il sistema operativo effettua fondamentalmente le seguenti operazioni:
1) gestisce la memoria RAM disponibile del sistema, creando delle sotto-aree che vengono assegnate ai programmi (i programmi vedono questo assegnamento come se cominciasse dalla cella 1 quindi il funzionamento dei programmi dentro un sistema operativo è identico al funzionamento dei programmi che abbiamo visto finora negli esempi).
2) gestisce tutti i programmi in esecuzione, e li porta avanti "in parallelo" concedendo a ognuno di loro un tempo di esecuzione (di frazioni di secondo) per poi bloccarlo e dare il controllo al programma successivo. In questo modo è possibile far funzionare "contemporaneamente" più programmi, anche se in ogni momento solo uno è in effetiva esecuzione (il processore può eseguire solo una istruzione alla volta!)
Quindi ogni programma in funzione nel sistema operativo, dal "proprio" punto di vista è l'unico: ha una sua memoria e vene eseguito seguendo il proprio programma.

Il sistema operativo si prende in carico la gestione di tutti quegli aspetti estranei (o non strettamente inerenti) al programma vero e proprio: la lettura della pressione dei tasti nella tastiera (e la trasmissione al programma opportuno di quei tasti), il movimento del mouse (con il clic, anche in questo caso da applicare al programma "giusto"), l'accesso al disco e alle altre periferiche, la visualizzazione, la stampa e così via.

Parlando di ambienti dove è possibile eseguire più di un programma, si può pensare di estendere una delle caratteristiche che sono state elencate sopra: la possibilità di registrare parti della memoria su un disco. Come si è ripetuto più e più volte, i dati in sé non sono che numeri. La memoria non è altro che una lunghissima sequenza di numeri privi di senso intrinseco. La semantica di quei numeri è data dal programma che li crea e gestisce, in base a come li manipola e organizza. Quindi quei dati, perché creati e gestiti unicamente da un programma, sarebbero in un certo senso di sua esclusiva proprietà visto che il loro significato è definito solo mediante l'uso che ne fa il programma corrispondente. Sarebbe però interessatne cercare il modo di memorizzare questi dati secondo un formato che contenesse già in sé almeno alcune delle informazioni riguardo i dati. Per esempio, se il programma in esecuzione fosse una rubrica, nella memoria potremmo leggere MARCO/TONTI/MARCO.TONTI@UNISALENTO.IT dove per nostra convenzione decidiamo che la barra separa i diversi campi. Senza avere l'informazione della barra però un programma, o una persona, non avrebbe nessuna informazione diretta sul significato di quella sequenza di simboli (se ci fossero stati nomi strani come SMEDSLUND o DIJKSTRA non sarebbe stato tanto chiaro che si trattava di un nome! oppure se fosse stato SERGIO/SALVATORE non avremmo avuto modo di sapere, senza guardare nel programma, qual è il nome e qual è il cognome). Cerchiamo quindi un modo per arricchire di semantica i nostri dati grezzi, anche allo scopo di renderli fruibili da programmi o da persone diverse dal nostro programma o da noi stessi.

La proposta che adottiamo è quella dello standard XML. Secondo questo standard (tralasciando alcuni dettagli tecnici) ogni valore deve essere circondato da tag che lo circostanziano. L'obiettivo è quello di arricchire con informazioni semantiche i dati "grezzi", in modo da renderli intelligibili e portabili su piattaforme, sistemi operativi e programmi diversi. Nel caso del nostro esempio, l'XML corrispondente potrebbe essere:
<persona>
   <nome>Marco</nome>
   <cognome>Tonti</cognome>
   <email>marco.tonti@unisalento.it</email>
</persona>
<persona>
...
</persona>
ecc.
Dentro le parentesi angolari (coppie di maggiore  e minore) ci sono i nomi dei valori contenuti da il tag di apertura e quello di chiusura (contrassegnato da una barra all'inizio: </nome> per esempio indica che lì finisce il nome). Notate come sia possibile non solo includere singoli valori, ma anche altri tag. Questo particolare è utilissimo e ci permette di creare strutture anche molto complesse.

Nessun commento:

Posta un commento