Lezione 3 - Dipartimento di Informatica

Sommario
• Problema computazionale
• Sviluppo software
• Algoritmi
– Diagrammi di Flusso;
– Pseudo Codice
• Istruzioni Sequenziali, Condizionali, Cicliche;
• Javascript
Fondamenti di Informatica -- R.Gaeta
1
Il Problema computazionale
• È computazionale un problema che da alcuni dati iniziali porta
ad un risultato in uscita tramite almeno una sequenza
preordinata di passi;
• Esempi nella vita pratica si trovano facilmente nell’arte
culinaria o nella musica.
Fondamenti di Informatica -- R.Gaeta
2
Esempi
Il Risotto alla Zucca:
- Abbiamo gli ingredienti (riso, zucca, olio, prezzemolo, cipolla,
sale, etc.) con le giuste quantità;
- Seguiamo la ricetta;
- Serviamo il piatto a tavola.
Fondamenti di Informatica -- R.Gaeta
3
Altro esempio
L’esecuzione della nona di Beethoven:
- Abbiamo l’orchestra, il direttore ed i musicisti;
- Seguiamo lo spartito;
- La musica riempie la sala.
Fondamenti di Informatica -- R.Gaeta
4
Ma…
• Non è così facile come sembra!
• Per scrivere la “sequenza di passi” bisogna essere un
bravo cuoco o un bravo compositore (o entrambi, come
Rossini);
• Anche per sapere “eseguire” bisogna imparare l’arte
(bisogna avere un ottimo esecutore).
Fondamenti di Informatica -- R.Gaeta
5
Il “cuore” dell’informatica
• definizione di un particolare problema computazionale
• scrittura di un algoritmo che lo risolve
• scrittura del programma che traduce i passi
dell’algoritmo in termini comprensibili dal computer
Fondamenti di Informatica -- R.Gaeta
6
Il “cuore” dell’informatica
• Ovvero, dato un problema bisogna definire un
procedimento (l’algoritmo) che possa essere eseguito
automaticamente da un esecutore a partire dai dati in
ingresso per risolvere il problema (fornire i risultati in
uscita)
algoritmo
input
esecutore
output
Fondamenti di Informatica -- R.Gaeta
7
Quindi…
problema
risolutore
algoritmo
esecutore
essere umano
calcolatore
esecuzione
Fondamenti di Informatica -- R.Gaeta
8
Cosa è un Algoritmo
• Un algoritmo (procedimento) è una sequenza finita di passi
(azioni) che un esecutore è in grado di eseguire affinché
venga risolto (in un tempo finito) un dato problema
computazionale.
• Ogni passo deve essere eseguibile dall’esecutore e in un
tempo finito.
• Un algoritmo determina un procedimento sequenziale (un
passo dopo l’altro secondo un ordine specificato chiamato
flusso di esecuzione)
• La cosa difficile è scrivere una sequenza di passi che
risolvano il problema computazionale e NON scrivere un
programma per il calcolatore
Fondamenti di Informatica -- R.Gaeta
9
Esecutore di algoritmi
• Un esecutore è caratterizzato da
– il linguaggio che è in grado di interpretare
– l’insieme di azioni che è in grado di compiere
– l’insieme delle regole che ad ogni frase corretta del linguaggio
(costrutto linguistico) associano le relative azioni da compiere
Fondamenti di Informatica -- R.Gaeta
10
Caratteristiche di un algoritmo
• Tutte le azioni specificate dall’algoritmo devono essere
eseguibili dall’esecutore
– sono azioni elementari
• In caso contrario, si deve scomporre un problema
complesso in più sotto-problemi più semplici
• Per ogni problema più semplice deve esistere
un’istruzione nel linguaggio adottato per la scrittura
degli algoritmi la cui esecuzione lo risolve.
Fondamenti di Informatica -- R.Gaeta
11
Esempio di algoritmo
L’esecutore è un essere umano che è solo in grado di
premere tasti ed usare il mouse
• Accendere il calcolatore
• Accendere il monitor
• Scrivere il nome utente
• Scrivere la password
• Premere il tasto invio
• Se compare il messaggio di “password scaduta” allora
cambiare la password altrimenti accedere al desktop di
windows
Fondamenti di Informatica -- R.Gaeta
12
Esempio: scomposizione in sotto-problemi
• Ma l’esecutore sa direttamente eseguire il comando
“cambiare la password”?
• NO! Abbiamo definito in maniera precisa ed univoca che
cosa l’esecutore è in grado di fare per cui dobbiamo
scrivere un algoritmo per la risoluzione del problema
“cambiare la password”
– scrivere una sequenza di almeno sei caratteri
– ri-scrivere, per conferma, la stessa sequenza
– premere il tasto invio
• Per esercizio, avendo ormai esperienza di come si
accede all’aula 15, completate l’algoritmo!!
Fondamenti di Informatica -- R.Gaeta
13
Caratteristiche di un algoritmo
•
Formulazione generale
–
•
Passi eseguibili univoci e non ambigui
–
•
la soluzione individuata non deve dipendere solo da valori predefiniti dei dati, cosi
che l’algoritmo sia utilizzabile nel maggior numero possibile di casi
“abbastanza”, “a volontà”, “un pochetto”, non sono adatti ad esecutori come i
calcolatori.
Determinismo
–
una volta fatto un passo, in maniera univoca quello successivo può essere
determinato dall’esecutore anche se ci sono alternative
•
Finitezza del numero di passi
•
Terminazione
–
•
prima o poi l’esecuzione dell’algoritmo deve terminare
La finitezza del numero dei passi implica la terminazione?
Fondamenti di Informatica -- R.Gaeta
14
Caratteristiche di un algoritmo
Ogni passo (azione) deve
• terminare entro un intervallo finito di tempo
• produrre un effetto osservabile
• produrre lo stesso effetto ogni volta che viene eseguito a
partire dalle stesse condizioni iniziali
Fondamenti di Informatica -- R.Gaeta
15
Elementi degli algoritmi
• Oggetti: le entità su cui opera l’algoritmo
– Dati iniziali del problema, informazioni ausiliarie, risultati parziali e
finali
– Le informazioni sono dette dati (anche i risultati parziali e finali) e
possono essere variabili o costanti
• Operazioni: Interventi da effettuare sui dati
– Calcoli, confronti, ricopiature,acquisizioni, emissioni, ecc.
• Flusso di controllo: l’indicazione delle possibili successioni
dei passi dell’algoritmo
– La correttezza dei risultati dipende non solo dalla corretta esecuzione
delle singole operazioni, ma anche dalla corretta sequenza con cui sono
eseguite
Fondamenti di Informatica -- R.Gaeta
16
Flusso di controllo e di esecuzione
• Flusso di controllo: la descrizione a priori di tutte le
possibili sequenze nell’esecuzione dei passi dell’algoritmo, in
particolare di operazioni in alternativa e di operazioni da
ripetere più volte ciclicamente
• Flusso di esecuzione: la sequenza di operazioni
effettivamente seguita durante una particolare esecuzione
dell’algoritmo e che dipende dai particolari valori che i dati
assumono in quell’esecuzione
Fondamenti di Informatica -- R.Gaeta
17
Cosa è un programma
• Il programma è la “scatola nera” che risolve il problema
computazionale;
• Il programma è una sequenza di istruzioni che devono essere
eseguite;
• Il programma è la traduzione per il computer dei passi
dell’algoritmo
• Deve essere scritto tramite un linguaggio che il computer
capisca (linguaggio macchina);
• Il programmatore utilizza un linguaggio di programmazione
che poi viene tradotto (da qualcosa) in linguaggio macchina;
Fondamenti di Informatica -- R.Gaeta
18
Dall’uomo al calcolatore
uomo
pseudo codice
diagramma di flusso
algoritmo
programma
linguaggio di programmazione
ad alto livello
traduttore
linguaggio macchina
esecuzione del processore
input
calcolatore
output
Fondamenti di Informatica -- R.Gaeta
19
Fasi di creazione di un programma
1. Studio
Preliminare
2. Analisi del
Sistema
6. Manutenzione
e Test
3. Progettazione
5. Implementazione
4. Sviluppo
Fondamenti di Informatica -- R.Gaeta
20
Le fasi
• Analisi del problema computazionale (individuare input ed
output, etc.)
• Progettazione di una soluzione proponendo una suddivisione
del problema in sottoproblemi più semplici; alla fine di questa
fase, per ogni sottoproblema si deve scrivere l’algoritmo
utilizzando pseudo-codici e diagrammi di flusso;
• Stesura
del
programma
a
implementazione vera e propria
partire
dall’algoritmo:
• Test del programma: alfa testing, beta testing, debugging
• Produzione documentazione e distribuzione
Fondamenti di Informatica -- R.Gaeta
21
Un altro esempio di algoritmo
Preparazione del
Risotto alla Zucca da parte di un
esecutore in grado di aggiungere, tagliare, mescolare,
tostare, mantecare,…
1.
Preparare il soffritto ed il brodo;
2.
Aggiungere la zucca a pezzettini al soffritto;
3.
Mescolare fino a quando la zucca non è un purè;
4.
Aggiungere il riso al soffritto;
5.
Fare tostare il riso; poi bagnarlo con il vino;
6.
Aggiungere brodo fino a quando il riso è cotto;
7.
Aggiungere prezzemolo, pepe e burro;
8.
Se preferisci salato, allora aggiungi sale;
Fondamenti di Informatica -- R.Gaeta
22
Sottoproblemi
• L’algoritmo precedente è un altro esempio di cosa
significa scomporre un problema in sottoproblemi;
– Come si prepara un soffritto?
– Come si prepara un brodo?
• Ogni sottoproblema può essere scomposto in problemi
via via più elementari;
• Per ogni problema elementare deve esistere
un’istruzione nel linguaggio adottato la cui esecuzione lo
risolve.
Fondamenti di Informatica -- R.Gaeta
23
Alto e basso livello
• Man mano che si suddivide il problema in sottoproblemi, si
scende di livello;
• Se ci si avvicina al linguaggio umano, si parla di linguaggi di
Alto livello;
• Se ci si avvicina al linguaggio macchina, si parla di linguaggi di
Basso livello;
Fondamenti di Informatica -- R.Gaeta
24
Linguaggi
Linguaggio umano (es. Italiano)
Descrizione di un algoritmo (es. diagrammi di flusso,
pseudo codice, etc…)
Linguaggi di Programmazione
(es. C, VBasic, Java, Logo, etc…)
Alto livello
Linguaggio Macchina
Basso livello
Fondamenti di Informatica -- R.Gaeta
25
Linguaggi di programmazione
• Linguaggio macchina
– Codifica binaria delle istruzioni
– Diverso per ogni architettura
– Istruzioni e operazioni elementari coincidono
• Linguaggio Assembler
– Sempre a livello macchina, ma codifica simbolica delle istruzioni
–
Es: ADD R1, R6
STORE R1, RAM[255]
MOV R1, #4
Fondamenti di Informatica -- R.Gaeta
26
Linguaggi di programmazione
• Linguaggio ad alto livello (HLL - High-Level Languages
– Elaboratore virtuale
• Operazioni molto più astratte delle operazioni HW
– Es: x = y+2
z = cos(x)
– Linguaggio indipendente dalla piattaforma!
– Possibile mediante l’esistenza di traduttori
Fondamenti di Informatica -- R.Gaeta
27
Linguaggi di programmazione
Programma
sorgente
(HLL)
Traduttore
Programma
eseguibile
(bit)
Fondamenti di Informatica -- R.Gaeta
28
Traduttori
“somma due interi”
…
“stampa un
messaggio”
010101010111
010101111111
101010101010
101010101011
Traduttore
Traduttore
...
Uomo
Macchina
Fondamenti di Informatica -- R.Gaeta
29
Traduttori
• Due schemi
– Compilatori
– Interpreti
Fondamenti di Informatica -- R.Gaeta
30
Compilatori
• Traduzione avviene in due passi:
– Compilazione vera e propria
– Collegamento (link)
• Dopo la fase di link, il programma può essere eseguito
direttamente
• Ogni fase produce un file corrispondente all’aggiunta di
informazioni di vario tipo
– Formato oggetto
– Formato eseguibile
Fondamenti di Informatica -- R.Gaeta
31
Compilatori
sorgente
COMPILATORE
COMPILATORE
oggetto
LINKER
LINKER
eseguibile
Libreria
01011010
01010100
11111111
...
Fondamenti di Informatica -- R.Gaeta
32
Linker
• Risolve i riferimenti ad indirizzi di memoria
– Indirizzi logici => indirizzi fisici
• Aggiunge al codice le librerie:
– Funzioni pre-compilate e riutilizzabili (es. funzioni matematiche)
e distribuite con il compilatore
– Codice scritto in precedenza
– Due schemi:
• Librerie statiche
• Librerie dinamiche
Fondamenti di Informatica -- R.Gaeta
33
Interpreti
• Il formato interno viene generato
traducendo il formato sorgente
• Il programma viene interpretato
eseguito istruzione per istruzione.
ed
interpretando
e
immediatamente
• Non viene generato né formato intermedio (oggetto) né
eseguibile.
Fondamenti di Informatica -- R.Gaeta
34
Compilatori vs. interpreti
• Linguaggi compilati:
– Vantaggi:
• Formato del programma eseguibile più efficiente → esecuzione più veloce
• Migliore supporto per istruzioni “complesse” e programmi di grandi
dimensioni
– Svantaggi:
• Rallentamento tempo di sviluppo dei programmi
• Maggiori requisiti di spazio di memoria (il compilatore è un programma
sofisticato)
•
Linguaggi interpretati:
– Ideali in ambiente didattico per lo sviluppo rapido di programmi.
Fondamenti di Informatica -- R.Gaeta
35
Portabilità del software
• Possibilità per un programma di poter essere eseguito su
piattaforme HW e SW diverse da quelle su cui è stato
sviluppato
compilatore Windows
codice sorgente
compilatore Linux
compilatore MacOS
codice eseguibile Windows
codice eseguibile Linux
codice eseguibile MacOS
Fondamenti di Informatica -- R.Gaeta
36
Linguaggi di programmazione
• FORTRAN
– FORmula TRANslation (1956)
• calcoli tecnico-scientifici (ambiente fisico/matematico)
• svariate librerie
• compilato
• COBOL
– COmmerce and Business Oriented Language (1960)
• elaborazione di archivi, tabulati
• applicazioni contabili
Fondamenti di Informatica -- R.Gaeta
37
Linguaggi di programmazione
• BASIC
–
Beginner’s All-purpose Symbolic Instruction Code (1962)
• relativamente semplice
• capacità grafiche
• interpretato
• versioni “evolute” (VisualBasic)
• PASCAL
– (1972)
• Linguaggio molto “formale” (progetto accademico)
• Programmazione strutturata
• Utile per la didattica
• Compilato
Fondamenti di Informatica -- R.Gaeta
38
Linguaggi di programmazione
• C
– Bell Labs (1972)
• Evoluzione più efficiente del PASCAL
• Istruzioni per ottimizzazione del codice
• efficiente
• Molto usato nella programmazione di sistema
• compilato
• C++
– Bell Labs (‘80)
• Evoluzione del C ad oggetti
• Diverso paradigma di programmazione
• Include il C
• compilato
Fondamenti di Informatica -- R.Gaeta
39
Linguaggi di programmazione
• Java
– Sun MicroSystems (‘90)
• Evoluzione del C++
• Schema misto compilato+interpretato
• Portabilità universale tramite formato intermedio (bytecode)
• Vasta gamma di librerie
• Supporto alla programmazione web
• Perl
– GNU project (‘90)
• interpretato
• complesso, ma molto potente
• molto utilizzato nella programmazione web
• programmi=>script
Fondamenti di Informatica -- R.Gaeta
40