Introduzione all’OOP! – Introdurre l’evoluzione dei linguaggi di programmazione e la loro classificazione – Introdurre l’OOP (astrazione, incapsulamento, ereditarietà) – Dal C a Java … un primo esempio 1 1 LINGUAGGI DI ALTO LIVELLO! Si basano su una macchina virtuale le cui “mosse” non sono quelle della macchina hardware 2 Un po’ di storia sui linguaggi 1957 John Backus e colleghi della IBM rilasciano la prima versione del compilatore per il linguaggio di programmazione FORTRAN (Formula Translator) alla Westinghouse. 1959 Si forma il Comitato per i linguaggi di sistemi di dati e nasce il COBOL (Common Business Oriented Language). 1959 John McCarthy sviluppa il linguaggio LISP (List Processing) per le applicazioni di Intelligenza Artificiale. 1964 Nasce il linguaggio BASIC (Beginner's Allpurpose Symbolic Instruction Code). E' sviluppato a Dartmouth da John Kemeny e Thomas Kurtz. Ne deriveranno molte varianti. 3 Un po’ di storia sui linguaggi 1967 Ole-Johan Dahl e Kristen Nygaard del Centro Computer Norvegese, completano una versione general-purpose del linguaggio SIMULA, il primo linguaggio object-oriented. 1972 Dennis Ritchie sviluppa il linguaggio "C" ai laboratori Bell. Così chiamato semplicemente perchè il suo predecessore era stato battezzato "B". 1995 Nasce il linguaggio di programmazione Java, piattaforma indipendente per sviluppo di applicazioni. 4 EVOLUZIONE DEI LINGUAGGI ADA C++ VISICALC PROLOG SMALLTALK FORTRAN77 LISP PASCAL SIMULA67 LISP ALGOL APL COBOL LISP ALGOL LISP FORTRAN C Linguaggi-macchina PlanKalcul 1945 1950 1960 1970 1980 1990 2000 5 LINGUAGGI DI ALTO LIVELLO Barriera di astrazione Fortran C Modula-2 Smalltalk Java Cobol Basic Pascal Python Algol Simula67 C++ Ada Lisp Scheme Prolog ML 6 LINGUAGGI DI ALTO LIVELLO Barriera di astrazione IMPERATIVI Fortran C Modula-2 Smalltalk Java Cobol Basic Pascal Python Algol Lisp Simula67 C++ A OGGETTI Ada Scheme Prolog DICHIARATIVI FUNZIONALI ML 7 EVOLUZIONE DEI LINGUAGGI FORTRAN BASIC ALGOL60 PASCAL ADA SIMULA67 SMALLTALK C++ 8 Quali astrazioni? • Sui dati: da indirizzi fisici a nomi simbolici per le variabili (Assembler) • Sul controllo (programmazione strutturata, Pascal, C): – sequenza (;), – blocco, – if else, while do, etc. { int p=1; for (i=1 ; i <= n ; ++i) . . . } p *= x; 9 Astrazioni funzionali • Sulle operazioni (funzioni): long potenza(int x, int n) /* par. formali */ { int i; long p = 1; /* var. locali */ for (i=1 ; i <= n ; ++i) p *= x; return p; } long Y; Y=potenza(X,10); 10 Encapsulation • Coniugare l’astrazione su dati e operazioni (astrazioni di dato, tipi di dato astratto, classi e oggetti) – Incapsulamento (dati e operazioni) – Protezione – Coesione – Riuso – … (Ereditarietà) 11 Astrazioni di dato! • Il componente ha dati locali (nascosti) e rende visibili all’esterno i prototipi delle operazioni invocabili (procedure e funzioni) su questi dati locali, ma non gli identificatori dei dati. Attraverso una di queste operazioni si può assegnare un valore iniziale ai dati locali nascosti.! Interfaccia Operazioni Dati Corpo 12 12 Esempio: il contatore! 1. file header contatore.h" void reset(void); void inc(void); void stampa(void); Definisce cosa si può fare con il contatore! 2. file di implementazione contatore.c" #include "contatore.h" Incapsula il contatore c (IL dato) e specifica il codice delle static int c; funzioni con cui si agisce sul void reset(void){ c=0; } contatore! void inc(void){ c++; } void stampa(void) { printf(“%d”, c); } 13 13 Tipo di dato astratto ! (Abstract Data Type – ADT)! • Il componente esporta un identificatore di tipo T ed i prototipi delle operazioni eseguibili su dati dichiarati di questo tipo. I “clienti” del componente dichiarano e controllano quindi il tempo di vita delle variabili di tipo T.! Interfaccia Id_tipo Operazioni Def. Tipo di Dato Corpo 14 14 Esempio: ADT counter! 1. file header counter.h" typedef int counter; void reset(counter*); void inc(counter*); Definisce in astratto che cos’è un counter e che cosa si può fare con esso! 2. file di implementazione counter.c" #include "counter.h" void reset(counter *c){ *c=0; } void inc(counter* c){ (*c)++; } Specifica come funziona (quale è l’implementazione) di counter! 15 15 ADT counter: un cliente! Per usare un counter :! #include "counter.h" int main(){ counter c1, c2; reset(&c1); reset(&c2); inc(&c1); inc(&c2); inc(&c2); c1++; } 16 16 Programmazione Orientata agli Oggetti (OOP) • Astrazione: separazione fra interfaccia e implementazione • Incapsulamento: insieme di meccanismi che consentono di proteggere lo stato di un oggetto e in generale di nascondere gli aspetti che non si vogliono rendere pubblici – Linguaggi object-based 17 OOP e Java – l’ADT Counter public class Counter { private int x; public void reset() { x = 0; } public void inc() { x++; } public int getValue() { return x;} } Counter Y; Y = new Counter(); Y.reset(); Y.inc(); 18 OOP e Java public class Counter { private int x; public void reset() { x = 0; } public void inc() { x++; } public int getValue() { return x;} } Counter Y; Y = new Counter(); Y.reset(); Y.inc(); 19 Programmazione Orientata agli Oggetti (OOP) • Astrazione: separazione fra interfaccia e implementazione • Incapsulamento: insieme di meccanismi che consentono di proteggere lo stato di un oggetto e in generale di nascondere gli aspetti che non si vogliono rendere pubblici – Linguaggi object-based • Ereditarietà: consente di creare un componente (classe) che riusa metodi e attributi di un componente (classe) già esistente – Linguaggi object-oriented public class BiCounter extends Counter { public void dec() { x--; } } 20 Ereditarietà public class Counter { private int x; public void reset() { x = 0; } public void inc() { x++; } public int getValue() { return x;} } public class BiCounter extends Counter { public void dec() { x--; } } BiCounter Y; Y = new BiCounter(); Y.reset(); Y.inc(); Y.dec(); 21