Programmi e linguaggi
Un calcolatore è solo un esecutore
rapidissimo di istruzioni
Algoritmi e Linguaggi
Un programma è un insieme di istruzioni
codificate in un opportuno linguaggio
2 / 21
Informatica - M. Falda, A. A. 2007 - 2008
Linguaggi e algoritmi
Algoritmo
Prima di scrivere un programma si deve
Le precedenti caratteristiche portano agli
algoritmi: un algoritmo è una procedura
1.
2.
3.
4.
5.
generalizzare il più possibile la procedura
assicurarsi che termini sempre
identificare tutte le possibili configurazioni
iniziali
precisare in maniera univoca i passi da
compiere
accertarsi che un calcolatore possa eseguirli
Informatica - M. Falda, A. A. 2007 - 2008
1.
2.
3.
4.
5.
generale
finita
completa
non ambigua
eseguibile
3 / 21
4 / 21
Informatica - M. Falda, A. A. 2007 - 2008
Progettare gli algoritmi
Complessità
Complessità degli algoritmi
Non esiste un algoritmo per progettare algoritmi!
Tra i problemi calcolabili ce ne sono alcuni
intrinsecamente più difficili, ad esempio
trovare un percorso minimo per visitare un
insieme di città una sola volta
Due approcci:
top-down: dal generale al particolare
bottom-up: dal particolare al generale
verificare la correttezza di un circuito logico
Non tutti i problemi sono calcolabili
trovare il minimo numeri di colori per una mappa
e.g.: un programma si fermerà sempre?
5 / 21
Informatica - M. Falda, A. A. 2007 - 2008
6 / 21
Informatica - M. Falda, A. A. 2007 - 2008
Diagrammi di flusso
Blocchi di base
Rappresentazione
Un algoritmo può essere descritto usando
un diagramma di flusso
Funzione
inizio e fine
Un diagramma di flusso è costituito da
istruzione
blocchi di base
strutture per comporre i blocchi
ingresso / uscita
7 / 21
Informatica - M. Falda, A. A. 2007 - 2008
8 / 21
Informatica - M. Falda, A. A. 2007 - 2008
La programmazione strutturata
Inizio
Inizio
La sequenza
Acquisisci
Acquisisci
lalabase
basebb
Un qualsiasi algoritmo può essere espresso
combinando i blocchi di base mediante
È semplicemente un
insieme di blocchi che si
susseguono
sequenza
selezione
ripetizione o iterazione
Acquisisci
Acquisisci
l’altezza
l’altezzahh
aa==bb**hh/ /22
E.g.: l’area di un triangolo
Restituisci
Restituisci
l’area
l’areaaa
Si ottiene un diagramma di flusso strutturato
Fine
Fine
9 / 21
Informatica - M. Falda, A. A. 2007 - 2008
Informatica - M. Falda, A. A. 2007 - 2008
La selezione
L’iterazione
Permette di sdoppiare l’esecuzione in
dipendenza di una condizione
vero
Equilatero
Equilatero
I Ilati
latisono
sono
uguali?
uguali?
Serve a ripetere una serie di istruzioni
fa uso della selezione per terminare
falso
falso
Non
Nonequilatero
equilatero
vero
nn>>0?
0?
nn==nn/ /bb
11 / 21
Informatica - M. Falda, A. A. 2007 - 2008
10 / 21
resto(n,
resto(n,b)
b)
12 / 21
Informatica - M. Falda, A. A. 2007 - 2008
Linguaggi naturali e formali
Il linguaggio macchina e l’l’assemblatore
Un linguaggio naturale è ambiguo
Anche le istruzioni sono codificate con
sequenze di bit
“una vecchia porta la sbarra”
Si possono associare simboli mnemonici,
ma rimangono
Un linguaggio formale non lo è mai
la complessità
la mancanza di astrazione
grammatiche formali
13 / 21
Informatica - M. Falda, A. A. 2007 - 2008
14 / 21
Informatica - M. Falda, A. A. 2007 - 2008
I linguaggi ad alto livello
Traduzione
Permettono di
astrarre le caratteristiche del calcolatore
generalizzare la scrittura di procedure ricorrenti
Ogni linguaggio deve essere ritradotto in
linguaggio macchina
Tre metodi
Caratteristiche
sintassi semplice, familiare al programmatore
più sono “lontani” dal calcolatore e meno sono
efficienti: compromesso tra velocità e versatilità
compilazione: C++
interpretazione: Javascript
pseudo-codice: Java
15 / 21
Informatica - M. Falda, A. A. 2007 - 2008
16 / 21
Informatica - M. Falda, A. A. 2007 - 2008
Tipologie di linguaggi ad alto livello
Determinismo
Imperativi: si specificano le istruzioni da eseguire
C, Pascal
Ad oggetti: si modella il problema in termini di interazioni tra
oggetti
C++, Java
Funzionali: si formula il problema in termini di funzioni
Algoritmi non deterministici
Lisp, ML
Dichiarativi: si descrive il problema in termini logici lasciando
al calcolatore il compito di risolverlo
Prolog, XSLT
Un algoritmo è deterministico se ad ogni
configurazione di ingresso corrisponde un
unico percorso di esecuzione
algoritmi casuali
approcci dichiarativi
17 / 21
Informatica - M. Falda, A. A. 2007 - 2008
18 / 21
Informatica - M. Falda, A. A. 2007 - 2008
Compilazione
Interpretazione
Il codice viene tradotto una volta per tutte
Il codice viene tradotto linea per linea ogni
volta
efficiente
deve essere ricompilato per ogni calcolatore
diverso
lento
portabile immediatamente su calcolatori diversi
permette la meta-programmazione
Compilatore
Compilatore
Programma sorgente
(codice)
Programma oggetto
(eseguibile)
Interprete
Interprete
19 / 21
Informatica - M. Falda, A. A. 2007 - 2008
Linea del programma
sorgente
Informatica - M. Falda, A. A. 2007 - 2008
Istruzione/i in linguaggio
macchina
20 / 21
PseudoPseudo-codice
Il problema della fermata
Il codice viene tradotto in un linguaggio
intermedio “universale”
abbastanza lento
portabile immediatamente su calcolatori diversi
1.
2.
3.
Compilatore
Compilatore
Programma sorgente
(codice)
Informatica - M. Falda, A. A. 2007 - 2008
Virtual
Virtual M.
M.
Programma in
pseudo-codice
Istruzione/i in linguaggio
macchina
21 / 21
Sia P(x) un programma che mi dice se il
programma x termina (vero o falso)
Aggiungo alla fine di P un programma Q(y)
che termina solo se y = P(x) è falsa
Se ora pongo x = P ottengo una
contraddizione, infatti
1.
2.
se P termina P + Q non termina
se P non termina P + Q termina
22 / 21
Informatica - M. Falda, A. A. 2007 - 2008