Linguaggi di Programmazione Storia e sviluppo dei Linguaggi di Programmazione Seminario a cura di Paolo Liberati
Lady Augusta Ada Byron, contessa di Lovelace (1815 – 1852) Il linguaggio nasce dal programmatore Il primo programmatore della storia è una donna: Lady Augusta Ada Byron, contessa di Lovelace (1815 – 1852) Insigne matematica, collabora con Charles Babbage, che all’università di Cambridge ha progettato l’”Analytical Engine”. Nel 1843 scrive per lui il famoso articolo in cui suggerisce il linguaggio di programmazione per far calcolare a tale macchina i numeri di Bernoulli. In suo onore l’US-DoD, nel 1979, chiamerà ADA il linguaggio di programmazione ad alto livello che viene ancor oggi usato nella sua versione object-oriented, “ADA 95”.
Si apre l’era dell’informatica… Anni ’40: linguaggio macchina e Assembly Agli albori dell’informatica l’unico linguaggio disponibile era il linguaggio macchina, consistente nella comunicazione diretta tra il programmatore ed il calcolatore in codice binario. L’estrema difficoltà a realizzare programmi anche minimamente complessi portò presto alla creazione del linguaggio Assembly, che semplicemente associa mnemonici letterali alle sequenze di bit.
Si apre l’era dell’informatica… Anni ’40: linguaggio macchina e Assembly Anni ’50: ForTran e AlgoL, calcolo scientifico Con l’aumentare del progresso tecnologico si ha la necessità di disporre di linguaggi adatti alla creazione di programmi per il calcolo matematico e scientifico. Nascono così, grazie a John Backus, il ForTran e l’AlgoL, primi linguaggi ad “alto livello”, in quanto permettono un’astrazione maggiore da parte del programmatore nella scrittura del codice.
Si apre l’era dell’informatica… Anni ’40: linguaggio macchina e Assembly Anni ’50: ForTran e AlgoL, calcolo scientifico 1960: CoBOL, programmi di gestione aziendale Nel tentativo di implementare un primitivo concetto di portabilità, il CoBOL viene ideato per applicazioni nei campi dell'amministrazione e del commercio, per l'organizzazione dei dati e la manipolazione dei file.
Si apre l’era dell’informatica… Anni ’40: linguaggio macchina e Assembly Anni ’50: ForTran e AlgoL, calcolo scientifico 1960: CoBOL, programmi di gestione aziendale 1964: BASIC, general purpose per principianti La diffusione a macchia d’olio dei primi microcomputer fece la fortuna di questo linguaggio distribuito “in bundle”. Destinato a facilitare la programmazione anche agli utenti meno esperti, il BASIC è un linguaggio semplice da imparare e da utilizzare. Pur essendo un linguaggio portabile e di alto livello, trova il suo limite nel fatto di essere non strutturato.
Si apre l’era dell’informatica… Anni ’40: linguaggio macchina e Assembly Anni ’50: ForTran e AlgoL, calcolo scientifico 1960: CoBOL, programmi di gestione aziendale 1964: BASIC, general purpose per principianti 1967: SimULA, primo linguaggio object-oriented Originariamente progettato per la creazione di simulazioni discrete, non ha avuto una grande diffusione, ma la sua importanza risiede nell’essere stato il precursore della programmazione orientata agli oggetti, introducendo il concetto di “classe”.
Si apre l’era dell’informatica… Anni ’40: linguaggio macchina e Assembly Anni ’50: ForTran e AlgoL, calcolo scientifico 1960: CoBOL, programmi di gestione aziendale 1964: BASIC, general purpose per principianti 1967: SimULA, primo linguaggio object-oriented 1970: Pascal, ideato a fini didattici Il principio chiave di questo linguaggio di programmazione è l'ordine, raggiunto tramite un forte concetto di tipizzazione dei dati, il controllo delle dichiarazioni e la programmazione strutturata. Il Pascal viene sviluppato come strumento di insegnamento.
Si apre l’era dell’informatica… Anni ’40: linguaggio macchina e Assembly Anni ’50: ForTran e AlgoL, calcolo scientifico 1960: CoBOL, programmi di gestione aziendale 1964: BASIC, general purpose per principianti 1967: SimULA, primo linguaggio object-oriented 1970: Pascal, ideato a fini didattici 1972: linguaggio C Il C segna un’importante svolta nella storia della programmazione: definito a ragione “il linguaggio di più basso livello tra quelli ad alto livello”, unisce potenza, portabilità e facilità di utilizzo ad una notevole flessibilità e possibilità di controllo. La sue caratteristiche strutturali, tali da consentire un’implementazione algoritmica chiara, elegante ed efficiente, ne fanno un linguaggio per programmatori professionisti.
…gli anni dell’object-oriented programming… Con il modello di programmazione orientato agli oggetti, si ha la possibilità di creare classi di oggetti contenenti sia una struttura dati caratterizzante che i metodi per poter operare su di essa. I tre meccanismi fondamentali comuni a tutti i linguaggi OOP sono: È la proprietà che consente la creazione delle entità oggetto, che attraverso di essa sono protette da accessi esterni da parte di altre porzioni del programma. Incapsulazione È l’attributo che consente ad un’interfaccia del programma di essere utilizzata per una classe generale di azioni, che corrispondono ai metodi degli oggetti di appartenenza. Polimorfismo È il processo grazie al quale un oggetto acquisisce le proprietà di un altro oggetto di classificazione più generica. Ereditarietà
…gli anni dell’object-oriented programming… 1979: Ada, per grandi progetti in ambienti critici Pur non nascendo orientato agli oggetti, l'Ada è un linguaggio ad alto livello di tipo strutturato fortemente tipizzato che consente di creare programmi modulari, facilmente manutenibili; permette, inoltre, di manipolare dati astratti e definire unità di programmazione generalizzate, ossia indipendenti dai tipi di dato in input, e di gestire processi concorrenti. L'organizzazione del linguaggio è completata da procedure e funzioni, blocchi e "package" (questi ultimi permettono di raggruppare subroutine e dati in un'unica struttura).
…gli anni dell’object-oriented programming… 1979: Ada, per grandi progetti in ambienti critici 1983: C++, estensione object-oriented del C L’essenza del C++ è stata concepita con lo scopo di permettere ai programmatori di comprendere e gestire programmi più estesi e complessi. Le sue funzionalità orientate agli oggetti consentono di strutturare i programmi con maggiore chiarezza, estendibilità e facilità di manutenzione senza alcuna perdita di efficienza, e realizzare sistemi software di altissime prestazioni. Il C++ rappresenta senza dubbio uno strumento utile e sempre più utilizzato nel mondo del software industriale. È un linguaggio solido, maturo e adatto alla realizzazione di qualsiasi tipo di applicazione: da quelle real time a quelle che operano su basi di dati, da applicazioni per utenti finali a sistemi operativi. Statisticamente, mentre si svolge questo seminario, 5 persone diventano nuovi programmatori C++.
…gli anni dell’object-oriented programming… 1979: Ada, per grandi progetti in ambienti critici 1983: C++, estensione object-oriented del C 1991: VisualBasic, parziale OOP in ambiente grafico Sebbene questo linguaggio, evoluzione del BASIC, sia stato criticato nelle sue prime versioni perché un po’ limitato nelle funzionalità rispetto ai suoi contemporanei, col tempo è risultato essere un prodotto molto versatile, e viene oggi largamente utilizzato. I suoi innovativi punti di forza sono sostanzialmente due: innanzitutto la progettazione ora può avvenire in un più comodo ambiente visuale, tecnologia che ha influenzato le successive release per gli ambienti di tutti i linguaggi più diffusi; in secondo luogo viene introdotto il concetto di programmazione “ad eventi” (event driven), ovvero l’elemento base è l’azione dell’utente sul sistema, considerata in base ad uno schema temporale. Queste caratteristiche rendono il linguaggio facile da usare ma, nello stesso tempo, potente e flessibile.
…gli anni dell’object-oriented programming… 1979: Ada, per grandi progetti in ambienti critici 1983: C++, estensione object-oriented del C 1991: VisualBasic, parziale OOP in ambiente grafico 1995: Java, molto portabile, orientato al web L’entusiasmante peculiarità di Java risale alla sua indipendenza dalla piattaforma di utilizzo, il che ne fa un linguaggio essenzialmente nato per la grande rete Internet, che poi si è esteso a tutti i livelli di applicazione. La sua grande portabilità deriva dal sistema di compilazione, che non produce codice macchina, come negli altri linguaggi di programmazione, bensì codice chiamato Bytecode, che poi verrà interpretato dalla Java Virtual Machine propria del sistema operativo di destinazione.
…gli anni dell’object-oriented programming… 1979: Ada, per grandi progetti in ambienti critici 1983: C++, estensione object-oriented del C 1991: VisualBasic, parziale OOP in ambiente grafico 1995: Java, molto portabile, orientato al web 1996: Delphi, evoluzione visuale del Pascal con OOP Con il Delphi è stato introdotto il concetto di sviluppo visuale e orientato alla gestione degli eventi come nel Visual Basic, senza perdere però i vantaggi della compilazione Pascal. Nonostante esistessero già precedenti versioni del Pascal orientate agli oggetti, il Delphi segna un punto di svolta per questo linguaggio, restituendone una versione completamente rivista ed ottimizzata per lo sviluppo di applicativi in ambiente 32-bit.
…gli anni dell’object-oriented programming… La programmazione orientata agli oggetti vede il suo vero sviluppo dagli anni ’80, riprendendo concetti di base già implementati anni prima in linguaggi ad uso dedicato. Le ragioni del successo dell’OOP vanno ricercate nell’efficienza derivante dalla definizione di classi di oggetti virtuali che ottimizzano il codice, rendendone riutilizzabili le componenti grazie ai concetti chiave di incapsulamento, ereditarietà e polimorfismo. …gli anni dell’object-oriented programming… 1979: Ada, per grandi progetti in ambienti critici 1983: C++, estensione object-oriented del C 1991: VisualBasic, parziale OOP in ambiente grafico 1995: Java, molto portabile, orientato al web 1996: Delphi, evoluzione visuale del Pascal con OOP
…oggi, component-oriented programming… La programmazione orientata ai componenti, che si è molto sviluppata in questi ultimi anni, rappresenta l'evoluzione naturale del modello object-oriented. Il concetto di “componente” unisce un piccolo gruppo di oggetti, che comunicano liberamente tra loro, ma che per comunicare con l’esterno devono servirsi dell’interfaccia del componente, risultando così protetti e organizzati in una struttura interna invisibile dal di fuori. La comunicazione tra componenti può essere definita in termini di componente client e componente server. L’interfaccia di un componente deve essere separata dalla sua implementazione, in modo che il client dipenda solo dall’interfaccia del server; questa si compone di tante interfacce oggetto, ognuna delle quali racchiude il set di messaggi inviabili ad un certo oggetto. La relazione tra oggetti e interfacce è comunque di tipo molti-a-molti. Ogni tipo usato nella definizione dei messaggi deve essere definito nell’interfaccia di un componente. In un linguaggio COP deve essere possibile specificare un componente senza doverlo implementare, e successivamente richiederlo al sistema attraverso le specifiche date. Ogni implementazione di un componente può usare altri componenti. In media un buon componente usa dai 3 ai 6 altri componenti. Il numero di classi all’interno va dalle 5 alle 10.
…oggi, component-oriented programming… 2000: C#, successore orientato ai componenti del C++ Il C# è il primo linguaggio component-oriented basato su C/C++; esso consente di applicare a qualsiasi oggetto metadati con definizione del tipo ed estensibili, in linea con quanto previsto dal modello COP. L'architetto di un progetto può definire attributi specifici di un dominio, quindi applicarli a qualunque classe di elementi del linguaggio, interfacce e così via. Il linguaggio migliora la produttività dello sviluppatore, che può esaminare mediante programmazione gli attributi di ogni elemento, eliminando quegli errori di programmazione che incidono sull'aumento dei costi di sviluppo.
…oggi, component-oriented programming… 2000: C#, successore orientato ai componenti del C++ 2001: ComponentJ, linguaggio COP basato sul Java ComponentJ è un linguaggio di programmazione basato su Java che modella la rappresentazione e la manipolazione dei componenti in un contesto orientato agli oggetti e imperativo. I componenti sono le unità di programmazione che vengono definite usando moduli base nelle operazioni di composizione (costrutti espliciti del linguaggio che combinano gli elementi esistenti in uno più grande). I componenti risultanti possono essere instanziati chiamando gli oggetti e usati in un linguaggio imperativo.
…oggi, component-oriented programming… 2000: C#, successore orientato ai componenti del C++ 2001: ComponentJ, linguaggio COP basato sul Java 2002: ACOEL, COP sperimentale basato sul Java Linguaggio ancora in fase di standardizzazione, ACOEL è un altro esempio di component-oriented programming basato sul potente linguaggio Java. ACOEL si modella su due punti fondamentali: usa ibridi per configurare i servizi forniti da un componente senza mostrare la sua implementazione interna, e aggiunge un supporto per i tipi virtuali e le relazioni dei sottotipi tra i componenti.
Perché la programmazione orientata ai componenti? …oggi, component-oriented programming… 2000: C#, successore orientato ai componenti del C++ Perché la programmazione orientata ai componenti? 2001: ComponentJ, linguaggio COP basato sul Java 2002: ACOEL, COP sperimentale basato sul Java La programmazione COP nasce per superare i problemi che l’OOP presenta nella realizzazione di progetti molto estesi. Questi problemi sono simili a quelli che resero necessario il passaggio dalla semplice programmazione strutturata all’object-oriented, ma per progetti enormemente più grandi. La confusione generata dall’interazione di un grande numero oggetti viene superata modellando un ulteriore raggruppamento: è nato il concetto di componente.
…l’aspect-oriented programming è in arrivo! La programmazione orientata agli aspetti rappresenta un ulteriore sviluppo dell’OOP e si basa sul concetto chiave della “separazione dei compiti”. Gli “aspetti” saranno le porzioni di codice trasversale, scritto in modo chiaro e concentrato in un unico punto, che le varie classi coinvolte dovranno includere e/o eseguire per l'espletamento di un determinato compito. Esempio ASPECT ORIENTED OBJECT ORIENTED
…l’aspect-oriented programming è in arrivo! 2002: AspectJ, estensione integrata AOP del Java AspectJ è un linguaggio aspect-oriented in continuità con il Java, compatibile con la Virtual Machine che caratterizza questo linguaggio. È stato progettato per essere semplice da imparare e da usare ed è dotato di licenza open source. Supporta una modularizzazione chiara dei compiti trasversalmente incrociati, concernente in: controllo e manipolazione degli errori, sincronizzazione, risposte che tengono conto del contesto, ottimizzazione delle prestazioni, monitorizzazione e logging, supporto per il debug, protocolli multioggetto.
…l’aspect-oriented programming è in arrivo! 2002: AspectJ, estensione integrata AOP del Java 2002: ArchJava, basato sul Java, sperimentale ArchJava ha un’implementazione strettamente collegata all’architettura software, per garantire che la comunicazione a controllo di flusso sia conforme alle specifiche strutturali. A differenza dei tradizionali linguaggi OOP, è dotato di apposite strutture per la modellizzazione dei nuovi concetti di programmazione, supportando una effettiva razionalizzazione dei modelli che tiene conto del ciclo di vita del codice. ArchJava può essere considerato un linguaggio di programmazione orientato agli aspetti con un supporto per la separazione dei compiti strutturali da quelli procedurali.
…l’aspect-oriented programming è in arrivo! 2002: AspectJ, estensione integrata AOP del Java 2002: ArchJava, basato sul Java, sperimentale 2003: AspectC++, sarà un’estensione AOP del C++ Con il progetto AspectC++, ancora in corso di sperimentazione, si avrà finalmente la possibilità di estendere i nuovi funzionali concetti dell’aspect-oriented programming al mondo C/C++. Il linguaggio sta nascendo come estensione del C++ e, sebbene siano stati già rilasciati i primi prototipi, una versione ufficiale è prevista in uscita solo per i primi mesi dell’anno venturo.
FINE UNIVERSITÀ DEGLI STUDI DI CAMERINO Facoltà di Scienze Matematiche, Fisiche e Naturali Corso di Laurea in Informatica Dipartimento di Matematica e Informatica FINE