Con il consolidamento del concetto di Esecutore di Algoritmi e con l’avvento della Macchina di Von Neumann si fa strada l’idea di formalizzare i passi necessari alla risoluzione di un problema seguendo uno specifico piano di lavoro ovvero un dato programma.
I passi principali si possono così schematizzare:
Figura 1: La macchina di Von Neumann. Fonte: Wikipedia
Il programma veniva scritto in un linguaggio comprensibile all’elaboratore detto linguaggio macchina. La sua trascrizione era effettuata su delle schede perforate mediante apposite macchine perforatrici e letta da appositi lettori.
In particolare:
Un utilizzatore del calcolatore, per poter richiamare il proprio programma nella memoria, in prima istanza deve caricare in memoria il loader.
In sintesi:
Quello riportato è il primo esempio di programma non scritto dall’utente ma messo a disposizione per l’utilizzo efficace della macchina.
Verso la fine degli anni ‘50 il linguaggio macchina ostico per molti programmatori e prolisso nella descrizione di un programma viene sostituito da un linguaggio più vicino a quello naturale detto linguaggi ad alto livello.
Nasce l’esigenza di sviluppare dei programmi che avessero il compito di trasformare il programma scritto in un linguaggio ad alto livello con quello scritto in linguaggio macchina.
Tali strumenti vennero detti: programmi traduttore.
Il programma traduttore risulta essere una nuova un nuovo strumento a disposizione del programmatore.
L’utilizzo efficiente delle risorse di calcolo deve tenere conto di esigenze molteplici. A tale fine si riporta un esempio.
Esempio: Nell’utilizzo ordinario del calcolatore è necessario eseguire una istruzione di stampa, e contestualmente fare in modo che la CPU resta attiva.
Soluzione: Avere a disposizione un dispositivo aggiuntivo in grado di controllare esclusivamente le operazioni di I/O.
Tale dispositivo è detto canale di I/O.
A livello di programmi di utilità è necessario avere uno strumento che sincronizzi le operazioni di I/O sul canale e la CPU.
L’introduzione dei canali di I/O introduce la necessità di un utilizzo contestuale e/o contemporaneo della CPU da parte di diversi programmi in esecuzione sul calcolatore.
Nasce un nuovo concetto di programmazione quello della Multiprogrammazione.
In particolare per multiprogrammazione si intende la possibilità di un sistema operativo di gestire più programmi che utilizzano la CPU.
Problema:
Soluzione (time sharing): Ovvero ad ogni programma viene dato un fissato tempo massimo per l’uso della CPU. Tale tempo viene detto time slice
In figura viene riportato un esempio di multiprogrammazione con time sharing il cui tempo di time slice è pari a 3 unita’.
Nell’esempio si evince che il programma 2 attende solo 3 unità di tempo prima di utilizzare la CPU con una rispettiva riduzione dei tempi di attesa.
Ogni programma può utilizzare la CPU fin quando non si verifica una delle seguenti condizioni:
Nelle prime due situazioni il programma viene eliminato dalla memoria
Nelle ultime due il programma viene sospeso
Da quanto allora osservato si ha che la multiprogrammazione con il time sharing determinano la necessità della la presenza di un opportuno programma in grado di garantire la corretta sospensione e l’eventuale ripresa dei programmi nella CPU. Tale programma è detto Monitor.
Vediamo nel dettagli cosa deve di base fare un programma Monitor.
I punti essenziali sono:
Al fine di stabilire quale dei programmi in esecuzione passare in memoria quando altri programmi attendono di essere esguiti, bisogna individuare un ordine di accesso alla CPU.
La presenza di un strumento in grado di stabilire tale ordine è: lo Scheduler. Esso assegna ad ogni programma un numero di priorità che è il criterio di precedenza rispetto all’utilizzo della CPU.
In particolare i programmi che:
Quanto detto porta alla seguente definizione.
Definizione
Un Sistema Operativo è l’insieme di tutti gli strumenti (programmi)
che consentono il controllo e la gestione delle diverse risorse di
un elaboratore.
In sintesi:
Hardware + Sistema Operativo costituiscono il Software di Sistema ovvero quella che in gergo viene detta la macchina virtuale.
Verso la fine degli anni ‘50 il linguaggio macchina ostico per molti programmatori e prolisso nella descrizione
di un programma viene sostituito da linguaggi ad alto livello.
Statistica sull'utilizzo di alcuni linguaggi di porgrammazione aggiornata a Settembre 2009 Tiobe.
L’uso di un linguaggio di programmazione ad alto livello è reso possibile da particolari strumenti detti Programmi Traduttori che traducono un programma scritto in un linguaggio ad alto livello in un programma scritto in un linguaggio macchina.
I programmi traduttori possono essere suddivisi principalmente in due categorie:
Descriviamo molto in generale come lavoro un programma di tipo interprete:
Descriviamo molto in generale come lavoro un programma di tipo Compilatore. Questo tipo di strumento organizza la “costruzione” di un programma eseguibile in fasi disistinte.
Nella prima Fase:
Nella seconda Fase
Compilazione. Fonte: Wikipedia
Come prima osservazione ci si rende conto che per un programma di tipo compilatore
esiste una distinzione tra:
Codice Sorgente
Ovvero un programma scritto in un qualsiasi linguaggi ad alto livello che è il dato di ingresso del programma di tipo compilatore
Codice Oggetto
Ovvero il programma tradotto in linguaggio macchina che è fornito in uscita dal compilatore e d è pronto per essere “eseguito”.
E’ necessario dunque per procedere in tale modo un traduzione automatica del codice sorgente in codice oggetto e successivamente in programma eseguibile. Bisogna allora definire:
Facciamo un brevissima analisi comparativa tra i differenti programmi di traduzione.
Per l’Interprete
il programma scritto in un linguaggio ad alto livello è sempre sotto controllo, nel senso che eventuali errori di tipo di sintattico o semantico vengono segnalati immediatamente. Ciò comporta generalmente una dispendio di memoria.
Per il Compiltore
Le diverse fasi di traduzione con la generazione del codice oggetto ed il linking con la generazione del codice eseguibile sono logicamente e nel tempo delle fasi distinte. Una volta corretti eventuali errori di carattere semantico o sinattico nella programmazione dsi ha a disposizione un codice eseguibile che puo’ essere “lanciato” diverse volte senza dispendio di tempo e memoria ggiuntiva.
Schematicamente si può affermare che:
1. Prolusione
2. Sistemi Operativi – parte prima
3. Sistemi Operativi – parte seconda
6. Il linguaggio C – parte prima
8. Il linguaggio C – funzioni e puntatori
10. Il linguaggio C – parte terza
11. La documentazione del software
12. Dati strutturati
13. Esercizi sui dati strutturati
14. Approfondimenti di C, Stringhe e file
15. Esercizi su stringhe e file
16. La ricorsione
17. Il linguaggio c++ parte prima
18. Il linguaggio C++ - parte seconda
19. Strutture dati di tipo astratto
Testi Consigliati
Per un approfondimento sugli argomenti trattati si consiglia di leggere:
(a) A. Murli, G. Giunta, G. Laccetti, M. Rizzardi – Laboratorio di Programmazione I – Ed. Liguori
(b) G. Criscuolo, F. Tramontano, Introduzione alla programmazione. Algoritmi iterativi in C++. Ed. Manna