Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a. 2008-09 prof. Ugo de’Liguoro Blocco 2 – Linguaggi di programmazione. Introduzione a JAVA Linguaggi di programmazione • Programmare in assembly è complicato perché le sue istruzioni sono molto elementari; sono necessarie lunghe sequenze di codice anche per semplici operazioni: stampa a*b + d*c; Operazione COPY AX a MUL AX b COPY temp AX COPY AX d MUL AX c ADD AX temp OUT AX Codice assembly Programmazione I B - a.a. 2008-09 Linguaggi di programmazione • Per ovviare sono stati introdotti i linguaggi di programmazione, lingue artificiali per la definizione di programmi, simili all’algebra e ad un rudimentale inglese: Per esempio Java, C, C++, BASIC, Pascal, … • Proprietà: – Non ambigui – Concisi – Espressivi – Alto livello (si basano su astrazioni) Programmazione I B - a.a. 2008-09 1 Codice in un linguaggio d’alto livello Programmazione I B - a.a. 2008-09 Diversi tipi di linguaggi di programmazione Diversi tipi di linguaggi (ad alto livello): • Linguaggi imperativi Basati sul concetto di assegnamento: le istruzioni sono sostanzialmente operazioni di modifica delle strutture dati [es: Fortran, Cobol, Basic (non strutturati); Pascal, C (strutturati)] • Linguaggi funzionali Basati sul concetto di funzione: le istruzioni sono funzioni che vengono valutate [es: Lisp] • Linguaggi logici Basati sul concetto di dimostrazione: le istruzioni esprimono relazioni logiche tra input e output [es: Prolog] • Linguaggi ad oggetti Basati sul concetto di dato come oggetto attivo, in grado di ricevere e inviare messaggi [es: Smalltalk, C++, CLOS, Java] Programmazione I B - a.a. 2008-09 Programmi traduttori: compilatori Poiché l’unico linguaggio che un elaboratore è in grado di “capire” è il proprio linguaggio macchina, programmi scritti con linguaggi ad alto livello richiedono una traduzione: il programma traduttore è un compilatore. Programma sorgente compilatore Programma eseguibile Programmazione I B - a.a. 2008-09 2 Le fasi della programmazione con un compilatore Text editor sorgente compilatore Parser si Ok? no Traduttore eseguibile log Programmazione I B - a.a. 2008-09 Quali errori può scoprire il compilatore? Non esiste alcuna procedura automatica ed uniforme che possa decidere se un programma è logicamente corretto, né se una sua esecuzione produrrà un risultato! Alan M. Turing Tuttavia possiamo descrivere formalmente la grammatica di un linguaggio di programmazione e decidere se il testo di un programma vi si conforma Noam Chomsky Programmazione I B - a.a. 2008-09 Una grammatica Regole Frase Æ ParteNominale ParteVerbale • ParteNominale Æ Nome Relativaopt ParteVerbale Æ VerboIntransitivo | VerboTransitivo ParteNominale Nome Æ NomeProprio | Articolo NomeComune Relativa Æ che ParteVerbale NomeProprio Æ Mario | Lucia NomeComune Æ cane | gatto Articolo Æ il | un VerboIntransitivo Æ corre | scappa VerboTransitivo Æ insegue | raggiunge Nota: opt = opzionale (cioè che può esserci oppure no) Programmazione I B - a.a. 2008-09 3 Esempi di frasi corrette secondo la grammatica precedente Mario corre. Il cane scappa. Il cane insegue il gatto. Mario insegue Mario. Lucia insegue Mario che scappa. Lucia che insegue Mario raggiunge il cane. Mario insegue il cane che insegue un gatto che insegue Lucia. Il gatto raggiunge il gatto che raggiunge il gatto che raggiunge il gatto che corre. Un cane raggiunge un gatto che insegue il cane. Mario che insegue Mario raggiunge Lucia che insegue Lucia. ... Programmazione I B - a.a. 2008-09 Esempi di frasi scorrette secondo la stessa grammatica Il Mario corre. Mario corre (manca il punto finale!) Cane insegue cane. Il gatto insegue. Un cane raggiunge un Mario. Il gatto insegue il topo. Corre il cane. Il cane che scappa. Che cane. ... Programmazione I B - a.a. 2008-09 Derivazione di una frase da una grammatica Frase → ParteNominale ParteVerbale → Nome VerboTransitivo ParteNominale → Articolo NomeComune insegue Nome → il cane insegue Articolo NomeComune → il cane insegue il gatto Programmazione I B - a.a. 2008-09 4 L’albero sintattico di una frase il cane Art NC insegue il gatto Art NC N N VT PN PN PV F Programmazione I B - a.a. 2008-09 Ambiguità Art Nome Verbo Art Nome la vecchia porta la sbarra Art Attrib Nome Pron Verbo Programmazione I B - a.a. 2008-09 Backus-Naur Form (BNF) • E’ il formalismo utilizzato per descrivere la sintassi dei linguaggi di programmazione, ed è essenzialmente un modo per definire grammatiche. <statement> ::= <block> | "assert" <expression> [":" <expression>] ";" | "if" <par expression> <statement> ["else" <statement>] | "for" "(" <for control> ")" <statement> | "while" <par expression> <statement> | "do" <statement> "while" <par expression> ";" | "try" <block> <catches> | "try" <block> [<catches>] "finally" <block> | "switch" <par expression> "{" <switch block statement groups> "}" | "synchronized" <par expression> <block> | "return" [<expression>] ";" | "throw" <expression> ";" | "break" [<identifier>] ";" | "continue" [<identifier>] ";" | ";" | <statement expression> ";" | <identifier> ":" <statement> Programmazione I B - a.a. 2008-09 5 Interpreti In alternativa ai compilatori, alcuni linguaggi utilizzano gli interpreti: interprete, programma che legge il sorgente riga per riga, ne riconosce le istruzioni ed esegue le azioni corrispondenti. Sono linguaggi interpretati il BASIC, Javascript (e la maggioranza dei linguaggi di scripting), il LISP ed il PROLOG (usati per l’intelligenza artificiale e le applicazioni della logica), ecc. Programmazione I B - a.a. 2008-09 Macchina Virtuale • JAVA nasce come linguaggio per la rete, indipendente dalla piattaforma; un programma JAVA può migrare da una macchina all’altra ed essere eseguito nel nuovo ambiente. • Un’interprete per JAVA non sarebbe però efficiente • Si usa allora la JVM, macchina virtuale di JAVA, ossia un’interprete di un linguaggio a basso livello, detto bytecode che viene generato dal compilatore JAVA. • La macchina virtuale è un’astrazione di un elaboratore “generico” Programmazione I B - a.a. 2008-09 VM = Macchina Virtuale Programmazione I B - a.a. 2008-09 6 Passi concettuali (I) Programmazione I B - a.a. 2008-09 Passi concettuali (II) Programmazione I B - a.a. 2008-09 Concetti della programmazione imperativa: dati e procedure Un programma di un linguaggio, imperativo ad esempio il C, si compone di due parti, la specifica dei dati e quella delle procedure: Dichiarazione e definizione di variabili (globali) e tipi def. dall’utente int n = 0; double v[100]; struct Record {int a; char c}; Procedure e funzioni, tra cui una principale (main) int main() { … return 0; } .c Programmazione I B - a.a. 2008-09 7 Concetti della programmazione imperativa: le variabili Una variabile è una locazione di memoria astratta tipo nome double indirizzo (fissato) x 16F7A008 500.65 prima dell’uso bisogna dichiarare le variabili! Valore (modificabile) Programmazione I B - a.a. 2008-09 Concetti della programmazione imperativa: comandi La programmazione imperativa si basa sulla nozione di comando Vi sono due specie di comandi: • Assegnamenti • Istruzioni di controllo Programmazione I B - a.a. 2008-09 Concetti della programmazione imperativa: comandi • Assegnamenti n = 7 + 5*m; Significato: sia n il numero che si ottiene valutando l’espressione 7 + 5*m (quindi si deve sapere quanto vale m!) Programmazione I B - a.a. 2008-09 8 Concetti della programmazione imperativa: comandi • Assegnamenti Simbolo di assegnazione (NON di eguaglianza) n = 7 + 5*m; Variabile, astrazione di una locazione di memoria (deve essere stata dichiarata prima) Espressione, può contenere costanti (7, 5) operatori (+ e *) e variabili (che devono avere già un valore) Programmazione I B - a.a. 2008-09 Concetti della programmazione imperativa: comandi • Istruzioni di controllo Questa è un’iterazione, ossia un modo controllato per ripetere un certo numero di istruzioni while (r > 0) { true n = m; r>0 false = m = r; r = n mod m; n=m … } Programmazione I B - a.a. 2008-09 Concetti della programmazione imperativa: procedure Le istruzioni o comandi sono raggruppati in procedure (in C sono chiamate funzioni, in JAVA metodi), le quali possono avere dei parametri: int MassimoComunDivisore (int n, int m) // pre: n, m positivi e non entrambi nulli // post: ritorna l’MCD tra n ed m { ….} Tra di esse deve esservi una procedura principale (il main), che viene eseguita per prima, e che attiva in cascate le altre. Programmazione I B - a.a. 2008-09 9 Oggetti e … Nei linguaggi orientati agli oggetti, come JAVA, le unità del programma sono gli oggetti. Oggetto:agente agentecaratterizzato caratterizzatoda da Oggetto: unostato stato ••uno uninsieme insiemedi dicomportamenti comportamenti ••un Stato: power = on; trackNo = 12; title = “Oh sole mio”, … Comportamenti: On/Off, select, play, stop, pause, ... Lettore MP3 Programmazione I B - a.a. 2008-09 … classi Nei linguaggi class-based (come JAVA) gli oggetti esistono solo durante l’esecuzione; il programma contiene soltanto le loro descrizioni prototipali, ossia le classi. Campi privati accessibili solo dai metodi della classe public class LettoreMP3 { private bool OnOff; private int trackNo; … public void PowerSwitch() { …}; public void Play() { …}; … }; Metodi pubblici accessibili dall’ esterno (ma ve ne sono anche di privati) Programmazione I B - a.a. 2008-09 Istanziazione delle classi Per generare oggetti (istanze) da una classe occorre che sia eseguita un’istruzione di istanziazione lettoreDiUgo lettoreDiUgo = new LettoreMP3() Stato: power = on; public class LettoreMP3 { private bool OnOff; private int trackNo; … public void PowerSwitch() { …}; public void Play() { …}; … }; trackNo = 12; title = “Oh sole mio”, … lettoreDiMario lettoreDiMario = new LettoreMP3() Stato: power = on; trackNo = 3; title = “Only you”, … Programmazione I B - a.a. 2008-09 10 Il primo programma Java Programmazione I B - a.a. 2008-09 Formato generale Programmazione I B - a.a. 2008-09 main(…): la porta sul mondo Java public static void main(String[] args){ /* istruzioni ... */ } • Punto di ingresso di ogni applicazione – Invocato automaticamente dalla VM Java – static perché non appartiene ad alcun oggetto …. Programmazione I B - a.a. 2008-09 11 Java: Hello Parametro di main, che contiene Argomenti di riga di comando Nel file Hello.java public class Hello { public static void main(String[] args){ String s = “Ciao”; Assegnamento System.out.println(s); } } stampa a video il valore della variabile output Programmazione I B - a.a. 2008-09 Java: javac e java Compiliamo le classi Hello: > javac Hello.java compilatore → Hello.class > javac = invocazione del compilatore Java (che "traduce" il codice sorgente Java in bytecode) Interpretiamo/eseguiamo il bytecode Hello.class: > java Hello → ciao! java = invocazione dell'interprete Java (che interpreta ed esegue il bytecode) interprete (Java Virtual Machine) Programmazione I B - a.a. 2008-09 Java: javac e java Attenzione! Java è case sensitive! ⇒ Hello.java ≠ hello.java • il nome del file e il nome della classe devono essere identici (anche rispetto all'uso di maiuscole e minuscole) • quando compilate o interpretate/eseguite attenzione a scrivere i nomi corretti Vien da sé che non si possono usare, per le classi Java, nomi di file con spazi! Programmazione I B - a.a. 2008-09 12 Al lavoro! 1. Aprite Blocco Note oppure TextPad (scelta consigliata!) 2. Digitate il codice per la classe Hello1 e salvatelo nel file Hello1.java (nella directory c:\esempi) 3. Digitate il codice per la classe Test1 e salvatelo nel file Test1.java (nella directory c:\esempi) 4. Avviate il Prompt dei comandi (Start > Programmi > Accessori) → 5. Posizionatevi nella directory che contiene le classi (cd examples) 6. Compilate Hello.java (javac Hello.java) 5. Lanciate Hello (java Hello) Con tanti AUGURI! Programmazione I B - a.a. 2008-09 13