Software: Nascita e Sviluppo dal 1950 al 1975 Miele Romina Saviano Angela Torellini Maria Storia dell’Informatica e del Calcolo Automatico Prof. F. Perla Tec/0044 Tec/0076 Tec/0040 Indice Definizione SW Realizzazione del SW Classificazione dei LP Evoluzione dagli anni ’50 al ‘75 Algol Foltran Lisp 54 58 Cobol 59 Apl 61 Basic 64 Simula 67 Pascal 68 C Prolog 70 72 Definizione SO Compiti SO Evoluzione dei SO dagli anni ’50 al ‘75 2 Definizione Software Il termine software ha origine durante la seconda guerra mondiale. I tecnici dell'esercito inglese erano impegnati nella decrittazione dei codici tedeschi di Enigma, di cui già conoscevano la meccanica interna (detta hardware) grazie ai servizi segreti polacchi. Dopo il 1941, ad Enigma venne aggiunto un rotore, e il team di criptanalisti inglesi, capitanati da Alan Turing, si dovette interessare non più alla sua struttura fisica, ma alle posizioni in cui venivano utilizzati i rotori della nuova Enigma. Dato che queste istruzioni erano scritte su pagine solubili nell'acqua per poter essere più facilmente distrutte, e per contrasto con hardware, furono chiamate software. Il senso moderno del termine deriva dalle istruzioni date ai computer, ed è stata utilizzata per la prima volta nel 1957 da John W. Tukey, noto statistico statunitense. 3 Classificazione All'interno del software si possono distinguere tre grandi categorie: - sistema operativo: è il programma responsabile del diretto controllo e gestione dell'hardware che costituisce un computer e delle operazioni di base. Si occupa anche di controllare gli accessi degli utenti e dei processi che vengono eseguiti. - driver: il codice che permette ad un sistema operativo di pilotare un dispositivo hardware, senza sapere come esso funzioni, ma dialogandoci attraverso un'interfaccia standard. - programma applicativo: cioè un software che viene utilizzato per i bisogni dell’utente finale: dai programmi per l'ufficio ai videogiochi . 4 Realizzazione del Software Un software viene normalmente realizzato utilizzando uno o più linguaggi di programmazione. Un linguaggio di programmazione è un linguaggio formale dotato di una sintassi ben definita e si usa per scrivere programmi per calcolatori in una forma più vicina al linguaggio umano . L'alternativa sarebbe scrivere direttamente le istruzioni nel codice macchina del particolare processore, un compito improponibile per programmi non semplicissimi. Programmare in un dato linguaggio di programmazione significa generalmente scrivere uno o più semplici file di testo ASCII, chiamato codice sorgente. Il codice sorgente, contenente le istruzioni da eseguire, può essere: - eseguito passandolo ad un interprete, che eseguirà le istruzioni in esso contenute; - compilato, cioè tradotto in istruzioni di linguaggio macchina da un programma detto compilatore. Il risultato è un file binario, detto file oggetto, adeguato all’architettura hardware di destinazione. In seguito tutti i file oggetto attraversano una fase di linking per giungere al prodotto finale: il file eseguibile. 5 Classificazione dei LP (1) Una prima classificazione dei linguaggi di programmazione può essere fatta in base al loro livello di astrazione: - Linguaggio ad “alto livello” , molto vicino al linguaggio umano - Linguaggio ad “basso livello”, molto vicino al linguaggio macchina Una seconda classificazione dei linguaggi in base al concetto di istruzione: - Linguaggio imperativo - Linguaggio funzionale - Linguaggio logico Oltre a quest’ultima suddivisione, altre caratteristiche importanti sono il supporto a diversi paradigmi di programmazione (strutturato, orientato agli oggetti, ecc.) e all’elaborazione parallela. 6 Linguaggio Macchina E’ un linguaggio che può essere interpretato ed eseguito “senza mediazioni” perchè le sue istruzioni corrispondono ad operazioni direttamente eseguibili dall'hardware della macchina. Quindi particolarmente efficiente. Per contro è un linguaggio che dipende dall'architettura della macchina quindi: - Ogni processore (CPU) ha un suo linguaggio macchina; - Occorre conoscere l'architettura della macchina per poter scrivere programmi; - I programmi non sono portabili. I programmi in linguaggio macchina sono sequenze di 0 ed 1 (binarie), sostanzialmente illegibili per l'uomo. Es: un programma per il calcolo della somma tra due numeri codice operativo operando 00000010 000000011011100 00000110 000000011111100 00000100 000000011011100 7 Linguaggio Assembler Costituisce un primo parziale passo verso la semplificazione della programmazione. Infatti il programmatore non deve più ricordare sequenze strane di numeri binari, ma può usufruire di Assemblatori che traducono automaticamente: - Le istruzione macchina in codici operativi - Le locazioni di memoria e i registri in nomi simbolici o mnemonici. Ad esempio il programma precedente può essere espresso come segue codice operativo 00000010 00000110 00000100 operando 000000011011100 000000011111100 000000011011100 codice operativo LOAD SUM MEM codice mnemonico 220 252 220 E’ comunque legato all’architettura della macchina. 8 Linguaggio di alto livello In seguito alla realizzazione dei primi computer commerciali si è reso necessario sviluppare linguaggi di programmazione il cui uso risultasse più semplice rispetto al linguaggio assembler. I linguaggi di programmazione di alto livello, mediante opportuni meccanismi di astrazione, permettono di usare costrutti che prescindono dalle caratteristiche fisiche della macchina. Quindi si è verificata un’evoluzione dei linguaggi verso: - astrazione dalla macchina, - semplificazione della scrittura dei programmi - similarità con il ragionamento umano Infatti sono più simili ai linguaggi naturali rispetto alle sequenze (almeno) apparentemente senza senso di 0 e 1 del linguaggio macchina, ma anche rispetto al linguaggio assembler. 9 Linguaggio di alto livello Questo linguaggio consente l'utilizzo di simboli matematici e parole chiave tipiche del linguaggio naturale. Ad esempio l’istruzione che effettua la somma tra due numeri è: a=a+b dove a e b sono delle variabili, ossia dei nomi simbolici con cui identifichiamo una locazione di memoria astraendo dai dettagli di basso livello relativi agli indirizzi di memoria. Appositi software provvedono a tradurre le istruzioni di un linguaggio di alto livello nel loro equivalente in codice eseguibile dalla macchina. Però sono meno efficienti rispetto al linguaggio assembler e al linguaggio macchina. 10 Linguaggio imperativo In tali linguaggi l’istruzione è un comando esplicito, che opera su una o più variabili oppure sullo stato interno della macchina. Le istruzioni vengono eseguite in un ordine prestabilito. Scrivere un programma in tale linguaggio significa occuparsi di cosa la macchina deve fare per ottenere il risultato che si vuole. Il programmatore deve definire le strutture dati e gli algoritmi che operano su di esse. Rappresenta l’approccio più naturale, e i costrutti tipici utilizzati sono : assegnamento, cicli, in particolare GOTO, if-then-else, procedure/funzioni con passaggio di parametri. Esempi di linguaggi imperativi: Assembly, FORTRAN, COBOL 11 Linguaggio imperativo Adatti per applicazioni di gestione commerciale 12 Linguaggio funzionale Un programma è una definizione di funzione nel senso matematico del termine. Gli argomenti delle funzioni definite possono essere sia valori di tipi primitivi che altre funzioni. In un linguaggio funzionale puro, l’assegnazione esplicita risulta completamente assente ( si utilizza soltanto il passaggio di parametri ). L'esecuzione del programma consiste nella chiamata di una funzione con i relativi parametri per ottenere un risultato. In questo modello rivestono particolare importanza la ricorsione e, come struttura dati, la lista. Esempi di Linguaggi Funzionali: ML, Lisp, CAML 13 Linguaggio funzionale Adatti per applicazioni scientifiche e di calcolo 14 Linguaggio logico Il programma è considerato come la dimostrazione della verità di una asserzione. Il sorgente è costituito da una sequenza di asserzioni di fatti e regole. Non è necessario indicare esplicitamente il flusso di esecuzione, ma dato un obiettivo di partenza è il sistema che cerca di individuare i fatti e le regole rilevanti. Il fatto che vi sia una netta separazione tra la parte dichiarativa (il cosa fare) e la parte procedurale (il come) rende un programma scritto in un linguaggio logico particolarmente leggibile. I linguaggi logici risultano molto adatti a risolvere problemi che riguardano entità e le loro relazioni. Il linguaggio più famoso è il Prolog (PROgramming in LOGic). 15 Linguaggio logico Molto usati nell’ambito dell’Intelligenza Artificiale 16 Linguaggio strutturato I linguaggi strutturati adottano una tecnica il cui scopo è di semplificare la stesura dei programmi, limitando l'uso dei controlli a pochi casi semplici, tutti con un solo ingresso e una sola uscita. Ad esempio per evitare l'uso indiscriminato del famoso GOTO (salto incondizionato) sono state introdotte istruzioni di controllo strutturato del flusso, come i blocchi IF-THEN-ELSE, DO WHILE, CASE, FOR, ecc. L'adozione di nuove regole di strutturazione non impedisce, in casi in cui sia ritenuto veramente utile, l'utilizzo dei vecchi comandi di salto (GOTO), ancora in uso, per esempio, per uscire da una routine in caso di errore. Esempi di linguaggi strutturati: C, Pascal 17 Linguaggio Strutturato Adatti per applicazioni general-purpose 18 Linguaggio ad oggetti Il programma opera su insiemi di oggetti (insiemi di dati e regole che manipolano questi dati) che comunicano tra loro e verso l'esterno mediante messaggi. L'Object-Oriented ha adottato nuovi concetti come l'incapsulamento, l'ereditarietà e il polimorfismo. Oltre a linguaggi specializzati che implementano i principi di tale metodologia, come Smalltalk, ad esempio, sono nate delle estensioni dei linguaggi già esistenti, che li integrano (ad es. C++ per il C, il Visual BASIC, Visual RPG, ecc.). Esempio di linguaggio ad oggetti, oggi fortemente usato: Java 19 Linguaggio ad oggetti Enorme diffusione ed utilizzo per applicazioni distribuite 20 In principio era il bit… Per poter "insegnare" al computer come svolgere qualche semplice operazione aritmetica bisognava essere in grado di programmare in linguaggio macchina (0 e 1 ). Tra gli anni '40 e gli anni '50, la programmazione degli elaboratori elettronici era destinata solamente a una ristrettissima cerchia di esperti. E quello che può essere considerato il progenitore di tutti i computer è sicuramente l'ENIAC (Electronic Numerical Integrator And Calculator ), un mastodontico calcolatore pesante 30 tonnellate, al cui progetto partecipò il brillante matematico J. von Neumann. Infatti fu il primo elaboratore programmabile interamente a circuiti elettronici e senza parti meccaniche in movimento, ma questa è un'altra storia... 21 Il principio era il bit… ENIAC 22 Una breve panoramica Negli anni ’50 si impone, dopo qualche scetticismo, l'idea che i linguaggi ad alto livello siano affidabili ed economicamente possibili. Si cerca un compromesso tra espressività del linguaggio che il programmatore deve usare e efficienza di esecuzione del programma da parte del calcolatore. Negli anni ’60 vengono introdotte notazioni per la descrizione dei linguaggi e viene posta meno enfasi sull’ efficienza della computazione, ma più attenzione al modello di computazione. Si comincia a parlare di computazione simbolica e non solo numerica e si cominciano a vedere programmi, non solo per il calcolo scientifico, ma anche per gestire informazioni non numeriche. Negli anni ’ 70 la programmazione diventa un’attività complessa che coinvolge spesso decine di persone sullo stesso programma, che inoltre deve essere mantenuto nel tempo, introducendo modifiche. Queste operazioni iniziano a diventare molto costose perchè i programmi sono spesso poco leggibili. Si enfatizza perciò la necessità di introdurre metodologie chiare di programmazione e linguaggi che la supportino, che facilitano cioè la scrittura di programmi che supportino la metodologia scelta. 23 La nascita dei LP: 1946 Il primo linguaggio di programmazione della storia, se si esclude il "linguaggio" meccanico adoperato da Ada Lovelace per la programmazione della macchina di Charles Babbage, è a rigor di termini il Plankalkül di Konrad Zuse, sviluppato da lui nella svizzera neutrale durante la seconda guerra mondiale e pubblicato nel 1946. Plankalkül era già in grado di gestire sia tabelle che strutture di dati ma non venne mai realmente usato per programmare. Konrad Zuse usò il suo linguaggio come opponente nel gioco degli scacchi sul suo computer Z3. 24 Curiosità su Konrad Zuse Pioniere dei calcolatori, costruì nel 1941 il primo calcolatore elettromeccanico programmabile, lo Z3. La società da lui fondata venne rilevata poi dalla Siemens. Il primo computer di Konrad Zuse, Z1, fu costruito tra il 1936 e il 1938. Si trattava di un apparecchio programmabile, in grado di processare numeri in formato binario e le cui caratteristiche più apprezzabili, viste con il senno di poi, furono la netta distinzione fra memoria e processore. Questa architettura, che non venne adottata dall'ENIAC o dal Mark I, (i primi computer realizzati negli Stati Uniti quasi dieci anni più tardi), rispecchia la definizione di calcolatore enunciata nel 1945 da John von Neumann. 25 Esempio di programma in Plankalkül La riga 1 rappresenta una dichiarazione di tipo. P1 è una funzione. P2 è il main. 26 Shortcode: 1949 La programmazione dei primi elaboratori veniva fatta invece in Shortcode, da cui poi si è evoluto l'assembly o assembler, che costituisce una rappresentazione simbolica del linguaggio macchina. La sola forma di controllo di flusso è l'istruzione di salto condizionato, che porta a scrivere programmi molto difficili da seguire logicamente per via dei continui salti da un punto all'altro del codice. Deve essere compilato in codice macchina manualmente. A dispetto del nome, le notti tenderebbero ad allungarsi parecchio, usando questo linguaggio! 27 La nascita dei LP: primi passi La maggior parte dei linguaggi di programmazione successivi cercarono di astrarsi da tale livello basilare, dando la possibilità di rappresentare strutture dati e strutture di controllo più generali e più vicine alla maniera (umana) di rappresentare i termini dei problemi per i quali ci si prefigge di scrivere programmi. Il primo sostanziale passo in avanti nella programmazione fu a cavallo tra gli anni ’50 e gli anni ’60 quando si passò ai cosiddetti “linguaggi di alto livello”, ovvero a linguaggi che esprimevano la computazione da fare in modo procedurale. 28 Fortran: 1954 Gli scienziati avevano bisogno di un linguaggio che permettesse la scrittura e la successiva elaborazione di formule complesse. Nacque così il FORTRAN (FORmula TRANslator) che iniziò la propria lunga storia nel 1954. Così lunga da rendere reale la profezia degli anni ’70: “Non si sa come sarà il linguaggio di programmazione dell’anno 2000, ma si chiamerà FORTRAN!” (Questa profezia è stata attribuita a vari studiosi tra cui J. Backus, S. Cray e D. McCracken). Il FORTRAN funzionò bene per le applicazioni di calcolo scientifico e, di conseguenza, ebbe un notevolissimo successo in questo dominio, come evidenziato dalla profezia precedentemente citata. 29 Fortran… Il primo compilatore FORTRAN per il calcolatore IBM 704 fu ideato da un gruppo di lavoro guidato da John Backus (vincitore del Premio Turing nel 1977 ). Si trattò di un compilatore ottimizzante (o ottimizzatore), poiché i progettisti ritenevano che nessuno avrebbe usato un linguaggio la cui efficienza non si avvicinasse a quella dei linguaggi assemblatori. Il linguaggio fu usato soprattutto per scrivere programmi che eseguivano molti calcoli matematici,questo incoraggiò i progettisti a creare compilatori che generavano codice molto veloce. L'inclusione del tipo numero complesso rese poi il Fortran il linguaggio d'elezione nella comunità scientifica. 30 Fortran: caratteristiche E’ stato il primo linguaggio di alto livello, e quello che ha per primo utilizzato un compilatore. E’ semplice da imparare, impiegabile in un ampio raggio di esigenze, indipendente dalla macchina, e consente l'esecuzione di complesse funzioni matematiche, scritte il più possibile in modo analogo a quello usato normalmente. Alcuni anni dopo la sua prima comparsa si sono sviluppati diversi "dialetti" derivanti dal FORTRAN originale. Data la sua semplicità di scrittura i programmatori riuscivano ad essere fino a 500 volte più veloci in FORTRAN che in altri linguaggi, dedicando così maggiormente la loro attenzione sui problemi reali piuttosto che sulla trascrizione nel linguaggio. Si può quindi affermare che FORTRAN è stato anche il primo linguaggio "problem oriented" anzichè "machine oriented". 31 … Fortran I primi programmi in FORTRAN venivano perforati per lo più su schede a 80 colonne, con regole molto stringenti: - Una riga di codice non poteva superare i 72 caratteri, che venivano perforati nelle colonne da 1 a 72; - Le colonne da 1 a 5 potevano contenere un'etichetta numerica che identificava l'istruzione; - Le colonne da 7 a 72 contenevano l'istruzione; - La colonna 6 era normalmente vuota e, se conteneva un carattere, indicava che l'istruzione era il seguito dell'istruzione perforata nella scheda precedente; - Le colonne da 73 a 80 venivano spesso usate per numerare le schede. 32 Fortran: una scheda perforata 33 A-O e Fortran: 1957 Il Fortran, il cui sviluppo è basato sul linguaggio A-O, viene pubblicato. Anche A-O noto anche come AT-3 (la cui autrice è “la nonnina del Cobol” ovvero Grace Hopper ) viene pubblicato col nome Math-Matic, e inizia così l'utilizzo di un primo linguaggio di programmazione comunemente conosciuto. 34 Fortran II: 1958 Viene presentata una nuova versione di linguaggio Fortran, ovvero il FORTRAN II. Tra le sue nuove caratteristiche offre la gestione di sottoprogrammi e link a funzioni di codice macchina. Il FORTRAN II introdusse la possibilità di compilazioni separate. Viene pubblicata la definizione di base di ALGOL 58, (“ALGOrithmic Language”) noto anche come IAL (International Algebraic Language). 35 Lisp: 1958 Nella metà degli anni ’50 si sentì l'esigenza, comune alle varie discipline, di trovare un metodo che consentisse al computer di elaborare liste di dati simbolici. IBM fu una delle prime compagnie ad interessarsi al problema. Infatti, visto l'alto costo per lo sviluppo del FORTRAN i dipendenti dell’IBM pensarono di inserire in quel linguaggio anche la funzione di elaborazione delle liste. Cosi' il LISP ( LISt Processing Language oppure, per gli amici "Lots of Irritating Superfluous Parentheses" :-) ) fu integrato come estensione nel FORTRAN stesso. John McCarthy fu incaricato di creare una lista di specifiche per creare l'elaborazione simbolica. La prima definizione riguardava le espressioni algebriche. 36 … Lisp L'esperimento iniziale produsse una lista di esigenze di linguaggio, tra cui le più importanti erano le espressioni ricorsive e quelle condizionali, che a quell'epoca il FORTRAN non aveva ancora. Aveva lo scopo di riportare in forma di linguaggio di programmazione il modello computazionale del λ –calcolo (il λ -calcolo fu definito dai padri dell ’informatica,tra cui Church, e ben presto, diventò uno dei modelli computazionali prevalenti). Avere un linguaggio di programmazione basato integralmente su di esso rivestiva, pertanto,un ’importanza unica per gli scienziati di allora, che pensavano, così, di risolvere gran parte dei loro problemi di sviluppo software tramite la trascrizione, quasi pedestre, di modelli in programmi. 37 Lisp : perché è da ricordare? Perché con esso sono stati introdotti i concetti di: - Ricorsione - Lista linkata: puntatori e records - Allocazione dinamica della memoria - Efficienza mediante l’uso della memoria condivisa - Meta-programmazione 38 … Lisp : oggi Per esperti di λ -calcolo l ’uso del LISP fu, ed è tuttora, particolarmente indolore. Questa è una delle fortune maggiori di tale linguaggio, ancora oggi, dopo quasi 50 anni dalla sua prima concezione, è particolarmente popolare nel settore dell’intelligenza artificiale. Emacs e AutoCad sono implementati in LISP Insieme ad altri viene usato nel gioco Abuse, i cui livelli e funzioni sono determinati dal codice LISP, compilato quando inizia il gioco. 39 … Lisp : un esempio 40 Cobol: 1959 Il COBOL (COmmon Business Oriented Language) nasce alla conferenza del Data Systems and Languages (CODASYL). Esso fu definito da un comitato formato dai leader statunitensi dell’epoca. Tra gli altri, si ricorda, la partecipazione di Burroughs Corporation, IBM, Honeywell, RCA, Sperry Rand e Sylvania Electric Products. Anche tre enti pubblici particolarmente rilevanti presero parte ai lavori: US Air Force, David Taylor Model Basin e il National Bureau of Standards. Il comitato si suddivise in tre sottocomitati: il primo per la pianificazione a breve termine, il secondo per quella a medio termine, e il terzo per il lungo termine; quest’ultimo in realtà non incominciò mai a lavorare. È chiaro che, con queste premesse il linguaggio che sarebbe risultato, sarebbe stato preciso, ma anche un po’ ampolloso e pesante da gestire. 41 … Cobol Esso fu pensato per gestire una grande quantità di dati, ma può essere valido anche per tanti altri scopi. Serviva soprattutto per sviluppare programmi gestionali, cioè atti alla risoluzione di problemi aziendali. La sua enorme diffusione è dovuta alla sua facilità, grazie anche al fatto che le istruzioni somigliano molto a frasi inglesi. Ad esempio, la frase "aggiungi il valore di import al valore totale" si tradurrebbe in COBOL così: "add import to totale" Trovando una grandissima applicazione nelle aziende ebbe molto successo. 42 … Cobol Dal suo sviluppo ha avuto molte modifiche e miglioramenti. Nel tentativo di superare le numerose incompatibilità tra le varie versioni, l'American National Standards Institute (ANSI) annunciò uno standard nel 1968, che produsse l'ASN-COBOL. Nel 1974 venne pubblicata una revisione con molte funzioni che non erano state previste nel '68. Nel 1985 esce, sempre dall'ANSI, un'ulteriore revisione con nuove funzioni. Il linguaggio continua ad evolversi ancora oggi, che è disponibile in una versione object-oriented inclusa nel COBOL 97. Anche se viene apprezzato dai tecnici, lo è senz'altro meno del BASIC, a causa della sua eccessiva verbosità. Tirando le somme, non c’è dubbio che il COBOL assolva molto bene i propri compiti di chiarire le azioni che l’elaboratore svolge in un linguaggio comprensibile dai propri utenti principali, ovvero da persone che si occupano di amministrazione, contabilità etc. 43 Cobol: un esempio 44 La situazione negli anni ‘60 La diffusione degli strumenti informatici nonché l’ingrandirsi dei sistemi da sviluppare, impose la definizione di un processo di sviluppo. L’idea che parve più ovvia fu quella di basarsi su modelli modulari, concentrati sulla suddivisione del lavoro in parti e la successiva specializzazione dei compiti. Il modello di sviluppo di riferimento fu chiamato waterfall, ovvero, a cascata. Si assistette, allora, a una particolare focalizzazione sullo sviluppo di linguaggi che permisero la decomposizione flessibile del sistema in sottosistemi. Il COBOL permetteva una suddivisione; tale suddivisione, però, era rigidamente predefinita dal linguaggio: le divisioni erano “quelle tre”! Si desiderava, invece, poter dividere in modo che i moduli fossero definibili in modo chiaro e univoco dallo sviluppatore, che doveva anche stabilire come un modulo interagisse con gli altri moduli. 45 Algol: 1960 ALGOL-60: “ALGOrithmicLanguage” fu sviluppato da un gruppo di persone eccellenti facenti parte dell’ International Federation for Information Processing, quali John Backus, Peter Naur, Alan Perlis, Friedrich L.Bauer, John McCarthy, Niklaus Wirth, C.A.R. Hoare, Edsger W. Dijkstra. E’ stato il linguaggio imperativo più influente. E’ stato il primo linguaggio con una sintassi ben definita (BNF). Dopo tale successo con la sintassi, lo stesso gruppo tentò di definire formalmente anche la semantica, ma il progetto fallì ben presto. Nonostante le sue innovative caratteristiche, non ebbe lo stesso successo ottenuto con il FORTRAN ma…. … è stato il modello per : C, Pascal, MODULA, FORTRAN77. 46 Algol: caratteristiche Primo linguaggio con attivazione di procedure basate sullo STACK (ricorsione) Primo linguaggio con un meccanismo ben definito di passaggio dei parametri: – Passaggio per valore – Passaggio per nome (una sorta di chiamata per riferimento) – Passaggio per valore del risultato (nelle ultime versioni) - Passaggio per riferimento (nelle ultime versioni) 47 Algol: caratteristiche Strutture dati primitivi: interi, reali, booleani, arrays; L’ultima versione ha anche riferimenti e records (originariamente introdotti in COBOL), e tipi definiti dall’utente. L’I/O non veniva più considerato fortemente dipendente dalla macchina. Lo sviluppo di Algol ha portato a un nuovo tipo di programmazione, quella strutturata: - funzioni che isolano i sotto-programmi; - controllo della gestione della memoria mediante variabili “tipizzate”; - uso di strutture di controllo: – If then else - While (several forms) – goto (si continua ad usare) 48 Algol: problemi I linguaggi ALGOL- like non sono ancora soddisfacenti: - Le modalità di organizzazione dei dati (strutture dati) restano separate dai metodi necessari a manipolare i dati stessi. - Le funzioni/moduli non sono “a tenuta stagna” : – possono influenzarsi tra loro in maniera non sempre esplicita al programmatore. - Non è quasi mai facile riutilizzare una funzione in un altro programma. La manutenzione del software diviene rapidamente più difficile e costosa dello sviluppo ex-novo dello stesso software. 49 … Algol: esempi 50 Apl: 1961 APL sta per "A Programming Language". Fu creato da Ken Iverson e i suoi colleghi della IBM. D'ispirazione matematica, il suo scopo principale era di servire come potente esecutore di notazioni per algoritmi matematici. APL è noto soprattutto per la sua capacità di usare non solo simboli ASCII, ma anche, per esempio tutte le lettere dell'alfabeto greco (indispensabili in matematica). In APL tutte le espressioni sono valutate da destra verso sinistra. 51 Apl: 1961 Funzioni principali del linguaggio APL: - Set di caratteri non-Standard: simboli non ASCII - Dynamic Array Universe: ambiente che consiste di schiere create dinamicamente - Interazione: APL è un linguaggio interattivo Aree di applicazione: - Algoritmi matematici - Statistiche 52 Apl: 1961 Esempio di programma in linguaggio APL che scrive a video “Hello word!”: 'Hello World!' In Apl, tutto quello che è scritto tra apici è stampato a video. @ in APL fa in modo che tutto quello che viene dopo sia visto come un commento Se "Hello World” la si vuole memorizzare in una variabile h per poi stamparla a video, il programma di sopra risulterà modificato come segue: h<-'Hello World' 53 SNOBOL: 1962 SNOBOL, (StriNg Oriented symBOlic Language), è un linguaggio di programmazione creato nei laboratori Bell, per la manipolazione delle stringhe di simboli, utile in aree come la linguistica, la compilazione di indici e bibliografie, la manipolazione di testi e la trattazione simbolica di espressioni algebriche. .Al progetto lavorarono D. J. Farber, R. E. Griswold, e F. P. Polensky. Inizialmente il progetto ebbe un nome più goliardico: SEXI (String EXpression Interpreter), poi divenne SNOBOL in assonanza con un’affermazione di uno degli sviluppatori: "This program doesn't have a snowball's chance in hell of…" Nel 1971, i compilatori FASBOL e SPITBOL (SPeedy ImplementTation of snoBOL) verranno poi sviluppati proprio sulla base di SNOBOL. Il linguaggio è usato per gestire testi e formule. Il suo sviluppo, culminato in SNOBOL4 avvenne fra 1l 1962 e il 1967 54 SNOBOL: caratteristiche I tipi di dato di SNOBOL sono stringhe, numeri interi e reali, tabelle associative, matrici di qualsiasi dimensione e tipi definibili dall’utilizzatore. Inoltre il tipo di dati pattern, introdotto in SNOBOL4, permette di memorizzare un modello dei dati. SNOBOL è un linguaggio interpretato, ed utilizza questa caratteristica tramite le istruzioni EVAL(istruzione) e CODE(istruzioni) per eseguire frammenti di programma generati dinamicamente, per trattare come variabili i nomi di dati, mediante il prefisso $: ? PIEMONTE = 'TORINO' ? TORINO = 'PIEMONTE' ? OUTPUT = 'La capitale del ' $PIEMONTE " è " PIEMONTE La capitale del PIEMONTE è TORINO 55 PL/I: 1963 E’ stato sviluppato come prodotto IBM e inizialmente si chiamava NPL (New Programming Language). Il nome fu cambiato per non fare confusione con il National Phisical Laboratory in Inghilterra. Anche questo linguaggio s'è evoluto nel tempo, ma mentre tutti gli altri linguaggi si erano bene o male specializzati in determinate aree applicative, ciò non avvenne per il PL/I. Era il primo tentativo su larga scala di progettare un linguaggio che potesse essere usato in qualsiasi area applicativa. In realtà il PL/I è un linguaggio molto pesante da gestire e molto verboso. Poteva andare forse bene su applicazioni di mainframe IBM, dove erano richiesti grossi programmi per elaborazioni batch, ma non ebbe il successo che ci si aspettava e fu successivamente superato da altre soluzioni più flessibili e più produttive. 56 PL/I: funzioni principali E’ completamente a formato libero e non usa parole riservate. Definisce i suoi tipi di dati senza riferimento ad alcun hardware. E’ un linguaggio block-oriented, formati dal packages, dai begin blocks, e dagli statements. Questo tipo di struttura consente al programmatore di produrre applicazioni altamente modulari. Contiene strutture di controllo. Per esempio, SELECT...WHEN...OTHERWISE che gestisce controlli logici, e l'istruzione DO che consente di eseguire azioni unitarie incondizionate, per una sola volta, per sempre o fintanto che una condizione è vera o prima che lo diventi. Supporta le schiere, strutture, unioni, schiere di strutture o unioni, strutture di unioni o schiere e ogni combinazione di esse. Fornisce 4 diverse classi di memoria: AUTOMATIC, STATIC, CONTROLLED, e BASED. 57 PL/I: aree applicative E’ stato usato in modo considerevole sia in applicazioni commerciali che scientifiche. E' stato anche il principale linguaggio presso l'Università del Michigan Dearborn per un certo periodo di tempo. Comunque la sua popolarità è declinata negli ultimi anni, in seguito all'introduzione di linguaggi più moderni. 58 PL/I: esempio L’esempio precedente scritto in PL/I diventa: HELLO: LOOP: END HELLO; PROCEDURE OPTIONS (MAIN); /* A PROGRAM TO OUTPUT HELLO WORLD */ FLAG = 0; DO WHILE (FLAG = 0); PUT SKIP DATA('HELLO WORLD!'); END LOOP; 59 Rpg: 1964 L'RPG è un linguaggio creato da IBM nel 1959 e già utilizzabile su uno dei primi minielaboratori: l'IBM 1401. Nel ’64 poi è stato reso disponibile sui sistemi IBM 360, 370, S/3, 32, 34, 36, 38, AS/400 ed infine iSeries (sistemi più che attuali al giorno d'oggi). Fino ai sistemi 370 in realtà il linguaggio era considerato come semplice utility e non godette di gran fama. Fu dai sistemi S/3 in avanti che divenne il principale linguaggio di sviluppo per applicazioni commerciali proposto da IBM, almeno sui mini elaboratori. Lo scopo, dato anche il nome che significa Report Program Generator (programma generatore di stampe), apparve subito evidente: l'IBM 1401 dell'epoca è un sistema d'elaborazione principalmente orientato alle aziende, quindi con esigenze massicce di stampare tabulati e moduli commerciali (bolle, fatture, estratti conto). 60 Rpg: 1964 Il sistema 1401 è la prima macchina annunciata da IBM, dopo il Ramac 305, a non avere più pannelli di controllo con spinotti da inserire. Si tratta di un vero computer, con i suoi bravi linguaggi di programmazione, tra cui appunto anche il nuovo RPG. Il linguaggio è pesantemente orientato ad avere un input da schede perforate, svolgere determinati calcoli, anche fortemente condizionati, per mandare infine i risultati verso la stampante. Un linguaggio molto mirato al suo scopo primario. Probabilmente l'ideatore (ignoriamo chi sia stato a progettarlo) non s'era posto altri obiettivi. 61 Rpg & IBM Con questo linguaggio decisamente proprietario, IBM si era affrancata la fedeltà di tutti i suoi clienti, che vedevano le loro applicazioni imperniate sull'RPG, come chiave di successo del loro sistema informativo. La concorrenza cercò ovviamente di proporre una propria versione RPG, ma in linea di massima si trattò di brutte imitazioni, molto arretrate come funzionalità rispetto al vero linguaggio originario IBM. Ciò fece sì che, fuori dal mondo IBM, l'RPG non fosse per nulla conosciuto, così come non era conosciuto in casa IBM a livello di mainframe, dove era invece prevalente il COBOL o altri linguaggi di livello superiore. . La maggior parte delle piccole e medie aziende italiane avviate alla elaborazione elettronica dei dati negli anni dal 1960 al 1990 ha adottato IBM come fornitore di hardware e utilizzato software house o consulenti informatici specializzati nell'uso proprio dell'RPG. Si parla di 60/70.000 installazioni, che vanno dai 3 posti di lavoro alle varie centinaia. 62 Rpg: caratteristiche L'RPG si distingue subito da qualsiasi altro linguaggio di programmazione per tre caratteristiche uniche: - per scrivere le istruzioni si devono utilizzare appositi moduli cartacei, simili a questionari, denominati "specifiche" - le istruzioni fornite vengono eseguite all'interno di un ciclo logico infinito, fornito dal compilatore - per classificare e usare le condizioni si utilizzano una specie di switch chiamati "indicatori" 63 Rpg: le specifiche Originariamente si trattava di 7 tipi differenti di moduli prestampati, che andavano compilati con le apposite istruzioni del programma, quindi dai moduli si ottenevano tante schede perforate quante erano le righe utilizzate. Le schede rappresentavano il programma sorgente. Queste venivano quindi fatte leggere dal computer, insieme al programma compilatore, ed alla fine, se non c'erano errori gravi, si otteneva un nuovo pacco di schede che rappresentavano il nostro programma eseguibile. 64 Rpg: le specifiche Le specifiche servivano ad indicare tutto ciò che occorreva per svolgere un completo programma di tipo batch, ed ogni tipo di modulo aveva un codice identificativo, ovvero: - H (header) identificava la prima riga del programma, con alcune informazioni destinate al compilatore - F (files) identificava le risorse che il sistema avrebbe dovuto riconoscere e usare (files, stampanti, console, ecc.) - E (extension) per indicare tabelle da caricare in fase di compilazione o di esecuzione - L (lines) per indicare caratteristiche particolari - I (input) per fornire le indicazioni dei dati da leggere - C (calcolo) con le istruzioni logiche, aritmetiche e condizionali - O (output) per indicare dove e come stampare i dati o trascriverli su nuovi files 65 Rpg: le specifiche Ogni modulo presentava apposite fincature con l'intestazione del contenuto che era previsto per le varie colonne. Nel battere un programma, dunque, si dovevano riportare le istruzioni nelle precise posizioni previste dai moduli, saltando le zone da lasciare obbligatoriamente in bianco. Per un programma di media complessità si potevano utilizzare una trentina di fogli. Ovviamente si compilavano in matita, si correggeva, si cancellava, si aggiungevano fogli, ecc. ecc. Tutto su carta. C'è da dire che oggi può sembrare un metodo da età della pietra e in effetti lo era, ma il rapporto tra programmatore e foglio di carta aveva anche i suoi vantaggi (e il suo fascino!): un programma lo potevi scrivere anche a lume di candela! 66 Rpg: punti di forza e punti deboli I punti forti del linguaggio RPG: - grandissima sinteticità del codice sorgente - cicli automatici di flusso standardizzato - estrema facilità d'apprendimento - nessun orpello ortografico o caratteri speciali - estrema leggibilità del sorgente - facilità di manutenzione - ottima gestione dei report I punti deboli del linguaggio RPG : - La stesura posizionale dei comandi implica l'uso di appositi moduli o comunque la conoscenza delle colonne in cui ogni dat deve essere scritto, visto che il significato di un codice è assunto dal compilatore in base alla posizione in cui viene inserito. - La descrizione dell'input andava riscritta in ogni programma - I nomi dei campi non più lunghi di 6 caratteri. 67 Basic: 1964 BASIC (un acronimo per Beginner's All purpose Symbolic Instruction Code cioè "Codice di istruzioni simboliche di uso generale per principianti") è un linguaggio di programmazione ad alto livello sviluppato nell'Università di Dartmouth (Dartmouth College) per il calcolatore GE-225. Ne furono coinventori i professori John George Kemeny e Thomas Eugene Kurtz. Il primo programma in BASIC "girò" il 1° maggio 1964, alle ore 4:00. 68 Basic: 1964 Il BASIC (almeno nelle versioni di Kemeny e Kurtz, che costituiscono il cosiddetto Dartmouth BASIC) fu progettato per essere un linguaggio semplice da imparare. Per questo si differenziò dalla maggior parte dei linguaggi suoi coetanei enfatizzando la semplicità d'uso piuttosto che la potenza espressiva. Nacque infatti, come dice il suo nome, per poter essere usato anche da principianti Le istruzioni erano poche e non complesse. Il BASIC offriva inoltre pochi costrutti strutturati, quindi orientati alla creazione di programmi chiari e comprensibili. Fu pensato inoltre come un linguaggio algoritmico, adatto cioè a programmare algoritmi 69 Basic: funzioni principali loops input da tastiera applicazioni guidabili da menu comandi di sistema: utilizza parole atte a fare svolgere immediatamente uno specifico task programmazione strutturata subroutines funzioni integrate nel linguaggio funzioni definibili dall'utente Schiere, sorting e ricerche 70 Basic: Aree applicative Disegnato per applicazioni più interattive che di tipo batch, con il grande vantaggio di essere facilmente implementabile, vista anche la possibilità di utilizzo in forma interpretata piuttosto che compilata. Il seguente esempio crea una variabile stringa ed un array di 11 elementi (si parte da 0). 10 LET A$="" 20 DIM A(10) 30 END 71 Simula: 1967 SIMULA è stato disegnato e costruito da Ole-Johan Dahl e Kristen Nygaard del Norvegian Computing Center di Oslo. 72 … Simula Inizialmente ideato e sviluppato come linguaggio per la simulazione di eventi discreti, ma successivamente espanso per diventare un linguaggio di utilizzo generale, in particolare esso rappresenta il primo linguaggio object oriented. Si basa su ALGOL60, ma comprende anche la gestione delle classi. Introduce per la prima volta i concetti di: – Classi; – Oggetti (Istanza di classi); – Funzioni virtuali; - Ma non l’ereditarietà multipla. 73 … Simula Per primo ispirò l’introduzione dei meccanismi di astrazione dei dati a tutti linguaggi ideati successivamente eccetto che l’orientamento agli oggetti, la cui importanza fu compresa solo molto più tardi. L’idea della “fusione” del concetto di tipo con quello di classe, dovuta a Dahal, non fu accolta all’epoca, con benevolenza. Sorprendentemente, molto simile ai moderni linguaggi orientati agli oggetti! Resta principalmente confinato all'area del "Discrete Event Simulation“. 74 Simula: esempio definizione 75 Simula: esempio d’uso 76 BCPL: 1969 BCPL (Basic Combined Programming Language) è un linguaggio di programmazione sviluppato da Martin Richards dell'Università di Cambridge, in seguito alle difficoltà che aveva incontrato nell'utilizzo del suo predecessore, il CPL. Il primo compilatore venne implementato mentre Richards si trovava al MIT, nella primavera del 1967. Il linguaggio venne presentato per la prima volta al 1969 Spring Joint Computer Conference. L'architettura del BCPL influenzò pesantemente il linguaggio B, da cui Dennis Ritchie in seguito sviluppò il C. BCPL è un linguaggio di basso livello, che comprende solo semplici tipi di dati. 77 …. BCPL BCPL è un linguaggio di basso livello, che si caratterizza per avere un unico tipo di dati, il tipo word (un numero fisso di byte, di solito scelto per allinearsi con la parola della macchina). L'interpretazione del dato veniva fatta in base al tipo di operatori utilizzati: ad esempio, utilizzando il segno di addizione +, i dati venivano sommati come se si trattasse di numeri interi, mentre l'operatore ! di dereferenziazione trattava i dati come puntatori. Nel 1979 esistevano implementazioni di BCPL per almeno 25 diverse architetture, oggi il BCPL è stato interamente soppiantato dal C. 78 BCPL: un esempio Questo esempio effettua la stampa del fattoriale: GET "libhdr“ LET start() = VALOF { FOR i = 1 TO 5 DO writef("fact(%n) = %i4*n", i, fact(i)) RESULTIS 0 } AND fact(n) = n=0 -> 1, n*fact(n-1) 79 La situazione negli anni ‘70 Nel '70 Intel, con la collaborazione di Federico Faggin, produce il 4004, la prima CPU. La fine del periodo iniziale della storia del software, potrebbe essere il '68, per diversi motivi, uno è che molti studenti vedono con sospetto le ricerche fatte al MIT con i finanziamenti dell'Esercito, che culminano con l'assalto ai laboratori nel '68 e proprio in quest’anno nasce un movimento per portare il computer al popolo, di cui un protagonista fu Lee Feldestain. Un altro motivo è che in quel periodo l'IBM, pressata, dagli antimonopolisti, decise ,per dimostrare di non essere monopolista, di suddividere il prezzo delle macchine da quello del software, il famoso `unbundling', dando così spazio a potenziali concorrenti. Gli anni seguenti sono un grande fermento che culminano nella realizzazione nel primo PC, che non è l'Apple come molti credono, ma una macchina venduta in kit che si chiamava Altair. Molti l'avranno vista nel film `War Games', era una scatola con dentro un microprocessore, costava 300 dollari e aveva solo 256 byte di memoria. Praticamente inservibile, eppure ebbe un grandissimo successo, portava finalmente in casa di tutti un computer, quello che Lee Feldstein ed i suoi amici predicavano da tempo. Ancora una accelerazione incredibile: nel '76 appare il Sol, progettato da Lee, una bella macchina di architettura moderna e finalmente nel '77 l'Apple. 80 Forth: 1970 Nel 1970 Charles Moore crea il Forth. Secondo Moore il Forth doveva essere un linguaggio di quarta generazione (fourth generation), ma siccome il suo sistema operativo prevedeva nomi di file di soli 5 caratteri, fu battezzato Forth. Il Forth prevede la possibilità sia di essere eseguito in modalità interattiva, rendendo possibile il suo utilizzo come shell in sistemi che non possedevano un vero e proprio sistema operativo, sia la possibilità di compilare sequenze di comandi per una loro successiva esecuzione. Il telescopio di Kitt Peaks è, per esempio, controllato da un programma FORTH. E’ sopravvissuto solo tra gli appassionati e tra gli accademici, i primi per diletto e lavoro, i secondi per la ricerca in ambito lambda calcolo. 81 Prolog: 1970 Nello stesso anno, in Francia, compare anche il Prolog (PROgramming LOGic), che è un linguaggio di programmazione che adotta il paradigma logico. E' stato ideato da Robert Kowalski (aspetto teorico), Marten Van Emdem (dimostrazione sperimentale), ed implementato da Alain Colmerauer, costituendo un tentativo di costruire un linguaggio di programmazione che consentisse l'espressione del problema in forma logica invece della traduzione di un algoritmo di soluzione in forma di istruzioni da eseguire da parte della macchina. Si basa sul teorema SLD ed è stato ideato per le esigenze di Intelligenza Artificiale (AI), infatti la sua sintassi e la semantica sono molto semplici e chiare (lo scopo primitivo era quello di fornire uno strumento di lavoro a linguisti privi di conoscenze informatiche). Diventando così un serio competitore di LISP. 82 Prolog: caratteristiche Il Prolog si basa sul calcolo dei predicati (precisamente il calcolo di predicati del primo ordine); tuttavia la sintassi è limitata a formule dette clausole di Horn che sono disgiunzioni di letterali del primo ordine quantificate universalmente con al più un letterale positivo. L'esecuzione di un programma Prolog è comparabile alla dimostrazione di un teorema mediante la regola di inferenza detta risoluzione (introdotta da Robinson nel 1965). I concetti fondamentali sono l'unificazione, la ricorsione in coda e il backtracking. Visto che uno dei maggiori problemi di oggi è incrementare la velocità dei computer, Prolog è un linguaggio ideale per creare prototipi. Il suo concetto è di usare architetture parallele. Risolve problemi di ricerca della conoscenza (ovvero di ricerche in database) sfruttando la potenza di computer multi-processore per agire contemporaneamente in più parti dello stesso database. 83 Prolog: funzioni principali Intelligent Systems - programmi che eseguono compiti utili, servendosi di tecniche di Intelligenza Artificiale . Expert Systems - systemi intelligenti che riproducono aspetti del decision-making al livello di esperienze umane. Natural Language Systems - che possa analizzare e rispondere a istruzioni fornite in linguaggio naturale. Relational Database Systems L'attuale implementazione di Prolog é dovuta in gran parte all'efficente codifica di David Warren. 84 Prolog: un esempio 85 Pascal: 1970 Nel 1970 Niklaus Wirth, membro dell'International Federation of Information Processing (IFIP). pubblica il Pascal, il primo linguaggio strutturato, a scopo didattico. Infatti il suo principale obiettivo era che si presentasse molto efficiente da implementare e da far girare, consentendo lo sviluppo di programmi ben strutturati e ben organizzati, che servissero da esempio per l'insegnamento della programmazione. Il PASCAL è diretto discendente di ALGOL 60, che lo stesso Wirth aiutò a sviluppare, e contiene anche componenti derivanti da ALGOL 68 e ALGOL-W. Fu così chiamato in onore del matematico e filosofo francese Blaise Pascal, inventore della prima macchina calcolatrice automatica. La pubblicazione originale del linguaggio avvenne nel 1971, con una successiva revisione nel 1973. Fu il programma prescelto per l'insegnamento dagli anni '60 alla fine degli anni '80. 86 Pascal: caratteristiche Presenta una sintassi molto chiara e molto rigida. L'obbligo di dividere il programma in sezioni ben definite (uses, declaration, implementation) e di dichiarare in anticipo tutte le variabili usate nel programma Permette l'uso di tipi di dati complessi e definibili dal programmatore (i record); permette (con alcune limitazioni) l'uso dei puntatori e l'allocazione dinamica della memoria (new e delete). Al posto delle subroutine di uso comune nei linguaggi di allora, il Pascal introduce le procedure e le funzioni, che estendono il concetto di subroutine incapsulando al loro interno le variabili e i dati locali, ed esponendo solo i valori in ingresso ed in uscita. Inoltre, nella sua formulazione originale, era privo dell'istruzione GOTO, aggiunta poi in seguito con riluttanza. 87 Pascal: caratteristiche Essendo un linguaggio pensato per degli utenti inesperti, spesso i compilatori Pascal hanno un atteggiamento materno nei confronti del programmatore, partendo dal presupposto che qualunque irregolarità del codice scritto sia un errore, che infastidisce un po' gli esperti. In cambio è un linguaggio completo e potente, e soprattutto educa fin dall'inizio ad adottare un buono stile di programmazione e ad analizzare a fondo il problema prima di cominciare a scrivere il codice, cosa che rende i programmi Pascal più chiari e più facili da leggere. Data la diffusione negli ambienti scolastici, ne sono state create versioni ad oggetti, tipo l'Object Pascal e Delphi. 88 Pascal: funzioni principali Built in Data Types- Pascal contiene i suoi tipi di dati, che sono: Integer, Real, Character, e Boolean. User defined Data Types - ha l'abilità di definire tipi scalari di dati così come subrange di quei tipi. Provides a defined set of Data Structures- Le data structures includono Arrays, Records, Files and Sets. Has a strong data typing element - il compilatore Pascal può diagnosticare un'assegnazione incompatibile di tipo di variabile. Supports Structured Programming - tramite l'utilizzo di sottoprogrammi, chiamate a procedure e funzioni. Simplicity and Expressivity - poichè il linguaggio è semplice e naturalmente espressivo consente un efficace insegnamento dei metodi di programmazione . 89 Pascal: esempio 90 Smalltalk. : 1972 Smalltalk è un linguaggio di programmazione object-oriented sviluppato allo Xerox PARC da Alan Kay, Dan Ingalls, Ted Kaehler, Adele Goldberg, e altri. Negli anni successivi saranno sviluppate le versioni Smalltalk-72, Smalltalk-74 and Smalltalk-76. Quest'ultimo ispirandosi anche a Simula. Molti concetti attualmente impiegati nello sviluppo del software (es. design patterns, extreme programming, refactoring) derivano dalla comunità Smalltalk. Lo Smalltalk ha pesatemente influenzato altri linguaggi come Objective C, Actor, Java and Ruby. 91 Smalltalk. : caratteristiche Tutto e' un oggetto in Smalltalk. Non ci sono tipi di dati semplici, Smalltalk lavora come Java e .Net in una macchina virtuale. La sintassi tenta di avvicinarsi all'inglese parlato, ma e' totalmente diversa da qualsiasi altro linguaggio di programmazione. Smalltalk naque gia' in un ambiente grafico. Ed era circa 10-15 anni avanti al suo tempo. Smalltalk aveva un buon successo fino all'arrivo di Java. Un esempio relativo agli array: 92 C : 1972 Fu ideato nei Bell Laboratories della AT&T da Dennis Ritchie come evoluzione del linguaggio B di Ken Thompson usato per la scrittura dei primi sistemi operativi UNIX. La definizione formale si ha nel 1978 a cura di B. W. Kernighan e D. M. Ritchie. Il compilatore C è incluso nel sistema operativo di Unix e il suo utilizzo crescerà in modo esplosivo anche al di fuori dei laboratori Bell. Il C appare semplice, efficiente e flessibile, infatti eseguire programmi scritti in C su altri sistemi operativi è più facile che con altri linguaggi. 93 C: caratteristiche Il C è tecnicamente un linguaggio di programmazione ad alto livello. Tuttavia, poiché esso mantiene evidenti relazioni semantiche con il linguaggio macchina e l'assembly, risulta molto meno astratto di linguaggi anche affini, come per esempio il Pascal. Per questo motivo, talvolta viene anche identificato con la locuzione (più ambigua) linguaggio di medio livello, se non addirittura (in modo certamente improprio) come macro-assembly, o assembly portabile.. Il C è rinomato per la sua efficienza, e si è imposto come linguaggio di riferimento per la realizzazione di software di sistema su gran parte delle piattaforme hardware moderne. La standardizzazione del linguaggio (da parte dell'ANSI prima e dell'ISO poi) garantiscono la portabilità dei programmi scritti in C (standard, spesso detto ANSI C) su qualsiasi piattaforma. 94 C: caratteristiche il programma è composto da moduli compilati separatamente permette la ricorsione ambiente e memoria locali dinamici (anche statici se dichiarati tali) permette puntatori Garbe collection (statico) Heap Basato su pochi concetti elementari: – – – – espressione dichiarazione / definizione istruzione / blocco funzione 95 C: componenti Il nucleo si fonda su un ricco set di: Tipi di dati: - Base - Derivati Strutture di controllo: - Selezione (strutture decisionali) - Iterazione Costrutti di decomposizione del programma: - Funzione - Unità di compilazione (modulo) Librerie Standard di corredo al compilatore: - Standard I/O - Gestione stringhe - Gestione dinamica della memoria - Funzioni matematiche - Altre Si noti come, rispetto ad altri linguaggi, molte funzionalità siano rese disponibili come librerie “esterne” invece che come costrutti del linguaggio. 96 C: fattori del successo Prima di tutto la felice scelta del modo di astrazione dall'hardware, che pur essendo del tutto logico e generico rimane molto vicino all'hardware stesso: il linguaggio C si basa su poche istruzioni chiave molto semplici, che spesso ricalcano l'assembly delle CPU e sono traducibili direttamente con una singola istruzione di linguaggio macchina. Riserva un ruolo centrale al concetto di puntatore, che viene generalizzato fino a concidere con l'indirizzamento indiretto, un modo di accedere alla memoria hardware caratteristico di tutte le moderne CPU. Inoltre la grammatica e la sintassi del C sono molto libere e flessibili, permettendo di scrivere istruzioni complesse e potenti in poche righe di codice . In definitiva, il successo del C fu decretato dall'essere un linguaggio creato da programmatori esperti, per essere usato da programmatori esperti. 97 C: ambienti d’uso Oltre che per il software di sistema, il C è stato a lungo il linguaggio dominante in tutta una serie di altri domini applicativi caratterizzati da forte enfasi sull'efficienza. Esempi tipici sono le: - telecomunicazioni, - il controllo di processi industriali e - il software real-time. Oggi il predominio del C in questi contesti è in parte diminuito a seguito dell'avvento di competitor significativi, primo fra tutti il C++; tuttavia, il tempo in cui il C si potrà considerare obsoleto appare ancora molto lontano. 98 C: lo sviluppo Il suo successivo larghissimo utilizzo portò alla nascita di diversi dialetti e quindi alla necessità di definirne uno standard, realizzatosi nel 1983 con la versione ANSI del C. Prendendo spunto da questa versione definitiva, e unendo al C l'uso delle classi di Simula, Bjarne Stroustrup iniziò a sviluppare il C++. Grazie alla particolare efficienza del codice prodotto dai sui compilatori, il C venne utilizzato per riscrivere la maggior parte del codice del sistema UNIX, riducendo l'uso dell'assembly ad un piccolo gruppo di funzioni. La sua importanza tuttavia, crebbe solo dopo il 1978 con la pubblicazione da parte di Brian Kernighan e Dennis Ritchie del libro The C Programming Language nel quale il linguaggio venne definito in modo preciso. Lo standard attuale del linguaggio è stato definito dall'International Standard Organization (ISO) nel 1999, ed è noto come ISO C99 (codice ISO 9899). 99 … C: un esempio Include la libreria standard di I/O main(): identifica il programma principale e rappresenta il punto di ingresso del programma all’inizio della sua esecuzione 100 Tiny Basic : 1975 Il dottor Wong sviluppa Tiny BASIC, che occupa solo 2K di memoria ed è caricabile da nastro perforato. Può funzionare praticamente su qualsiasi macchina con processore 8080 o Zilog Z80. In un tipico pc ci sono 4K di memoria, così con questo linguaggio 2K resterebbero disponibili. Tiny BASIC è anche il primo programma freeware (cioè gratuito). Nel suo interno furono trovate queste due buffe frasi: "All wrongs reserved" e "Copyleft". 101 BASIC : 1975 Una delle più famose implementazioni di Basic è quella curata da Bill Gates e Monte Davidoff per l'Altair 8800, poi evoluta in GW-BASIC per il primo MS-DOS. Negli anni dei primi microcomputers, tra cui il famoso Commodore 64, il linguaggio BASIC era fornito in dotazione, sia per la programmazione che come sistema operativo a riga di comando. In seguito il BASIC ha subito notevoli evoluzioni e cambiamenti diventando un linguaggio strutturato, compilato e con potenzialità molto simili ai linguaggi evoluti per professionisti. Attualmente esistono innumerevoli implementazioni del BASIC che ricalcano il concetto di partenza ampliandolo con i nuovi concetti di gestione di oggetti, ricorsività, strutturazione, etc... (per esempio Visual Basic) Il 1976 potrebbe segnare la nascita del software proprietario e dei principi che ci stanno dietro. Infatti assieme all'Altair si poteva comperare una versione del Basic, a circa 150 dollari. 102 E negli anni successivi? 1977: MUMPS (Massachusets general hospital Utility Multi- Programming System) ottiene il suo riconoscimento ANSIstandard. MUMPS era usato originariamente per salvare le cartelle dei pazienti per cui il linguaggio comprende solo caratteri di testo. La Honeywell partecipa alla gara per progettare il nuovo linguaggio battezzato ADA e il team di Jean Ichbiahn vincerà con la sua soluzione. Kim Harris e i suoi partner creano il FIG, (FORTRAN Interest Group). Svilupperanno il FIG-FORTRAN vendendolo per $20. Niklaus Wirth inizia a sviluppare il successore del Pascal, Modula (MODUlar LAnguage). Modula è un linguaggio fortemente segmentato, che si adatta bene alle esigenze di elaborazioni parallele. 103 …E negli anni successivi? 1978: Esce il linguaggio CSP 1983: Prima uscita del linguaggio ADA, derivato da Algol 68 1986:E' disponibile una nuova versione del linguaggio C, il C ++ 1986:Annuncio di Eiffel, ispirato a SmallTalk- 80. Eiffel è un linguaggio object-oriented che enfatizza il disegno e la costruzione di software di elevata qualità e riusabilità 1988:Esce il Perl (Practical Extraction and Report Language), creato da Larry Wall. Un linguaggio di script ottimizzato per fare la scansione arbitraria di file di testo, per estrarne informazioni e stampare report basati sui dati estratti. 1988: Esce il Quick Basic. 1989: Con l'avvento del Web viene reso disponibile un metalinguaggio che ne rappresenterà la base di sviluppo dei siti: l'HTML. 104 … E ancora… 1992: Microsoft annuncia il Visual BASIC. Si tratta di un derivato del BASIC, con l'aggiunta della gestione object-oriented e event driven, ideale per l'ambiente Windows. 1995: Fa la sua comparsa Java 1, figlio di C++ e SmallTalk.Il Turbo Pascal risorge a nuova vita in Delphi. 1998: Esce la versione Java 2 del famoso programma. 2000: Da Java 2 deriva il linguaggio "C#". 105 Un po’ di richiami Fino a circa la fine dell'80, il software o veniva ceduto assieme alla macchina, o veniva scritto su richiesta dei clienti, è solo con la nascita del PC IBM, 1981, che il computer si diffonde a milioni di pezzi e nasce una richiesta di massa di software e quindi la necessità di una legislazione. Su come proteggere i diritti dell'autore del programma software esisteva un dibattito teorico già da una decina d'anni. In Francia nel '68, una legge dichiarò semplicemente il software non brevettabile. Negli USA, il software non veniva brevettato in quanto l'Ufficio Brevetti non aveva la più pallida idea di come si potesse brevettare un programma software. Il problema infatti esiste tuttora, essendo quasi impossibile riconoscere se un software in qualche modo lede i diritti brevettuali di un altro, salvo plateali copie pedanti. Comunque, sulla pressione dei produttori di software, il governo americano promulgò nel 1980 il Copyright Act con il quale si riconosceva al software un tipo protezione simile a quella accordata sino allora ai testi letterari o alle altre forme d'autore. 106 Un po’ di richiami Non sfuggi' ai legislatori l'effetto 'Mimetè, ma venne semplicemente risolto vietando severamente ogni forma di duplicazione del software. Tanto era rigida la legge che un pò dopo dovettero chiarire che la duplicazione per uso di 'back-up' era lecita! Inoltre si iniziò ad usare la formula della licenza d'uso personale, che vi vieta di installare il vostro Windows sulla seconda delle due macchine che avete in casa, se non comprate la seconda licenza. Infatti il software non è vostro, resta di proprietà di Bill che gentilmente vi permette di installarne una copia e una sola. L'Italia seguendo le direttive di Bruxelles si è data una legge sul software nel 1992, legge 518. Senza entrare nei dettagli, voglio solo far notare che la copia illecita di software è punita con reclusione da 3 mesi a tre anni. Quasi come un omicidio! La legislazione italiana però, un pò più permissiva di quella americana, permette la rivendita della licenza software e pur non autorizzandola espressamente, non condanna la copia per uso non di lucro. Ma poichè lucro potrebbe anche essere il fatto di copiare per uso personale in quanto si `risparmia' di pagare la licenza, non è così sicuro che si possa copiare per uso personale, quindi non vi suggerisco di farlo!!!!!! 107 Generalità sui Sistemi Operativi Un sistema operativo è un insieme di programmi che corredano l’elaboratore, gestendone le risorse hardware e software. Controlla l’esecuzione dei lavori degli utenti e permette l’efficiente utilizzazione delle risorse dell’elaboratore; per risorse s'intendono i dispositivi hardware e software che concorrono all’elaborazione dell’informazione. Esso realizza una duplice funzionalità: costituisce un’interfaccia tra la macchina e l’utente e gestisce in modo ottimale le risorse del sistema. 108 Generalità sui Sistemi Operativi La funzione principale del sistema operativo è la gestione delle risorse di cui il sistema dispone (Processore, Memoria, Periferiche). Il sistema operativo coordina le varie operazioni, stabilisce le priorità quando vi sono più richieste, sfrutta nel modo migliore le risorse. L’utente ha così l’impressione di avere la macchina a sua completa disposizione, anche se collegata in rete ed è sicuro di trovare la propria stampa anche se altri usano la stampante. Il compito del sistema operativo è quindi quello di portare la macchina all’utente, permettendo a questo di usarla in modo semplice, sicuro ed efficiente. 109 Generalità sui Sistemi Operativi Il modo di operare di un sistema definisce i seguenti tipi di elaborazione: elaborazione a lotti (batch processing): più lavori vengono raccolti e presentati al sistema che li elabora in sequenza e ne fornisce i risultati relativi (esempi il calcolo degli stipendi mensili del personale di un’azienda, l’elaborazione di dati sperimentali raccolti per un certo periodo). elaborazione in tempo reale (real time processing): i dati su cui operano i programmi per ottenere risultati arrivano ininterrottamente e vengono elaborati istantaneamente influenzando eventualmente elaborazioni successive (un esempio è il sistema di prenotazioni dei posti su linee). 110 Generalità sui Sistemi Operativi elaborazione in multi programmazione (multiprogramming): più lavori possono essere eseguiti contemporaneamente la CPU può eseguire una alla volta, nel tempo, istruzioni di job diversi permettendone uno sviluppo contemporanero senza dover attendere il completamento di un lavoro prima di iniziarne un altro. multielaborazione (multiprocessing): più lavori vengono elaborati simultaneamente mediante duplicazione di unità. Ad esempio più unità centrali possono operare in parallelo. 111 Generalità sui Sistemi Operativi divisione di tempo (time sharing): il tempo di CPU è ripartito fra più utenti; più lavori possono essere elaborati simultaneamente ed ogni utente avrà la sensazione di essere l’unico utilizzatore del sistema. Il funzionamento in time sharing differisce dalla multiprogrammazione per il fatto che l’elaborazione rimane sempre sotto il controllo dell’utente e quindi esiste un colloquio utente-elaboratore. modo interattivo: viene stabilito tra l’utente e il sistema un colloquio tramite unità di accesso che generalmente consiste in un terminale video con tastiera; con l’interattività ad esempio è possibile verificare istantaneamente la validità sintattica delle frasi del programma e provvedere immediatamente alla loro eventuale correzione. 112 Generalità sui Sistemi Operativi Per quanto riguarda il tipo di accesso permesso all’utente al sistema di elaborazione possiamo distinguere in: accesso locale dei lavori: l’utente può accedere alle classiche accesso remoto: i lavori giungono al sistema da stazioni unità di input-output poste nello stesso ambiente del sistema di elaborazione; remote collegate. 113 L’evoluzione dei Sistemi Operativi anni quaranta I primi elaboratori degli anni Quaranta erano macchine di enormi dimensioni. All’epoca erano però lo stato dell’arte della tecnologia e permettevano di automatizzare i lavori d’ufficio. In macchine così complesse, già era complicata la programmazione, figuriamoci la gestione delle risorse. Non esisteva un sistema operativo in grado di coordinare gli eventi: tecnici altamente specializzati, gli operatori, intervenivano direttamente sulle componenti fisiche della macchina per poter fare avanzare il lavoro. 114 L’evoluzione dei Sistemi Operativi anni cinquanta Una prima rudimentale forma di sistema operativo è data dall’introduzione del monitor o supervisore, un sequenzializzatore automatico che permette il trasferimento dell’elaborazione da un lavoro all’altro senza bisogno dell’intervento diretto dell’operatore. Il funzionamento di simili computer è detto "a programma singolo": il software di base è costituito solo da semplici istruzioni atte a svolgere le funzioni essenziali, come la gestione delle periferiche di input/output. L’uso della macchina è permesso ad un solo programmatore alla volta. 115 L’evoluzione dei Sistemi Operativi anni cinquanta Negli anni Cinquanta vennero introdotti i linguaggi di programmazione, come il FORTRAN. Aumenta così il numero dei programmatori, quindi degli utenti, quindi le elaborazioni necessarie. Le varie risorse delle macchine hanno differente velocità di lavoro: si pensi alla stampante. Si è cercato così di ridurre i tempi morti, delineando il concetto di parallelismo: mentre vengono stampati dei dati, il processore può nel frattempo eseguire un altro lavoro. Si parla quindi di elaborazione batch per indicare che in un unico lotto viene richiesta alla macchina l’esecuzione di più lavori. 116 L’evoluzione dei Sistemi Operativi anni cinquanta Il batch monitor, ovvero il programma che sfrutta tale parallelismo tra risorse, diventa così il primo vero sistema operativo, in grado di gestire in modo ottimizzato le risorse e di permettere agli utenti di velocizzare il proprio lavoro. 1951: Il primo Univac I è spedito all'Ufficio del Censimento degli USA in marzo. 117 L’evoluzione dei Sistemi Operativi anni sessanta A cavallo tra gli anni Cinquanta e gli anni Sessanta il sistema operativo subisce sostanziali modifiche; in particolare, nascono due nuovi termini. 1. L’interattività indica un uso conversazionale e diretto della macchina; 2. il time sharing è la condivisione delle risorse tra più utenti. Queste due funzionalità sono state introdotte col crescere dell’esigenza degli utenti, che volevano elaboratori con prestazioni sofisticate ma a prezzi contenuti. L’elaboratore permette di interagire con il processo durante la sua stessa esecuzione, mentre permette la distribuzione nel tempo dei propri servizi. In questo modo, è sempre più vicina la definizione di sistema operativo. 118 L’evoluzione dei Sistemi Operativi anni sessanta Gli anni Sessanta si chiudono con un problema, che si delinea con una sempre più grande chiarezza: i programmatori (come del resto succede ancora oggi) non riescono a mantenersi al passo con la tecnologia. Il software viene prodotto a costi elevati e sfruttato in modo non adeguato; si parla in questo caso di crisi del software: i sistemi operativi sono troppo complicati, difficili da gestire e con prestazioni che non giustificano i costi. 119 L’evoluzione dei Sistemi Operativi anni settanta Negli anni Settanta si cerca una soluzione al problema, sia sul versante del software che su quello dell’hardware. Il software diventa meno complicato, perché diventa specifico per la singola macchina e non per un grande elaboratore, che richiede una gestione più complessa. Non si dimentichi infatti che le capacità delle grandi unità di elaborazione centrali vennero raggiunte e sorpassate da nuove macchine, più agili, più flessibili e meno costose. 120 L’evoluzione dei Sistemi Operativi anni settanta Dal supercomputer che gestiva l’intero sistema informativo, si passa all’uso di tante macchine indipendenti, assegnate ciascuna ad un utente. Il punto più significativo di questa importante rivoluzione tecnologica è dato dall’introduzione del personal computer nei primi anni Ottanta. Commodore Pet 2000 121 Alcuni sistemi operativi tra gli anni 50 e il 1975 Atlas; ITS; XDS-940; Multics; THE; OS/360; Venus; TSS/360; RC 4000; VM/CMS; CTSS; Unix; 122 Sistema Operativo Atlas Atlas (Kilburn et al. [1961], Howarth et al. [1961]) fu disegnato alla University of Manchester in Gran Bretagna alla fine degli anni 50 ed ai primi degli anni 60. I driver delle periferiche costituivano una delle parti principali del sistema. Esso era un sistema operativo a lotti con spooling. Lo spooling permetteva al sistema di registrare i job in base alla disponibilità delle periferiche (unità a nastro magnetico, unità per la scrittura o la lettura di nastri di carta, stampanti, unità di lettura o di scrittura su schede). 1962: Teletype modello 33 composta da una tastiera ed unità nastro 123 Sistema Operativo Atlas La funzionalità più ragguardevole di Atlas, comunque, era la sua organizzazione della memoria. La core memory (memoria centrale) era nuova e costosa allo stesso tempo. Molti computer, come l'IBM 650, usavano un tamburo per la memoria principale. La paginazione su richiesta veniva usata per trasferire automaticamente informazioni tra la core memory e il tamburo. La memoria fisica di Atlas era un tamburo di 98 KB parole e di 16 KB parole del core. La memoria era divisa in pagine da 512 parole, fornendo 32 frame di memoria fisica. 1953- IBM 650 124 Sistema Operativo Atlas Se si verificava un errore di pagina, veniva richiamato un algoritmo di rimpiazzo. L'algoritmo di sostituzione di pagina cercava di prevedere il comportamento degli accessi futuri alla memoria basandosi su quelli precedenti. Un bit di riferimento veniva impostato per ogni frame ogni volta che si accedeva a quest'ultimo. I bit di riferimento venivano letti dalla memoria ogni 1.024 istruzioni, e gli ultimi 32 valori di questi bit venivano conservati. Lo storico veniva utilizzato per definire il tempo intercorso dall'ultimo riferimento (t1), e l'intervallo tra gli ultimi due riferimenti (t2). 125 Sistema Operativo Atlas Le pagine venivano scelte per il rimpiazzo nell'ordine seguente: 1. Qualsiasi pagina, con t1 > t2 + 1, veniva considerata inutilizzata. 2. Se t1 ≤ t2 per tutte le pagine, allora la pagina si rimpiazza con quella con l’intervallo maggiore t2 - t1. L'algoritmo di sostituzione dà per scontato che il programma acceda ciclicamente alla memoria. Se il tempo intercorso tra gli ultimi due riferimenti è t2, allora un altro riferimento è atteso in seguito per t2 unità di tempo. Se un riferimento non avviene (t1 > t2), si deduce che la pagina non viene più utilizzata e quindi viene sostituita. Se tutte le pagine sono ancora in uso, allora quella di cui non ci sarà più bisogno per il tempo più lungo verrà sostituita. 126 Sistema operativo XDS-940 Il sistema operativo XDS-940 (1965) fu progettato a Berkeley all’Università della California. Come il sistema Atlas, utilizzava la paginazione per la gestione della memoria. XDS-940 era un sistema a condivisione del tempo. La memoria virtuale di ogni processo dell'utente era di soli 16 KB parole, mentre la memoria fisica era di 64 KB parole. Ogni pagina era di 2 KB parole e la tabella delle pagine veniva mantenuta nei registri. 127 Sistema operativo XDS-940 Dato che la memoria fisica era più grande della memoria virtuale, molti processi dell’utente potevano risiedere in memoria contemporaneamente. Il numero di utenti poteva essere aumentato con la condivisione delle pagine, quando queste contenevano codice rientrante a sola lettura. I processi venivano mantenuti su un tamburo e venivano scambiati, in base alle necessità, dentro e fuori dalla memoria. 128 Sistema operativo XDS-940 Il sistema XDS-940 fu costruito basandosi su di un XDS-930 modificato. Le modifiche furono rappresentative dei cambiamenti apportati al computer base per permettere di scrivere un sistema operativo in modo corretto. Fu aggiunta la modalità user-monitor; alcune istruzioni (come Halt e quelle di I/O), vennero definite come privilegiate: un tentativo di eseguire un'istruzione privilegiata in modalità utente sarebbe stato bloccato dal sistema operativo. 129 Sistema operativo XDS-940 Fu aggiunta un'istruzione di chiamata di sistema al gruppo di istruzioni in modalità utente, la quale fu utilizzata per creare nuove risorse, come i file, permettendo al sistema operativo di organizzare le risorse fisiche. I file, per esempio, venivano allocati in blocchi da 256 parole sul tamburo. Veniva usata una mappa di bit per la gestione dei blocchi liberi sul tamburo. Ogni file aveva un blocco-indice con puntatori ai blocchi dei dati attuali. I blocchi-indice erano concatenati tra loro. 130 Sistema operativo XDS-940 Il sistema XDS-940 forniva anche chiamate di sistema per permettere ai processi di creare, eseguire, sospendere, e distruggere i sottoprocessi. Un programmatore poteva costruire un sistema di processi. Processi separati potevano condividere la memoria per le comunicazioni e la sincronizzazione. La creazione di un processo definiva un struttura ad albero, dove un processo è la radice e i suoi sottoprocessi sono nodi nell'albero sotto di esso. Ogni sottoprocesso poteva, a sua volta, creare altri sottoprocessi. 131 Sistema operativo THE Il sistema operativo THE (Dijkstra [1968], McKeag e Wilson [1976]) fu progettato alla Technische Hogeschool a Eindhoven in Olanda. Era un sistema a lotti che funzionava su un computer olandese, EL X8, con 32 KB di parole a 27-bit. Il sistema fu notato principalmente per il suo progetto semplice e lineare, soprattutto per la sua struttura a livelli (6), e per l’uso di un gruppo di processi concorrenti che impiegavano semafori per la sincronizzazione. A differenza del sistema XDS-940, tuttavia, il gruppo di processi nel sistema THE era statico. Il sistema operativo stesso fu creato come un insieme di processi tra loro cooperanti. Inoltre, furono creati cinque processi utente che servivano come agenti attivi per compilare, eseguire e stampare i programmi utente. 132 Sistema operativo THE Quando un job veniva concluso, il processo ritornava alla coda di input per selezionare un altro job. Questo sistema utilizzava un algoritmo di schedulazione della CPU basato sulle priorità, che venivano ricalcolate ogni 2 secondi ed erano inversamente proporzionali al tempo in cui la CPU era stata usata recentemente (negli ultimi 8-10 secondi). Questo schema dava maggiore importanza ai processi I/O bound e a quelli nuovi. La gestione della memoria era limitata dalla mancanza di supporto hardware. Tuttavia, dato che il sistema era limitato e i programmi potevano essere scritti solo in Algol, veniva usato un sistema di paginazione software. 133 Sistema operativo Venus Fortemente legato al sistema THE è il sistema Venus (Liskov [1972]). Il sistema Venus era anche esso un progetto con struttura a strati, che usava i semafori per sincronizzare i processi. I livelli più bassi del progetto furono implementati in micro-codici, fornendo, tuttavia, un sistema molto più veloce. La gestione della memoria fu modificata nel tipo paginata a segmenti. Il sistema fu inoltre progettato per essere a condivisione del tempo, piuttosto che un sistema a lotti. 134 Sistema operativo RC 4000 Il sistema RC 4000, come il sistema THE, si distingueva principalmente per le caratteristiche progettuali. Fu ideato per il computer danese RC 4000 da Regnecentralen, in particolare da Brinch-Hansen (Brinch-Hansen [1970], Brinch-Hansen [1973]). L'obiettivo non era di progettare un sistema a lotti, o un sistema a condivisione del tempo, o altri sistemi specifici, ma di creare un nucleo di sistema operativo, o kernel, su cui poter costruire un sistema operativo completo. Così, la struttura del sistema era a strati, e venivano forniti solo quelli più bassi: il kernel. 135 Sistema operativo RC 4000 Il kernel supportava diversi processi concorrenti. Uno schedulatore della CPU di tipo round robin supportava i processi. Anche se i processi stessi potevano condividere la memoria, il meccanismo principale di comunicazione e sincronizzazione era il sistema di messaggi fornito dal kernel. I processi potevano comunicare tra di loro scambiandosi messaggi di lunghezza fissa di otto parole. Tutti i messaggi venivano immagazzinati in buffer facenti parte di un gruppo comune di buffer. Quando un buffer del messaggio non era più necessario, veniva restituito al gruppo comune. Una message queue (coda di messaggi) era associata ad ogni processo e conteneva tutti i messaggi che erano stati inviati a quel processo, ma che non erano ancora stati ricevuti. I messaggi venivano rimossi dalla coda seguendo l'ordine FIFO 136 Sistema operativo RC 4000 Anche le periferiche di I/O venivano trattate come processi. I driver delle periferiche erano codici che convertivano gli interrupt e i registri della periferiche in messaggi. In tal modo, un processo avrebbe scritto ad un terminale, inviandogli un messaggio. Il driver di periferica avrebbe ricevuto il messaggio e fatto apparire il carattere sul terminale. Un carattere in input poteva interrompere il sistema e venire trasferito a un driver di periferica. Il driver di periferica poteva creare un messaggio a partire dal carattere immesso, e inviarlo ad un processo in attesa. 137 Sistema operativo CTSS Il Compatible Time-Sharing System (CTSS) (Corbato et al. [1962]) fu progettato presso MIT come sistema sperimentale a condivisione del tempo. Fu implementato su un IBM 7090 ed all'occorrenza supportava fino a 32 utenti interattivi. Agli utenti veniva fornito un gruppo di comandi interattivi che permetteva loro di manipolare i file, di compilare ed avviare i programmi tramite un terminale. 138 Sistema operativo CTSS Il 7090 aveva una memoria di 32 KB, formata da parole a 36-bit. Il monitor utilizzava 5 KB parole, e lasciava 27 KB agli utenti. Le immagini della memoria utente venivano scambiate tra la memoria e un tamburo veloce. La schedulazione della CPU impiegava un algoritmo a coda multilevello con retroazione (multilevel-feedback-queue). IBM 7090 139 Sistema operativo CTSS Il quanto di tempo per il livello i era 2 * i unità di tempo. Se un programma non finiva di utilizzare la CPU in un quantum di tempo, veniva spostato al livello successivo della coda, assegnandogli il doppio del tempo. Il programma al livello più alto (con il quantum più breve) veniva avviato per primo. CTSS era estrememente ben riuscito e rimase in uso fino al 1972. Anche se era limitato, riuscì a dimostrare che il time-sharing era una tecnologia di elaborazione pratica e conveniente. Un risultato di CTSS fu di aumentare lo sviluppo dei sistemi a condivisione del tempo; un altro risultato fu lo sviluppo di MULTICS. 140 Sistema operativo ITS ITS, acronimo per Incompatible Timesharing System (sistema timesharing incompatibile), era un altro dei primi, rivoluzionari e influenti sistemi operativi Time sharing del MIT. Fu sviluppato principalmente al laboratorio di intelligenza artificiale del MIT, con aiuti da parte del Progetto MAC. Fu il primo sistema con pieno accesso condiviso ai file fra computer, il primo con I/O indipendente dal terminale usato, oltre che a numerose altre significative innovazioni. Insieme ad altre innumerevoli stranezze, il suo interprete di comandi di alto livello era un debugger e il suo editor principale era TECO, programmabile anche lui in maniera altrettanto particolare. ITS fu sviluppato sui mainframe PDP-6 e PDP-10 della Digital Equipmen Corporation (DEC). ITS fu prodotto da persone che non accettavano la direzione dello sviluppo presa con Multics. 141 Sistema operativo MULTICS Il sistema operativo MULTICS (Multiplexed Information and Computing Service) fu ideato presso l’MIT come naturale estensione di CTSS a partire dal 1963. Quando divennero disponibili computer più grandi, gli ideatori di CTSS decisero di creare una funzione di sistema per la condivisione del tempo. Nella sua concezione originale avrebbe dovuto poter servire le necessità di calcolo dell'intera città di Boston similmente ad un servizio di distribuzione di elettricità o acqua corrente I grandi sistemi di computer sarebbero stati connessi da cavi telefonici a terminali negli uffici e nelle case in tutta la città. Il sistema operativo sarebbe stato un sistema a tempo condiviso funzionante in modo continuativo e dotato di un vasto sistema di programmi e dati condivisi. 142 Sistema operativo MULTICS MULTICS fu progettato da un gruppo dell’MIT: GE (che in seguito vendette il suo dipartimento di computer alla Honeywell), ed ai Bell Laboratories (che abbandonarono il progetto nel 1969). Il GE 635 di base fu modificato per evolversi in un nuovo sistema chiamato GE 645, principalmente con l'aggiunta di hardware con memoria a segmentazione paginata. Un indirizzo virtuale era composto da un numero di segmento a 18-bit e da uno spiazzamento di parole a 16-bit . I segmenti venivano poi divisi in pagine da 1 KB parole. Veniva usato l'algoritmo di rimpiazzo delle pagine detto second-chance. Lo spazio per l'indirizzo virtuale segmentato era fuso nel file system; ogni segmento era un file, e il suo indirizzo il nome del file stesso. Il file system stesso era una struttura multilivello ad albero che permetteva agli utenti di creare le loro strutture di sottodirettori. 143 Sistema operativo MULTICS Come CTSS, MULTICS utilizzava una coda multilivello con retroazione per la schedulazione della CPU. La protezione era realizzata da una lista di accesso associata ad ogni file e da un gruppo di anelli di protezione per i processi in esecuzione. Il sistema, che era scritto quasi interamente in PL/1, comprendeva circa 300.000 righe di codice. Fu esteso ad un sistema multiprocessore, permettendo ad una CPU di essere messa fuori servizio per la manutenzione mentre il sistema continuava a funzionare. Il sistema venne modificato nell'arco degli anni seguenti per essere usato su varie macchine e sopravvisse fin quasi ai nostri giorni, infatti l'ultimo sistema Multics rimasto in servizio, per il Dipartimento della Difesa Canadese, fu definitivamente spento il 30 ottobre 2000. 144 Sistema operativo OS/360 La linea di sviluppo più duratura di un sistema operativo è, senza dubbio, quella dei computer IBM. I primi computer IBM, come l'IBM 7090 e l'IBM 7094, sono i primi esempi di sviluppo di procedure comuni di I/O, seguite da un monitor residente, da istruzioni privilegiate, dalla protezione della memoria, e da semplice elaborazione a lotti. Questi sistemi furono sviluppati separatamente, spesso in luoghi diversi e indipendenti. Come risultato, IBM si trovò di fronte a molti computer differenti, con linguaggi e software di sistema diversi. IBM 7094 145 Sistema operativo OS/360 L'IBM/360 fu progettato per cambiare questa situazione: fu realizzato come una famiglia di computer che copriva l'intera gamma di macchine per piccole imprese a grosse macchine per uso scientifico. Serviva solo un solo software per questi sistemi, che utilizzavano tutti lo stesso sistema operativo: OS/360 (Mealy et al. [1966]). Si pensava che questa disposizione potesse ridurre i problemi di manutenzione per l’IBM e che permettesse agli utenti di spostare liberamente programmi e applicazioni da un sistema all’altro. 146 Sistema operativo OS/360 Sfortunatamente, OS/360 cercò di fare troppe cose, e, come risultato, non svolse i propri compiti particolarmente bene. Il file system includeva un campo di informazioni che definiva il genere di ogni file; erano definiti diversi tipi di file, con record di lunghezza fissa e variabile, e i file bloccati o non bloccati. Veniva utilizzata l'allocazione contigua, in modo che l'utente potesse indovinare la dimensione di ogni file in output. Il Job Control Language (linguaggio di controllo del job: JCL) aggiunse dei parametri per ogni possibile opzione, rendendolo incomprensibile all'utente medio. 147 Sistema operativo OS/360 Le routine di gestione della memoria fu ostacolata dall'architettura. Sebbene fosse utilizzata una modalità di indirizzamento tramite registro base, il programma poteva accedere e modificare tale registro, in modo da venir generati indirizzi assoluti dalla CPU. Questa modifica impediva la rilocazione dinamica; il programma era legato alla memoria fisica nella fase di caricamento. Furono prodotte due versioni diverse del sistema operativo: OS/MFT che utilizzava regioni fisse e OS/MVT che utilizzava regioni variabili. Il sistema fu scritto in linguaggio assembler da migliaia di programmatori, dando come risultato milioni di righe di codice richiedendo molta memoria per i propri codici e tabelle, e spesso l’overhead della CPU consumava metà dei cicli totali. 148 Sistema operativo OS/360 Col passare degli anni, furono rilasciate nuove versioni per aggiungere caratteristiche nuove e per correggere gli errori. Tuttavia, la correzione di un errore spesso ne provocava un altro in qualche parte remota del sistema, in modo che il numero di errori conosciuti nel sistema restava costante. Ad OS/360 venne aggiunto il supporto per la memoria virtuale con l’introduzione dell’architettura IBM 370. L’hardware sottostante permetteva la gestione di memoria virtuale a pagine segmentate. Versioni più recenti del sistema operativo utilizzavano tale hardware in modalità diverse. 149 Sistema operativo OS/360 L’OS/VS1 creava un unico grande spazio di memoria virtuale, ed eseguiva in esso OS/MFT. In questo modo, il sistema operativo stesso era paginato, così come i programmi degli utenti. L’OS/VS2 Release 1 eseguiva OS/MVT in memoria virtuale; infine OS/VS2 Release 2,conosciuto come MVS, forniva ad ogni utente un proprio spazio di memoria virtuale. MVS è principalmente un sistema operativo a lotti. Il sistema CTSS veniva eseguito su un IBM 7094, ma l’MIT decise che lo spazio di indirizzamento del 360, successore dell’IBM 7094, era troppo piccolo per il MULTICS, e così cambiarono fornitore. 150 Sistema operativo TSS/360 Come conseguenza, IBM decise di creare un proprio sistema a tempo condiviso: TSS/360 (Lett e Konigsford [1968]). Come MULTICS, TSS/360 si proponeva di essere una funzione di sistema per la gestione della condivisione del tempo. L’architettura base del modello 360 fu modificata nel modello 67 per gestire la memoria virtuale. Molte aziende acquistarono il sistema 360/67 prima dell’uscita di TSS/360. TSS/360, tuttavia, fu ritardato nell’uscita, e così vennero sviluppati altri sistemi a condivisione del tempo come sistemi temporanei, fino alla piena disponibilità. Una opzione di condivisone del tempo (time-sharing optino: TSO) venne aggiunta ad OS/360. 151 Sistema operativo VM/CMS Il sistema VM/CMS (Virtual Machine/Conversational Monitor System, originariamente chiamato CP/CMS) è un sistema operativo di IBM che possiede due componenti principali, VM e CMS, ciascuna operante come un sistema operativo indipendente. VM è un sistema a macchine virtuali il quale fornisce ad ogni singolo utente un ambiente assimilabile ad un mainframe personale. CMS e' un semplice sistema operativo ad utente singolo progettato per essere eseguito, pricipalmente, in ambiente VM. 152 Sistema operativo VM/CMS Ad ogni utente di VM/CMS e' fornita la propria macchina virtuale in cui eseguire CMS. Lo sviluppo partì basandosi su quello che era stato il "CP-40 Project", lavorando con un System 360 Model 40 modificato, al Cambridge Scientific Center (CSC) di IBM nell'autunno del 1964. CP-40 era un sistema operativo a macchina virtuale: un semplice ambiente interattivo ad utenza singola e il CMS fu progettato per lavorare con esso. L'implementazione attuale partì nel 1965 e il sistema completo fu reso disponibile agli utenti nei primi mesi del 1966. VM/CMS non fu formalmente commercializzato come un prodotto IBM e, per molti anni, ci furono diatribe politiche interne riguardanti quali risorse avrebbero dovuto essere dedicate ad esso a dispetto di altri prodotti IBM della stessa tipologia. 153 Sistema operativo VM/CMS Dopo l'annuncio del System 360 Model 67 da parte di IBM, il software fu convertito per funzionare su quella piattaforma hardware ed il CP-40 fu rinominato CP-67. Una prima versione del sistema fu installata ai laboratori Lincoln del MIT nel 1967 a causa dell'insoddisfazione del Lincoln per il TSS (Time Sharing System), che era molto lento ed inaffidabile. Il personale del Lincoln collaborò attivamente con CSC per il miglioramento del sistema operativo e così fece anche la Union Carbide, la quale decise, anch'essa, di adottare VM/CMS. IBM 360/67 154 Sistema operativo VM/CMS All'inizio del 1968 si ebbe il successo del sistema operativo e la maggior parte dei System 360/67 installarono VM/CMS e non TSS che era il sistema "ufficiale" di IBM per quella piattaforma hardware. Questo portò inevitabilmente alla dismissione di TSS, nel 1971. In seguito, l'utilità di VM/CMS impedì ogni tentativo di soppiantarlo e costrinse IBM ad arrendersi di fronte all'evidente importanza dello stesso. VM 370 Welcome screen 155 Cosa andò storto con TSS/360 e MULTICS? Una parte del problema consisteva nel fatto che questi sistemi avanzati erano troppo grandi e troppo complessi per essere compresi. Un altro problema risiedeva nell’assunto che la potenza di elaborazione sarebbe stata disponibile tramite un grande computer remoto a condivisione del tempo. Oggi, invece, sembra che la maggior parte delle elaborazioni verrà svolta da piccole macchine individuali: i personal computer, e non da grandi computer remoti che si propongono di gestire ogni cosa per ogni singolo utente. 156 Da MULTICS a UNIX Nel 1965, nei laboratori della Bell, una divisione AT&T, veniva aperto un progetto chiamato Multics (Multiplexed Information and Computing Service) che vedeva la collaborazione di General Electric e del MIT (Massachusetts Institute of Technology) per trovare una soluzione capace di gestire centraline telefoniche, sistemi di calcolo multiutente con costi ridotti. Nonostante le buone intenzioni, problemi di budget decretarono la fine del progetto ma questo non fermò Ken Thompson e Dennis Ritchie che in seguito all'esperienze fatte precedentemente continuarono a lavorare su un progetto loro. Thompson e Ritchie 157 Da MULTICS a UNIX La scelta si trovò di fronte ad evidenti problemi di sorta, ovvero la necessità di trovare un calcolatore per portare avanti il progetto. Venne preparato un piano di sponsorizzazioni ma questo fu rifiutato e le voci di corridoio dicono che Bill Baker, il vice-presidente dei Bell Labs, esclamò: ``Bell Labs just doesn't do business this way!'' Era un progetto molto vago sotto l'aspetto economico e non fu abbastanza convincente per ricevere i fondi necessari, là dove era già stata decretata la fine di Multics in precedenza. Ritchie e Thompson non si persero d'animo, prepararono un prospetto del sistema operativo e lo distribuirono tramite l'ufficio stampa dei Bell Labs ad un ampio numero di ricercatori. Questo scatto ebbe i suoi frutti e venne trovato un piccolo e usato PDP-7 da utilizzare per la sperimentazione e lo sviluppo del progetto. L'estate del '69 fu interamente dedicata a realizzare una bozza significativa per iniziare i lavori del progetto. 158 Sistema operativo UNIX Nel 1970 fu battezzato Unix da Brian Kernighan, come gioco di parole con Multics, e fu sottoposto un prospetto a due responsabili dei dipartimenti di ricerca per l'acquisto di un PDP-11; Doug McIlroy e Lee McMahon furono di fondamentale importanza e una volta trovati i fondi necessari fu possibile acquistare il calcolatore per il progetto. Il porting di Unix dal PDP-7 al PDP-11 venne fatto tramite due terminali Teletype 33 e rapidamente attrasse a sè credibilità nei confronti degli altri dipartimenti di ricerca. Sulla spinta del successo fu ulteriormente proposto di acquistare un nuovo sistema PDP-11/45 e quest'ultima non ebbe problemi a concretizzarsi. PDP-7 PDP-11 159 Sistema Operativo UNIX In origine tutto il sistema operativo era scritto in linguaggio assembly. Era necessario trovare una soluzione per rendere questo iniziale sistema operativo portabile su altri calcolatori in maniera semplice. Ken Thompson inventò invece un linguaggio chiamato B, che fu influenzato da un altro linguaggio chiamato BCPL (Basic Combined Programming Language, ideato da Martin Richards presso l'università di Cambridge.). Nel 1971 cominciò il lavoro al linguaggio che sarebbe diventato il C, un passo evolutivo che svincolava il linguaggio dal precedente calcolatore utilizzato per lo sviluppo. 160 Sistema Operativo UNIX Nel 1973 il kernel di Unix fu riscritto in C e poteva funzionare su dieci macchine. Nell'ottobre del 1973, Thompson e Ritchie presentarono un paper al Symposium for Operating System Principles e l'interesse per il sistema esplose. All'epoca, la AT&T era indagata per comportamenti monopolistici e le fu ordinato di rimanere fuori dall'industria dei computer. Ciò costrinse gli utenti a riunirsi per potersi prestare assistenza reciprocamente, rinforzando i valori che all'inizio avevano portato alla creazione del sistema. Nel 1975 Ken Thompson ritornò all'Università della California a Berkeley, e portò Unix con sé. Là due dottorandi, Chuck Haley e Bill Joy, fecero il porting del sistema Pascal, al quale Thompson aveva lavorato, ad uno stato in cui poteva essere utilizzato, e crearono l'editor di testi vi. 161 Sistema Operativo UNIX Nacque così la Berkeley System Distribution di Unix o più semplicemente BSD Unix, una soluzione che veniva distribuita su nastro su richiesta. Le stesse intenzioni erano ben lontane dagli scopi commerciali; la diffusione di BSD Unix, come affermò Joy, era un modo per ampliare la base degli utenti e avere maggior feedback e così fu. Nel corso degli anni BSD Unix venne continuamente migliorato e ampliato. La ``Second Berkeley Software Distribution'' (2BSD) era pronta nel 1978 e a questa susseguì una nuova versione nel dicembre 1979, la 3BSD. Quest'ultima venne particolarmente apprezzata all'interno degli ambienti scientifici e universitari. Grazie a Bob Fabry viene ricevuto un ingente finanziamento dal progetto DARPA (Defense Advanced Research Project Agency) volto a migliorare e sviluppare le funzionalità di rete del sistema operativo. Nel 1980 vengono rilasciate le distribuzioni 4BSD e 4.1BSD, il primo sostanzioso passo nel ramo networking su TCP/IP. 162 Altri Sistemi operativo Vi sono, ovviamente, altri sistemi operativi, e molti di essi hanno caratteristiche interessanti. Il sistema operativo MPC per la famiglia di computer Burroughs (McKeag e Wilson[1976]) fu il primo ad essere scritto in un linguaggio di programmazione per i sistemi. Esso supportava la segmentazione e CPU multiple. Il sistema operativo SCOPE per CDC 6600 (McKeag e Wilson [1976]) supportava anch’esso CPU multiple. Il coordinamento e la sincronizzazione dei processi multipli era sorprendentemente ben progettata. Tenex (Bobrow et al.[1972]) fu uno dei primi sistemi con richiesta di paginazione per il PDP-10, ed ebbe una grande influenza sui successivi sistemi a condivsione del tempo, come TOPS-20 per DEC-20. 163 I Sistemi operativi usati oggi Moltissimi sono i programmi usati dagli insegnanti e dagli studenti che girano sotto Windows. Molte sono le sue versioni in commercio sia per la gestione di un computer singolo, sia per la gestione di una rete integrata di PC (Windows NT). Le versioni di questo sistema operativo si sono rinnovate negli ultimi anni e la Microsoft, azienda internazionale, ha provveduto a rinnovare il Windows aggiungendo nuove funzioni, migliorando la grafica e l'interfaccia anche se talvolta a discapito della funzionalità. Ultima verisone Windows XP. 164 I Sistemi operativi di oggi Linux è un sistema operativo UNIX-like scritto nel 1991 da Linus Torvalds. GNU/Linux e la gran parte del software con esso distribuiti sono "software libero" ossia un software che utilizza una licenza che permette certe libertà che normalmente non sono permesse nelle licenze del software proprietario chiuso. Linux oggi è diventato un sistema operativo maturo e apprezzato: dopo un importante utilizzo limitato a centri di ricerca, internet service provider e altri settori di nicchia, Linux si propone come sistema operativo generico per le più varie applicazioni, soprattutto per sistemi di rete: web server, mail server, file server, architetture di rete in genere, ma anche desktop. Questo è avvenuto anche grazie all'impegno commerciale di importanti aziende: basti citare RedHat, SuSE e IBM. 165 Fine della presentazione 166