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