11
Evoluzione dei Linguaggi di programmazione 1
Evoluzione linguaggi di programmazione
Evoluzione dei Linguaggi di programmazione 2
Introduzione
• Al giorno d'oggi esistono centinaia di linguaggi diprogrammazione diversi (Ada, Algol60, Pascal,Prolog, Smalltalk, C++, Java,..),anchese quelli veramente diffusi sono al più una diecina.
• I linguaggi non banali sono, dal punto di vista della computazione , equivalenti, ossia un programma scritto in un certo linguaggio può sempre essere codificato in un altro linguaggio.
• Allora perchè esiste tale variopinta molteplicità di linguaggi? Ilfatto è che ogni linguaggio risulta più o meno adatto a seconda del tipo di applicazione.
Evoluzione dei Linguaggi di programmazione 3
Linguaggi Naturali e Linguaggi Formali
Innanzitutto chiariamo la differenza fra i linguaggi naturali ,che usiamo normalmente per comunicare tra noi esseri umani,ed i linguaggi formali.•Linguaggi Naturali : nati spontaneamente hanno un enorme potere espressivo, ma sono ambigui•Linguaggi Formali: creati a tavolino, non ambigui.
Linguaggi Artificiali sono un sottoinsieme dei linguaggi formali e fanno riferimento a grammatiche non contestuali , cioè agrammatiche che indipendentemente dal contesto permettono di decidere se una frase è corretta o no.
Evoluzione dei Linguaggi di programmazione 4
Una prima Classificazione dei linguaggi di programmazione (1/3)
•Linguaggi macchina: Ogni processore ha un suo linguaggio in cui ogni stringa di bit corrisponde ad una operazione elementare.
•I linguaggio macchina è molto vicino alla logica del processore, ma molto lontano dal modo di ragionare dell'uomo. •Agli albori dell'informatica questo era l'unico modo di programmare un computer
Evoluzione dei Linguaggi di programmazione 5
Una prima Classificazione dei linguaggi di programmazione (2/3)
Linguaggi a basso Livello: (linguaggi assemblativi) Linguaggi vicini alla logica del processore, producono algoritmi che devono essere tradotti per poter essere eseguiti dal processore.Sviluppati tra il1945 ed il 1950, hanno come capofila il
linguaggio Assembler.• codice mnemonico associato ad ogni istruzione macchina, •l'indirizzamento simbolico•possibilità di definire delle macroistruzioni
Evoluzione dei Linguaggi di programmazione 6
Una prima Classificazione dei linguaggi di programmazione (3/3)
•Linguaggi ad alto Livello Si allontanano dalla logica del processore e sono orienatti non alla macchina ma alla soluzione di problemi.
I suoi obiettivi sono:•la semplicità•l'efficienza•leggibilità•l'indipendenza dalla macchina
22
Evoluzione dei Linguaggi di programmazione 7
Classificazione dei linguaggi ad alto livello (1/2)
•Linguaggi Imperativi. Caratterizzati dalla filosofia che un programma è la specifica di un insieme di istruzioni che specificano operazioni (comandi) da seguire allo scopo di ottenere la soluzione ad un dato problema.•Linguaggi Funzionali caratterizzati dall'assunto che un programma è la specifica di una funzione che, sulla base di un insieme di dati di ingresso, calcola il risultato secondo una legge specificabile in modo matematico.
Evoluzione dei Linguaggi di programmazione 8
Classificazione dei linguaggi ad alto livello
•Linguaggi Dichiarativi (o Logici), caratterizzati dalla filosofia che un programma è la specifica di una relazione complessa che esiste fra i dati.
•Linguaggi ad Oggetti (OO), caratterizzati dalla filosofia che un programma è la specifica di un insieme di classi di oggetti, ognuna definita in termini di struttura e operazioni, che comunicano fra loro.
Evoluzione dei Linguaggi di programmazione 9
Linguaggi Imperativi
I linguaggi imperativi adottano uno stile prescrittivo, ossia è prescritto l'insieme delle istruzioni che il processore deve compiere nonchè l'ordine in cui queste devono essere compiute.In particolare essi prendono il nome dal fatto di avere come componente essenziale l'istruzione, cioè l'indicazione di una azione da eseguire.
Evoluzione dei Linguaggi di programmazione 10
Linguaggi Imperativi
In sintesi un programma imperativo può essere schematizzato come :
PROGRAMMA = ALGORITMO + DATI
• parte dichiarativa in cui si dichiarano tutte le variabili del programma ed il loro tipo (DATI) •parte di istruzioni che descrivono l'algoritmo risolutivo (ALGORITMO).
Evoluzione dei Linguaggi di programmazione 11
Alcuni linguaggi Imperativi
Tra i linguaggi imperativi ricordiamo: •Fortran (Formula Translation). Sviluppato tra il 1953 ed il 1957 daJohn Backus per applicazioni di tipo matematico/scientifico e tecnico. Un programma Fortran è costituito da
•un programma principale;•da un certo numero di sottoprogrammi, detti subroutine , che possono essere invocati dal programma principale o da altresubroutine;
•Cobol linguaggio orientato ad attività commerciali sviluppato intorno al 1960. Sia il Fortran che il Cobol sono linguaggi ``statici", ossia le richieste di memoria di un programma Fortran o Cobol vengono definite prima che l'esecuzione del programma inizi; pertanto tali linguaggi non permettono la ricorsione.
Evoluzione dei Linguaggi di programmazione 12
Alcuni linguaggi Imperativi
•Algol60(Algorithmic Language). Nato verso la fine degli anni '50 da una intensa e rara cooperazione internazionale con l’obiettivo di definire un linguaggio chiaramente strutturato valido per scopi generali ed indipendente dalla macchina. Definisce:
•concetto campo di visibilità di una variabile, •concetto di funzione e procedura,•il costrutto IF ...THEN ...ELSE
Usati poi in molti linguaggi (detti della famiglia Algol) primo fra tutti il Pascal.•BASIC fece la sua comparsa nel 1964. Nel suo obiettivo principale: la semplicità esso ha raggiunto senz'altro il successo diventando in pochi anni uno dei più usati al mondo.
33
Evoluzione dei Linguaggi di programmazione 13
Alcuni linguaggi Imperativi
•Pascal creato da N. Wirth, professore dell'università di Zurigo, con l'obiettivo di andare incontro alle esigenze di apprendimento dei neo-programmatori.
Non a caso, ancora oggi, il Pascal viene usato come linguaggio di apprendimento nelle scuole.
Evoluzione dei Linguaggi di programmazione 14
Cartteristiche del Pascal
•è un linguaggio strutturato e semplice, permette un uso disciplinato dei puntatori, ossia dati che memorizzano l'indirizzo di altri dati, e in generale scoraggia le scorciatoie evitando in tal modo che il programmatore commetta errori.•la varietà di tipi di dati standard disponibili e possibilità per l'utente definire nuovi tipi.•permette di gestire matrici, insiemi e record •come l'algol utilizza il concetto di campo di visibilità.•fa un uso disciplinato dei puntatori e scoraggia•le scorciatoie evitando in tal modo che il programmatore commetta errori.
Evoluzione dei Linguaggi di programmazione 15
C
C fa la sua comparsa pochi anni dopo. Esso si distingue dai suoi predecessori per la versatilità nella rappresentazione dei dati.
La sua forza risiede nel fatto che pur essendo un linguaggio di alto livello dà la possibilità di fare cose di solito permesse dai linguaggi di basso livello.
Per questo motivi si dice che il C è il linguaggio di più basso livello tra i linguaggi di alto livello.
Evoluzione dei Linguaggi di programmazione 16
Nuovi Paradigmi di Programmazione
La necessità di sviluppare programmi più concisi, più semplici da scrivere e più vicini alla logica del problema e che potessero essere utili nel campo dell'Intelligenza Artificiale porta alla definizione dei:
•Linguaggi Funzionali•Linguaggi Logici (o Dichiarativi)
Evoluzione dei Linguaggi di programmazione 17
Nuovi Paradigmi di Programmazione
Le caratteristiche comuni di questi linguaggi sono:
• la non manipolazione dei numeri, ma di simboli;
• una programmazione incrementale che consente di realizzare velocemente prototipi ed
• il fatto che si tratta di linguaggi ad altissimo livello utilizzabili anche da non-programmatori.
Evoluzione dei Linguaggi di programmazione 18
Linguaggi Funzionali
I linguaggi funzionali sono basati sull'uso estensivo e sistematico della funzione intesa in senso matematico.
Una funzione è una regola di corrispondenza che associa ad ogni elemento del suo dominio un unico elemento del suo codominio.Una definizione di funzione specifica Dominio,Codominio, e regola di associazione. es: incr(x) ::= x+1;La valutazione di una funzione consiste nell'applicazione della regola di associazione all'elemento del dominio per produrre un risultato (valore del Codominio).
44
Evoluzione dei Linguaggi di programmazione 19
Linguaggi Funzionali
Pertanto in un linguaggio funzionale è:
PROGRAMMA = FUNZIONEESECUZIONE DI UN PROGRAMMA = VALUTAZIONE DI UNA
FUNZIONE
I linguaggi funzionali:• Utilizzano la ricorsione• la struttura dati più importante è la LISTA •sono interpretati•le variabili sono variabili matematiche pertanto denotano un valore non modificabile, non esiste infatti l'operazione di assegnazione (linguaggio funzionale puro).
Evoluzione dei Linguaggi di programmazione 20
Linguaggi Funzionali
Tra i linguaggi funzionali il più noto è il LISP (Li st Processing) nato nel 1959 ad opera di J. McCarthy per risolvere problemi, tipici dell'AI, che coinvolgono manipolazioni simboliche e ricorsione.E' un linguaggio
•conciso, •è il più usato nel campo dell'AI, •ha rappresentato il punto di partenza per numerosi altri linguaggi.
Evoluzione dei Linguaggi di programmazione 21
Linguaggi Dichiarativi (o Logici)
I linguaggi Logici specificano COSA si desidera come risultato e non come ottenerlo, ossia si definisce il problema da risolvere e non come ottenere la soluzione, ciò viene lasciato all'esecutore (interprete) del linguaggio.
Evoluzione dei Linguaggi di programmazione 22
Linguaggi Dichiarativi (o Logici)
Il programma può essere considerato come la dimostrazione della verità di una asserzione.
Un programma Dichiarativo è :PROGRAMMA = CONOSCENZA + CONTROLLO
•CONOSCENZA : un insieme di fatti e regole •(CONTROLLO) : un insieme di regole
Evoluzione dei Linguaggi di programmazione 23
Linguaggi Dichiarativi (o Logici)
In un Programma Logico non è necessario specificare un flusso diesecuzione, ma dato un obiettivo (GOAL) il sistema individua i fatti e le regole rilevanti per dimostrare la veridicità del goal.In tale ricerca assumono importanza concetti quali:
• il Backtracking.• la ricorsione.
I linguaggi logici risultano particolarmente adatti a risolvere problemi che coinvolgono entità e relazioni, sono inoltre particolarmente leggibili e tra essi l'esemplare più noto è il PROLOG (Programmming in Logic).
•sviluppato nel '72 all'Università di Marsiglia, è basato sulla logica dei predicati del primo ordine ed è adatto ad una grande varietà di applicazioni.
Evoluzione dei Linguaggi di programmazione 24
Linguaggi ad Oggetti (OO)
La vera rivoluzione si è avuta nel 1983 quando Bjarne Stroustrup inventò il C++ (o come era stato chiamato inizialmente "C con classi") che introduceva, sfruttando come base il C, la programmazione Orientata agli Oggetti (OO - Object Oriented) usando una nuova struttura, la classe.
55
Evoluzione dei Linguaggi di programmazione 25
Linguaggi ad Oggetti (OO)
Le astrazioni principali di un linguaggio OO sono:•Classificazione dati (oggetti) organizzati in classi con proprietà comuni•Incapsulamento: Oggetto = dato + Operazioni•Information Hiding: Ogni oggetto ha una interfaccia (pubblica) e una implementazione (privata)•Polimorfismo:
•Molteplici definizioni delle stesse funzioni (overloading)•Funzioni e classi parametriche rispetto a tipi di dato
•Ereditarietà : Definizione di nuove classi a partire da classi definite in precedenza.
Evoluzione dei Linguaggi di programmazione 26
Caratteristiche dei linguaggi di programmazione ad oggetti
Evoluzione dei Linguaggi di programmazione 27
Oggetto
Oggetto
• Identità: espressa da un nome
• Stato: include le proprietà dette attributi che descrivono gli oggetti
• Comportamento: rappresentato da funzioni dette metodi che utilizzano o cambiano il valore degli attributi
Evoluzione dei Linguaggi di programmazione 28
Il concetto di oggetto
• Un centro di servizi con una parte visibile (Interfaccia) ed unaparte nascosta
Evoluzione dei Linguaggi di programmazione 29
IncapsulamentoProtegge l’oggetto nascondendo:- lo stato dei dati- l’implementazione delle sue funzioni (comportamenti)
Evoluzione dei Linguaggi di programmazione 30
Incapsulamento
I dati e le funzioni sono racchiusi negli oggetti.
Ciascun oggetto ha:
• un OID che lo identifica univocamente,
• un insieme di proprietà ed
• un insieme di metodi che regolano il suo comportamento.
Le proprietà di un oggetto sono gli attributi o variabilidell'oggetto,
Lo stato di un oggetto è l'insieme dei valori assunti dalle sue propietà in un determinato istante.
66
Partiamo da una lista
O1 O2 O3 O4 O5
Operazioni di modifica dello stato :ins, ad inizio lista;
canc, permette di rimuovere un elemento ad inizio lista;append che aggiunge in coda gli elementi di una seconda lista. svuota e mod che modifica la parte informativa del'elemento riferito dall’iteratore
………….
Operazioni di consultazione dello stato :vuota, piena,
ElemTesta ElemFineUltimoValoreConsultato………
Evoluzione dei Linguaggi di programmazione 32
Architettura di un sistema ad Oggetti
Un insieme di Oggetti che interagiscono insieme senza conoscere nulla delle rispettive implementazioni concrete.
Evoluzione dei Linguaggi di programmazione 34
Classe
L'incapsulamento viene supportato tramite il costrutto classe che contiene i dati e le funzioni applicabili sugli oggetti appartenenti alla classe.
Pertanto l'incapsulamento consente di aggiungere al linguaggio nuovi tipi di dato, definiti non solo in termini di struttura del loro dominio, ma anche in termini di operazioni che possono essere effettuate su istanze di quel tipo.
Evoluzione dei Linguaggi di programmazione 35
Classe ed Istanze
Classe: descrizione dei comportamenti (operazioni) e delle informazioni (dati) appartenenti ad un oggetto
Istanza: Oggetto reale ottenuto dalla classe tramite dichiarazione (variabile)
Evoluzione dei Linguaggi di programmazione 36
Astrazione
Risultato di un’astrazione è un elenco di cosa fare e non come farlo
Complessità
dettaglio
Evoluzione dei Linguaggi di programmazione 37
Non bisogna avere un tipo oggetto per ciascuna entità da rappresentare
Meno tipi oggetto saranno individuati, meno confuso sarà lo scenario.
Puntare sull’astrazione
77
Evoluzione dei Linguaggi di programmazione 38
Information Hiding
•E' strutturalmente legata all'incapsulamento.
•Essa si basa sull'idea che l'utilizzazione di un oggetto prescinde dalla rappresentazione dei dati.
•Ossia per utilizzare un oggetto è sufficiente conoscere la sua interfaccia verso l'esterno, ossia le operazioni applicabili sull'oggetto, mentre non è necessario conoscere la loro implementazione.
•L'Information Hiding si realizza attraverso due livelli di accesso ai campi di una classe pubblico (Public) , privato (private) .I campi pubblici sono accessibili ai programmi esterni, mentre quelli privati sono utilizzabili solo dalle funzioni appartenenti alla classe. Evoluzione dei Linguaggi di programmazione 39
• Un modulo consiste di un interfaccia e di una implementazione
• Chi usa il modulo conosce solo l’interfaccia– L’implementazione e` nascosta
Modularitàciascun modulo non sa cosa accade attorno a lui
Evoluzione dei Linguaggi di programmazione 40
Polimorfismo
Polimorfismo = Capacità di assumere diverse forme.
Dal greco "pluralita` di forme"
Nei linguaggi OO esistono diverse forme di Polimorfismo:
•Overloading (sovrapposizione) ossia più definizioni per uno stesso nome di funzione; (naturalmente funzioni con lo stesso nome devono avere una ``segnature" (numero e tipo di parametri formali) diversi; solo in tal modo il compilatore riesce a decidere quale funzione invocare).
•Funzioni e classi parametriche rispetto ad uno o più tipi(realizzate in C++ tramite i template);
Evoluzione dei Linguaggi di programmazione 41
Polimorfismo (1/2)
• Permette di utilizzare lo stesso nome per identificare operazioni simili che differiscono per la realizzazione
– Una sola interfaccia per molte azioni (metodi)Ad esempio, metodi ins e canc per liste di int, float, char (overloading)
Il compito di selezionare l'azione specifica da applicare viene delegato al compilatore
Evoluzione dei Linguaggi di programmazione 43
Ereditarietà
• Permette di definire un oggetto a partire da oggetti già essitenti
• Essa è uno dei meccanismi più potenti della programmazione ad oggetti e consente :– il riutilizzo del codice– Di specializzare la classe derivata con nuove proprietà e nuovi
metodi
La classe derivata si chiama sottoclasseLa classe da cui si deriva si chiama superclasse
Evoluzione dei Linguaggi di programmazione 44
Astrazione ed ereditarietà
88
Evoluzione dei Linguaggi di programmazione 45
public class ListaCimplements Lista
LISTApublic interface Lista
extends Collezione
LISTA_C LISTA_DC
Concatenata DoppiamConcatenata
Coda Doppia Codapublic interface Codaextends Collezione
Evoluzione dei Linguaggi di programmazione 47
Ereditarietà Semplice in Java
• In Java, ogni classe che non deriva da nessun’altra deriva implicitamente dalla superclasse universale universale del linguaggio, che si chiama Object
• Esiste pertanto un unico albero di derivazione semplice la cui radice è la Classe Object– Non si può definire una classe che non eredita da nessuna classe
(ogni classe esclusa Object ha una superclasse)
• Object ha alcuni metodi (String toString(),boolean equals(Object obj) ), che sono ereditati da tutte le classi
Evoluzione dei Linguaggi di programmazione 48
…
• Sintassi Ereditarietàclass NomeSottoclasse extends NomeSuperclasse{costruttorinuovi metodinuove variabili}• La classe NomeSottoclasse eredita da NomeSuperclasse e definisce le sue
variabili i suoi costruttori ed i suoi metodi• Se non è indicata alcuna superclasse si assume Object di default
Evoluzione dei Linguaggi di programmazione 49
Caratteristiche degli oggetti delle classi derivate
• Ogni oggetto di una classe derivata può essere usato dove è richiesto un oggetto della classe base
• Un oggetto della classe derivata eredita proprietà e metodi dell’oggetto della classe base
• Non si può usare un oggetto della classe base dove è richiesto un oggetto della classe derivata
Evoluzione dei Linguaggi di programmazione 50
Metodi della classe derivata PolimorfismoPer quanto riguarda i metodi della classe derivate, questi possono essere:
•Nella sottoclasse viene definito un metodo che non esisteva nella classe base
•Nella sottoclasse viene ridefinito un metodo che esisteva nella classe base (in tal caso si dice che il metodo è sovrascritto)
•La possibilità di sovrascrivere un metodo è una delle caratteristiche più potenti dei linguaggi di programmazione ad oggetti
•Per sovrascrivere un metodo bisogna definire nella classe derivata
•Un metodo con la stessa segnatura del metodo della classe base
Evoluzione dei Linguaggi di programmazione 51
esempio
Class Impiegato{ String Nome ;String Cognome;
Double Stipendio;Impiegato (String n, String c, double s) {Nome =n; Cognome = c; stipendio =s};Void AumentaStipendio(double x) {Stipendio = Stipendio +x;}
}
Class Dirigente extends Impiegato{int livello;Impiegato (String n, String c, double s) {Nome =n; Cognome = c; stipendio =s}Void AumentaStipendio(double x) {Stipendio = Stipendio +2x;}}
99
Evoluzione dei Linguaggi di programmazione 52
Binding Dinamico
Quando su un oggetto viene invocato un metodo– Il metodo corrispondenet viene cercato fra quelli definiti nella parte più
esterna dell’oggetto– Se non lo si trova allora si prosegue la ricerca verso l’alto, ossia nella n
Superclasse dalla quale è derivato
• Tutto ciò significa che– Nel caso di overriding prevalgono I metodi appartenenti all’oggetto
derivato
• Si può comunque sempre invocare il metodo sovrascritto ossia il metodo della classe base utilizzando la seguente sintassi:
Super. nomeMetodo(parametri)
Evoluzione dei Linguaggi di programmazione 53
Utilizzo della variabile super
Class Impiegato{ String Nome ;String Cognome;Double Stipendio;Impiegato (String n, String c, double s) {Nome =n; Cognome = c; stipendio =s};Void AumentaStipendio(double x) { Stipendio = Stipendio +x;}
}
Class Dirigente extends Impiegato{int livello ;Impiegato (String n, String c, double s) {Nome =n; Cognome = c; stipendio =s}Void AumentaStipendio(double x) { Stipendio = Stipendio +2x;}Void RaddoppiaStipendio(double x) {super. AumentaStipendio(x)}}
Evoluzione dei Linguaggi di programmazione 54
Ereditarietà dei costruttori
• Siccome ogni oggetto contiene una propria istanza della propria superclasse, quest’ultima deve essere inizializzta
• Il compilatore java inserisce automaticamente una chiamata al costruttore di default del superoggetto– Tale chiamata viene inserita come prima istruzione del nuovo costruttore– L’esecuzione dei costruttori procede dalla radice verso il basso nella
gerarchia di ereditarietà– Ciò garantisce che quando il costruttore di una classe viene ese guito la
superclasse sia già stata completamente inizializzata– Se il costruttore ha parametri sono necessarie delle chiamate esplicite
Evoluzione dei Linguaggi di programmazione 55
Astrazione delle classi
Salendo nella gerarchia di ereditarietà si trovano classi sempre più generiche• Metodo astratto:; metodo di cui non viene specificata l’implementazione• Classe astratta : classe avente almeno un metodo astratto• Classi e metodi astratti sono identificati dal qualificatore abstract
Esempio:abstract Class Forma{abstract void stampa()}
Evoluzione dei Linguaggi di programmazione 56
Astrazione delle classi
• Una classe astratta è una classe non completamente definita essa pertanto non può essere istanziata
• Per ottenere una classe concreata da una classe astratta bisogna specificare tutte le implementazioni mancanti
Esempio:Class Quadrato extends Forma{int lato;Quadrato(int n) {lato = n}public void stampa() {// istruzioni pèer la stampa }}
Evoluzione dei Linguaggi di programmazione 57
Interfacce
• Una interfaccia è una classe completamente astratta , cioè del tutto priva di implementazione
– Tutti I metodi sono astratti– Non vi sono attributi (è possibile definire solo attributi final)
• Una interfaccia ha tutti I vantaggi delle classi astratte• Presenta più flessibilita rispetto al meccanismo dell’ereditarietà• Una interfaccia può essere ereditata da un’altra interfaccia non
da una classe• Una interfaccia può ereditare da più interfacce
1010
Evoluzione dei Linguaggi di programmazione 58
Interfacce
Esempio:Interface Persona{…}
Class Studente implements Persona{…}
• In Java una classe può ereditare da una sola classe , ma da più interfacce pertanto c’è differenza rispetto al C++ che consente ereditarietà multipla ossia una classe può ereditare da più classi (DDD)
Evoluzione dei Linguaggi di programmazione 59
FINE
Top Related