Introduzione alla programmazione Cosa è un calcolatore?

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