Introduzione alla programmazione Cosa è un calcolatore? Hardware Processore Memoria Periferiche Funzionamento Esegue istruzioni elementari Esegue istruzioni molto velocemente Deve essere programmato Il software, cioè i programmi, caratterizzano il compito che esso svolge Componenti di un calcolatore Schema di un calcolatore Linguaggi per la programmazione di un calcolatore Linguaggio macchina 21 40 16 100 163 240 Linguaggio assemblativo (Assembler) iload intRate bipush 100 if_icmpgt intError Linguaggi ad alto livello if (intRate > 100) . . . Programma I programmi caratterizzano il compito che il calcolatore svolge. Un programma (indipendentemente dal linguaggio in cui è scritto) è costituito da due aspetti fondamentali: rappresentazione delle informazioni (dati) relative al dominio di interesse: oggetti manipolazioni della rappresentazione che realizzano le funzionalità richieste: operazioni Per scrivere un programma si devono affrontare entrambi gli aspetti. Realizzazione delle operazioni: algoritmi In genere, si realizza un'operazione quando deve essere risolto un problema. Esempio: dato un nominativo, trovare il corrispondente numero telefonico su un elenco telefonico. Per delegare ad un calcolatore la soluzione di un problema è necessario individuare un algoritmo che risolve il problema. Algoritmo: procedimento risolutivo attraverso il quale otteniamo la soluzione ad un problema, ovvero un insieme di passi che, eseguiti in ordine, permettono di calcolare i risultati a partire dalle informazioni date in ingresso. Un algoritmo è caratterizzato da: non ambiguità: le istruzioni devono essere univocamente interpretabili dall’esecutore eseguibilità: ogni istruzione deve poter essere eseguita (in tempo finito) con le risorse a disposizione Esempio di algoritmo: scandire sequenzialmente i nominativi presenti nell'elenco fino a che non si trova quello cercato, restituire il numero di telefono associato al nominativo. Esistono altri algoritmi per risolvere lo stesso problema? Si! Una volta individuato l'algoritmo, questo va codificato nel linguaggio di programmazione prescelto. Paradigmi di programmazione Esistono differenti paradigmi di programmazione che si distinguono per l'enfasi che pongono sui due aspetti fondamentali: oggetti e operazioni. I paradigmi di programmazioni principali sono: 1. imperativo: enfasi sulle operazioni intese come azioni/comandi/istruzioni che cambiano lo stato dell'elaborazione; gli oggetti sono funzionali alla elaborazione 2. funzionale: enfasi sulle operazioni intese come funzioni che calcolano risultati; gli oggetti sono funzionali alla elaborazione 3. orientato agli oggetti: enfasi sugli oggetti che complessivamente rappresentano il dominio di interesse; le operazioni sono funzionali alla rappresentazione In genere in un programma sono utilizzati più paradigmi di programmazione. Quindi i linguaggi di programmazione forniscono supporto (in misura diversa) per i vari paradigmi. Un esempio: Java Come esempio, useremo il linguaggio di programmazione Java. Java è un linguaggio di programmazione moderno ad alto livello, orientato agli oggetti, ma che supporta anche il paradigma imperativo e il paradigma funzionale. Caratteristiche generali di Java: semplice indipendente dalla piattaforma (lo stesso programma è eseguibile in Windows, Unix, MacOS, ecc.) dispone di librerie di programma ricche e ben sviluppate progettato per Internet basato su una macchina virtuale (vedi dopo) sicuro (la macchina virtuale impedisce accessi indesiderati da applicazioni via Internet) Il primo programma Java import java.lang.*; public class Primo { public static void main(String[] args) { System.out.println("Questo e' il mio primo programma Java."); } } Le istruzioni hanno il seguente significato: import java.lang.*; richiesta di utilizzare librerie di classi/programmi predefiniti (in realtà la libreria java.lang è importata automaticamente, quindi questa istruzione può essere omessa) public class Primo { ... } definizione di una classe/programma chiamata Primo public static void main(String[] args) { ... } definizione del metodo main (un metodo è la realizzazione di un'operazione in Java) System.out.println("Questo e' il mio primo programma Java."); istruzione di stampa su video System.out oggetto/istanza predefinito della classe predefinita PrintStream println metodo della classe PrintStream applicato all'oggetto System.out "Questo e' il mio primo programma Java." oggetto della classe String che rappresenta la frase da visualizzare Nota: Java è case-sensitive, cioè distingue tra caratteri minuscoli e caratteri maiuscoli, es. class è diverso da Class. Secondo programma public class Secondo { public static void main(String[] args) { System.out.println("Questo e' il mio secondo programma Java..."); System.out.println("...e non sara' l'ultimo."); } } La sequenza di due istruzioni comporta l'esecuzione delle due istruzioni nell'ordine in cui sono scritte. Scrivere, compilare ed eseguire un programma Java 1. preparazione del testo del programma 2. compilazione del programma 3. esecuzione del programma compilato 1. Preparazione del testo del programma La preparazione del testo di un programma comporta la scrittura di un file contenente il programma. Per un programma Java il nome del file deve essere NomeClasse.java dove NomeClasse è il nome della classe definita dal programma. Es. Primo.java La scrittura di un programma può essere effettuata con qualsiasi programma che consenta la scrittura di un testo (editor). Es. Edit, NotePad, Emacs,... Esempio: 2. Compilazione del programma La compilazione del programma serve a tradurre il programma in una sequenza di comandi direttamente eseguibili dal calcolatore. Il compilatore Java standard, fornito con il Java Standard Development Kit (Java SDK), si chiama javac. Per usarlo occorre eseguire il comando: javac NomeClasse.java La compilazione produce come risultato un file chiamato NomeClasse.class che contiene i comandi direttamente eseguibili dal calcolatore. Ad esempio: javac Primo.java crea il file Primo.class 3. Esecuzione del programma compilato L'esecuzione di un programma si può effettuare solo dopo la compilazione, cioè quando si ha il file NomeProgramma.class In Java l'esecuzione del programma avviene attraverso il comando java NomeClasse (senza .class). Ad esempio il comando java Primo comporta l'esecuzione del programma Primo (o meglio del metodo main della classe Primo) e quindi la visualizzazione di Questo e' il mio primo programma Java. Ambiente di programmazione Esistono delle applicazioni chiamate ambienti di programmazione che consentono di realizzare i passi di scrittura, compilazione ed esecuzione in maniera integrata. Alcuni esempi di ambienti di programmazione per Java sono: JavaONE, JBuilder , JCreator, ecc. La figura seguente si riferisce a BlueJ, un ambiente di programmazione sviluppato per la didattica dalla Monash University, Australia, e dalla University of Southern Denmark. Dal codice sorgente al programma eseguibile (riassunto) Nota sulla portabilità di Java Il compilatore Java non produce direttamente codice eseguibile dal calcolatore, ma produce un codice indipendente dal particolare calcolatore denominato Java bytecode. Il risultato della compilazione di un programma Java è quindi indipendente dalla piattaforma. Ciò comporta l'uso di un apposito programma per eseguire il bytecode: l'interprete del bytecode, noto come Macchina Virtuale Java (Java Virtual Machine), che viene attivato con il comando java. Per eseguire un programma Java compilato su una qualsiasi piattaforma è sufficiente avere l'interprete per il Java bytecode. Questa indipendenza dalla piattaforma è una delle caratteristiche che hanno portato ed una così rapida diffusione di Java. Errori Il seguente programma contiene diversi errori. public class Errori { public static void main(String[] args) { System.out.println("Questi sono i miei primi errori Java...") Sistem.out.println("...e non saranno gli ultm!!!"); } } Programma corretto public class Errori { public static void main(String[] args) { System.out.println("Questi sono i miei primi errori Java..."); System.out.println("...e non saranno gli ultimi!!!"); } } Tipi di errori: Errori di sintassi, cioè errori dovuti alla violazione delle regole sintattiche del linguaggio esempio: System.out.println(...) — manca il “;” sono individuati dal compilatore Errori semantici, cioè errori dovuti alla impossibilità di assegnare un significato ad un'istruzione esempio: Sistem.out.println(...); — errore di ortografia nella parola System a volte sono individuati dal compilatore (errori di semantica statica), altre volte sono individuati a tempo di esecuzione (errori di semantica dinamica) Errori logici, cioè errori relativi alle funzionalità realizzate dal programma (differenti da quelle desiderate) esempio: System.out.println("...e non saranno gli ultm!!!"); : la stringa da stampare non è corretta possono essere individuati solo analizzando o eseguendo test di verifica del programma Il ciclo Edita-Compila-Verifica