I linguaggi di programmazione Programmazione Orientata agli ogge/ Corso di laurea in Ingegneria Informa6ca 1 Problem Solving • Lo scopo di un programma è quello di risolvere un problema • I passi generali per risolvere un problema sono: • • • • • • Capire il problema Scomporre il problema in so@oproblemi ges6bili Tracciare una soluzione e trovare gli algoritmi Considerare alterna6ve e raffinare la soluzione Implementare la soluzione Verificare la soluzione e correggere malfunzionamen6 se ci sono 2 Problem Solving • Mol6 proge/ falliscono perchè lo sviluppatore non ha una chiara comprensione del problema • Il problema va ben specificato e le ambiguità vanno risolte • Come i problemi e le loro soluzioni si fanno più complica6, è necessario organizzare il soJware in unità maneggiabili • Ado@are una metodologia è fondamentale per lo sviluppo del sw • Le soluzioni che vedremo saranno concepite in unità chiamate classi e ogge*, ado@ando un approccio orientato agli ogge* (object-­‐oriented) 3 I linguaggi di programmazione • I linguaggi di programmazione sono sta6 introdo/ per facilitare ai programmatori il compito di scri@ura dei programmi • Sono linguaggi simbolici, in con6nua evoluzione • Sono defini6 da un insieme di regole formali, le regole gramma6cali o sintassi • Diversi paradigmi di programmazione per affrontare • il processo della programmazione • la traduzione dell'algoritmo nel linguaggio ado@ato 4 Sintassi e semantica • Le regole di sintassi definiscono come si devono comporre i simboli e le parole per formare istruzioni corre@e • La seman5ca di un'istruzione definisce cosa questa significhi (lo scopo dell'istruzione) • Un programma sinta/camente corre@o non è necessariamente seman6camente corre@o • I programmi fanno quello che prescriviamo che facciano e non quello che vorremmo che facessero 5 Sintassi • Il sistema di regole formali che definisce il linguaggio • Le parole, i simboli e il modo di organizzarli • Consente di stabilire se un'istruzione è ben formata • È corre@o scrivere se x + n > m allora STOP ? • Facilitano il compito al programmatore • I programmi devono essere trado/ nel linguaggio na6vo della macchina 6 Evoluzione dei linguaggi • La sfida degli anni '50 sulla traduzione dei linguaggi • Evoluzione verso sistemi di codici complessi e poten6, orienta6 più all'uomo che alla macchina • Linguaggi ad alto livello e a basso livello ovvero i linguaggi macchina 7 Schema dell'architettura Processore Memoria I/O 8 Il processore • Il datapath o unità di elaborazione • L'insieme dei circui6 che operano e manipolano i da6 • Il controller • L'insieme dei circui6 che interpretano un programma e sovraintendono all'esecuzione delle istruzioni da parte delle altre componen6 del calcolatore 9 Ciclo del processore • Il processore esegue in con6nuazione il ciclo • preleva-­‐interpreta-­‐esegui Preleva dalla memoria principale la prossima istruzione di un programma preleva esegui Esegui l'istruzione interpreta Decodifica l'istruzione 10 Il linguaggio del processore • Ogni modello di microprocessore ha un proprio linguaggio macchina diverso da quello di altri processori • Ogni modello di microprocessore riconosce solo programmi scri/ nel proprio linguaggio macchina • Il linguaggio macchina con6ene tu6e e sole le operazioni che possono essere eseguite dal microprocessore 11 Linguaggi di basso livello • In un linguaggio macchina, ogni istruzione è una sequenza di cifre binarie • Totalmente illeggibile per l'uomo • Perfe@amente non ambiguo per la macchina 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 traduzione delle istruzioni: LOAD x ADD y STORE z 12 Le operazioni elementari • Ogni istruzione del linguaggio macchina viene eseguita da un microprocessore svolgendo una serie di passi, le operazioni elementari • Il numero di operazioni elementari necessario a portare a compimento un'istruzione in linguaggio macchina è dell’ordine di 7-­‐10 13 Linguaggi macchina: problemi • Sono specifici della macchina • Occorre conoscere l'archite@ura della macchina per scrivere programmi • I programmi non sono trasportabili • I codici sono poco leggibili • I programmatori si specializzano nel cercare efficienza su una macchina specifica, anziché concentrarsi sul problema 14 Traduzione dei linguaggi • Il conce6o di traduzione dei linguaggi ha permesso l'evoluzione verso sistemi simbolici più espressivi e più facilmente manipolabili dai programmatori • Il programmatore scrive un programma in un linguaggio ad alto livello senza preoccuparsi della macchina che esegue il programma • Due possibili processi di traduzione: • Il compilatore • L' interprete 15 Programma compilatore • Il compilatore traduce istruzioni scri@e in un linguaggio ad alto livello, definite da regole sinta/che precise • Programma sorgente: il programma ad alto livello fornito dal programmatore al compilatore • Programma ogge@o: il risultato della traduzione del compilatore nel linguaggio obie/vo Codice sorgente Compilatore Linker File Eseguibile • Programma scri@o dall'utente • Interpreta il codice sorgente (analisi sinta/ca) e produce il Codice Ogge@o • Collega le eventuali librerie • Linguaggio macchina File Eseguibile CPU • Linguaggio macchina • Esegue il programma 16 Programma interprete • Un interprete riceve un programma sorgente e oltre a tradurlo lo esegue istruzione per istruzione in un ciclo con6nuo • I linguaggi compila6 • Pascal, C • I linguaggi interpreta6 • Lisp, Prolog Codice sorgente Interprete CPU • Programma scri@o dall'utente • Interpreta il codice sorgente (una istruzione alla volta • esegue ogni istruzione interpretata 17 Compilatore ed interprete runtime • Combinazione di compilazione ed interpretazione • Java, C#, VB.Net, Android Codice sorgente Compilatore File “class” • Programma scri@o dall'utente • Analizza il codice sorgente (analisi sinta/ca) e produce il file class • Linguaggio macchina della CPU virtuale File “class” • O@enuto dal processo precedente Ambiente Run6me (Interprete) • Interpreta il codice sorgente .class e lo esegue nella CPU • Alcune implementazioni prevedono la compilazione run6me di blocchi di porzioni in codice macchina CPU • Esegue il codice macchina conver6to in run6me 18 Riassumendo I compilatori traducono un intero programma dal linguaggio L al linguaggio macchina della macchina prescelta: traduzione e esecuzione procedono separatamente al termine della compilazione è disponibile la versione tradotta del programma la versione tradotta è però specifica per quella macchina per eseguire il programma basta avere disponibile la versione tradotta (non è necessario ricompilare) Gli interpreti invece traducono e immediatamente eseguono il programma istruzione per istruzione, infatti: traduzione ed esecuzione procedono insieme al termine non vi è alcuna versione tradotta del programma originale se si vuole rieseguire il programma occorre anche ritradurlo 19 Confronti • L'esecuzione di un programma compilato è più veloce dell'esecuzione di un programma interpretato • I linguaggi interpretati sono tipicamente più flessibili e semplici da utilizzare (nei linguaggi compilati esistono maggiori limitazioni alla semantica dei costrutti) • Per distribuire un programma interpretato si deve necessariamente distribuire il codice sorgente, rendendo possibili operazioni di plagio • Nei programmi interpretati, è facilitato il rilevamento di errori di run-time • Con la soluzione compilatore/interprete si hanno le caratteristiche della compilazione ma mantenendo buona la velocità e la portabilità 20 Evoluzione dei linguaggi – '50 • I primi linguaggi ad alto livello • FORTRAN, introduce il conce@o di so@oprogrammi che operano su da6 comuni • ALGOL, introduce il conce@o di stru@ura dei programmi e di procedure ricorsive, ovvero che richiamano sè stesse • COBOL, introduce il conce@o di FILE e di descrizione dei da6 21 Evoluzione dei linguaggi – '60 • Notazioni per la descrizione dei linguaggi • Meno enfasi sull'efficienza, a@enzione al modello di computazione • I linguaggi orienta6 al problema • LISP, uniformità tra da6 e programmi e un paradigma di programmazione basato sul conce@o di funzione • APL, linguaggio matema6co, ricco di notazioni e operatori per operare su stru@ure come ve@ori e matrici • SNOBOL, offre strumen6 u6li per la manipolazione di sequenze di cara@eri 22 Evoluzione dei linguaggi – '70 • Metodologia di programmazione • PASCAL, ha lo scopo di insegnare la programmazione stru@urata, una possbile risposta alla necessità di programmare con un metodo. Segue Modula-­‐2 che introduce il conce@o di modulo. • C, linguaggio ad alto livello con visibilità e accesso alla macchina • Prolog, linguaggio basato sulla logica, non convenzionale diventato di nicchia 23 Evoluzione dei linguaggi – '80 • Programmazione in grande, esigenza di modularità e di astrazione • La programmazione a ogge/. Una classe definisce un insieme di ogge/ e le procedure per manipolarli • SmallTalk, ObjecAve-­‐C, C++, JAVA, *.NET 24 I paradigmi di programmazione • Forniscono la filosofia e la metodologia con cui si scrivono i programmi • I linguaggi devono consen9re ma sopra@u@o spingere all'adozione di un par6colare paradigma • • • • Procedurale Funzionale Modulare Orientato agli ogge/ 25 Paradigma procedurale • Enfasi sulla soluzione algoritmica dei problemi mediante modifica progressiva dei da6 in memoria • Esecuzione sequenziale di istruzioni • Cambiamento dello stato di memoria (le variabili) tramite assegnamento • Programmazione per effe@o collaterale (side-­‐effect) • Aderen6 al modello della macchina di von Neumann • Molto efficien6 • Ha mostrato limi6 nello sviluppo e mantenimento di sw complessi • I linguaggi imperaAvi: Pascal, C 26 Paradigma funzionale • Primo tenta6vo di non rifarsi al modello di macchina di von Neumann • La computazione avviene tramite funzioni che applicate ai da6 riportani nuovi valori • Ogni funzione è un modulo a sé dipendente unicamente dal valore dei suoi argomen6 • L'effe@o globale è o@enuto concatenando opportunamente funzioni anche richiamando sé stesse (ricorsione) • Modello che si rifà alla teoria delle funzioni ricorsive • Scarso supporto ai costru/ di ripe6zione tramite iterazione • Lisp, ML 27 Paradigma modulare • Introduce il conce@o di modulo che nasconde i da6 all'utente • I da6 possono essere le/ solo tramite un'opportuna interfaccia • Modula-­‐2, Ada 28 Paradigma a oggetti • Specifica il conce@o di modulo che incapsula i da6 con le classi • Le classi hanno anche una stru@ura gerarchica e ereditano cara@eris6che e funzionalità • Obie/vo: migliorare l'efficienza del processo di produzione e mantenimento del soJware 29 Concetti base della programmazione OO • Incapsulamento dei daA • Il processo di nascondere i de@agli di definizione di ogge/, solo le interfacce con l'esterno sono visibili • Ereditarietà • Gli ogge/ sono defini6 in una gerarchia ed ereditano dall'immediato parente cara@eris6che comuni, che possono essere specializzate • Astrazione • Il meccanismo con cui si specifica le cara@eris6che peculiari di un ogge@o che lo differenzia da altri • Polimorfismo • Possibilità di eseguire funzioni con lo stesso nome che pure sono state specializzate per una par6colare classe 30 Programmazione OO JAVA 31 Java • • • • • Java definito dalla Sun Microsystems, Inc. Introdo@o nel 1995 E' un linguaggio orientato agli ogge* Derivato da Smalltalk e C++ Definito per essere trasportabile su archite@ure differen6 e per essere eseguito da browser 32 Pedigree di Java algol Simula-67 smalltalk eiffel C pascal ada objectiveC UCSDPascal objectPascal C++ visualC++ delphi ada95 Java 33 Traduzione e esecuzione di Java • Il compilatore Java traduce il programma sorgente in una rappresentazione speciale de@a bytecode • Il bytecode Java non è un linguaggio macchina di una CPU par6colare, ma di una macchina virtuale Java • L'interprete traduce il bytecode nel linguaggio macchina e lo esegue • Il compilatore Java non è legato ad una par6colare macchina • Java è indipendente dall'archite@ura della macchina 34 Traduzione e esecuzione di Java codice sorgente Java compilatore Java bytecode Java interprete Java compilatore Bytecode codice macchina 35 Struttura del programma Java • Ogni programma Java è una raccolta di una o più classi • Una classe con6ene uno o più metodi • Un metodo con6ene le istruzioni • Ogni programma deve avere una e una sola classe contenente il metodo speciale main 36 Struttura del programma Java -­‐ 2 // commenti sulla classe public class Mio_programma { Intestazione della classe Corpo della classe I commenti possono essere aggiunti ovunque } 37 Struttura del programma Java – 3 // commenti sulla classe public class Mio_programma { // commenti sul metodo public static void main (String[] args) { Corpo del metodo Intestazione del metodo } } 38 Stampa di dati in Output Per stampare il contenuto di una variabile o un messaggio si usa • • • System.out.print(s); stampa il valore di s System.out.println(s); stampa s e va a capo E' possibile anche specificare una stringa di testo compresa tra apici “questa e’ una stringa di testo” • La classe JOptionPane offre un metodo di classe showInputDialog che mostra una finestra di dialogo per ricevere da6 di 6po diverso • La finestra res6tuisce i da6 so@oforma di stringa • Se si devono leggere numeri le stringhe vanno tra@ate con i metodi di classe Integer.parseInt(String) e Double.parseDouble(String) • Il programma va terminato con l'istruzione System.exit(0) • exit termina l'esecuzione e il parametro 0 indica che termina in modo corre@o 40 Leggere i dati di input Ambiente di sviluppo • Installare il JDK (non basta il JRE) della Oracle (Java 7 o superiore) • h@p://www.oracle.com/technetwork/java/javase/downloads/ index.html • Installare un editor di testo (es. Notepad++) • h@ps://notepad-­‐plus-­‐plus.org/download/v6.8.1.html • Per Mac consiglio TextWrangler • Più avan6 nel corso si u6lizzerà NetBeans come IDE di sviluppo • Seguire il seguente tutorial per realizzare il primo programma Java, compilandolo ed eseguendolo • h@ps://it.wikibooks.org/wiki/Java/Dal_sorgente_all %27esecuzione 41 Commenti • I commen6 di un programma sono spesso chiama6 documentazione inline • Devono essere inclusi per documentare lo scopo e le funzionalità del programma • Non ne influenzano il funzionamento • Vengono trascura6 dal compilatore • Possono avere due forme: // commenti fino alla fine della riga /* commento che può stare su più righe */ 42 Spazi vuoti • Gli spazi, righe vuote e le tabulazioni sono chiama6 spazi bianchi • Gli spazi bianchi sono usa6 per separare le parole e I simboli di un programma • Gli spazi bianchi vengono ignora6 dal compilatore • Un programma Java può essere forma@ato come si desidera con gli spazi bianchi • La forma@azione migliora la leggibilità di un programma e va usata in modo consistente 43 Esempio • Scrivere un programma di nome CalReTangolo Java che calcola l'area di un re@angolo no6 la base e l’altezza • Scrivere il programma con un editor di testo e provvedere alla compilazione. • Eseguire il programma e verificarne la corre@ezza. 44 Compilazione ed esecuzione • Aprire il prompt dei comandi • Compilazione: • javac nomefile.java • Gli eventuali errori vengono riporta6 come testo e vanno corre/ • Se la compilazione va a buon fine viene generato il file nomefile.class • Esecuzione • java nomefile • L’interprete run6me di Java cercherà il file nomefile.class e lo manderà in esecuzione 45 Errori • Errori di sintassi, che vengono interce@a6 dal compilatore (errori di compilazione) • Se c'è un errore durante la fase di compilazione, non viene creato un programma eseguibile • Errori genera6 durante l'esecuzione (errori d'esecuzione) • Tenta6vi di divisione per zero, che causano la fine anomala del programma • Errori che producono risulta6 diversi da quelli desidera6 (errori logici) 46 Errori sintattici o di compilazione Quando sono presenA istruzioni non correTe (ad es. non seguono le regole sintaVche) • public class Prova{ • public sta6c void main(String[] v){ • System.out.println(“Il cielo di”); • } • } • Se nel programma si sos6tuisca System.out.println (“il cielo di …”); con le seguen6 espressioni • System.aut.println (“il cielo di …”); • System.out.println (“il cielo di … ); • System.out.println (“il cilo di …”); 47 Errori sematici Quando il programma si interrompe inaspeTatamente ESEMPIO • { • int N=0; • Int Q=N/5; • } • In esecuzione si genera il messaggio: java.lang.ArithmeticException: /by zero at Divisione.main(Divisione.java:26) Exception in thread "main" Process Exit... 48 Errori logici Quando si scrive un programma che non si interrompe inaspeTatamente ma il risultato non e' correTo • Non si o@engono errori in compilazione, • né errori in esecuzione, • ma non si o/ene neanche il risultato voluto. 49