Il 0% ha trovato utile questo documento (0 voti)
0 visualizzazioni147 pagine

Problemi, Algoritmi e Programmazione

Caricato da

fratinelli1
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
0 visualizzazioni147 pagine

Problemi, Algoritmi e Programmazione

Caricato da

fratinelli1
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd

Introduzione alla programmazione

Algoritmi ed esecutori
Esecutore di algoritmi

• Affinchè un computer esegua una qualsiasi attività, è


necessario fornirgli un algoritmo che gli indichi esattamente
cosa fare.
• Con il termine Algoritmo si intende informalmente la
sequenza di passi elementari che precisano in dettaglio cosa
fare per eseguire uno specifico compito per risolvere uno
specifico problema.
 Pertanto, il computer non ha cognizione del problema da
risolvere, ma può solo eseguire correttamente l’algoritmo
fornitogli!
Esempi di algoritmi
• Algoritmo di esecuzione di una istruzione nella CPU:
1. Fetch: preleva un’istruzione
2. Decode: decodifica un’istruzione
3. Execute: esegui l’istruzione

• Algoritmo per trovare il massimo fra tre numeri:


• dati tre numeri A, B e C,
se A > B allora
se A > C il massimo è A altrimenti il massimo è C;
se B >= A allora
se B > C il massimo è B altrimenti il massimo è C.
Esempi di algoritmi
• Gli algoritmi non riguardano solo i numeri. Es:
• Algoritmi matematici:
• operazioni aritmetiche
• calcolo espressioni
• ricerca del massimo di un insieme di numeri
• ordinamento di insiemi di numeri…

• Algoritmi non matematici:


• installazione di un personal computer
• montaggio di una stazione di ricezione satellitare
• scelta del percorso stradale ottimo tra due città
Esempi di algoritmi
• Gli algoritmi non riguardano solo attività tecniche. Es:
• Preparazione di una ricetta:
1. Preparare gli ingredienti con le giuste quantità;
2. Mescolare gli ingredienti;
3. Infornare;
4. Servire a tavola
• Scambio di liquido fra due bicchieri A e B:
1. Prendere un bicchiere vuoto C
2. Versare il liquido di A in C
3. Versare il liquido di B in A
4. Versare il liquido di C in A
Tipologie di algoritmi
1. Algoritmi di decisione
• Problema : esiste un percorso con percorrenza più breve?
• L’algoritmo deve fornire un SI/NO
2. Algorirmi di ricerca
• Problema : trovare un percorso di lunghezza minore di 10 km
• L’algoritmo deve fornire una soluzione
3. Algoritmi di enumerazione
• Problema : Quanti sono i percorsi di lunghezza minore di k?
• L’algoritmo deve fornire un conteggio delle soluzioni
4. Algoritmi di ottimizzazione:
• Problema : trovare un percorso di lunghezza minima
• L’algoritmo deve fornire una soluzione ottima rispetto ad un obiettivo
Problemi computazionali
• Un problema risolvibile mediante un algoritmo si dice
computazionale.
 Ma non tutti i problemi sono computazionali!
Non per tutti i problemi è possibile definire una procedura
computazionale (un algoritmo computabile) che consenta, a
partire dai dati di ingresso, di ottenere un risultato finito.
• Esempio: Elencare tutti i numeri interi positivi
Poiché i numeri interi positivi sono infiniti, non si arriva mai ad un
risultato finito; pertanto, questo non è un algoritmo computabile.

 Il computer è in grado di eseguire solo gli algoritmi


computabili!
Relazione algoritmo-problema
• Un algoritmo risolve 1 problema
• Viceversa, per ogni problema computazionale (ovvero, se
esiste un algoritmo computabile che lo risolve), esistono
infiniti algoritmi che lo risolvono, infatti:
• un algoritmo è descritto da una sequenza di istruzioni
• è sufficiente pensare che possiamo sempre aggiungere
sequenze di istruzioni che non hanno effetto sul risultato e
possiamo farlo in infiniti modi (es. sommare e sottrarre 1 a/da
una variabile, sommare e sottrarre 2, ecc. ecc.)
 Per ogni compito, esistono diversi programmi in grado di
realizzarlo.
Questionario svolto
• Spiegare perchè il computer è un esecutore di algoritmi e
non un risolutore di problemi.
• Il computer è un esecutore di algoritmi, ovvero di procedure di
risoluzione di problemi.
• Gli algoritmi sono identificati e descritti da esseri umani (in
genere un team di progettisti, programmatori e utenti), poi
tradotti nel linguaggio dell’esecutore.
• Il computer quindi non ha cognizione dei problemi, ma è capace
solo di interpretare il programma contenente la descrizione
della procedura di risoluzione (algoritmo).
• Deve inoltre essere in grado di eseguire le azioni dettate
dall’algoritmo.
Questionario svolto
• Perchè è utile usare un computer come esecutore di
algoritmi?
• Almeno 4 aspetti lo fanno preferire a un esecutore umano:
1. Ripetibilità: Il computer è in grado di ri-eseguire l’algoritmo ogni
volta che si vuole
2. Velocità di esecuzione
• Es. si pensi al calcolo strutturale, alla simulazione di processi, al
controllo della traiettoria di un veicolo spaziale, ma anche a tutte
quelle situazioni in cui occorre trattare una enorme quantità di
dati (es. gestione anagrafe fiscale)
3. Affidabilità: basso tasso di errore
4. Economicità: ottimo compromesso costi/benefici
Introduzione alla programmazione

Proprietà degli algoritmi


Definizione di Algoritmo
• Cosa si intende per Algoritmo ?
Originariamente chiamato algorism, il termine "algoritmo" deriva dalla
trascrizione latina del nome del matematico persiano al-Khwarizmi, uno dei
primi autori ad aver fatto riferimento a questo concetto.
La definizione formale di algoritmo afferma che, dato un
problema, l’algoritmo è:
• una sequenza ordinata e finita di istruzioni elementari
(operazioni sui dati e input/output di dati)
• eseguibili senza ambiguità da un esecutore
• al fine di risolvere il problema in un tempo finito
• conducendo a un risultato ben determinato
Input e Output

• Considerando un algoritmo di risoluzione del problema, dati e


risultati della formulazione di un problema diventano
• Input: un algoritmo può avere zero o più input, i quali sono
quantità che vengono date in pasto all'algoritmo prima
che inizi, oppure dinamicamente mentre è in esecuzione.
Questi input sono presi da uno specifico insieme di
oggetti.
• Output: un algoritmo può avere uno o più output, si tratta
di quantità che hanno una relazione specifica con gli input.
Input e Output

• Algoritmo: Risoluzione equazione di secondo grado


• Input: tre numeri (i coefficienti)
• Output: le due radici se reali, stampa di un messaggio
opportuno altrimenti

• Algoritmo: Trovare il massimo fra tre numeri


• Input: tre numeri
• Output: il valore massimo
Input e Output
• Algoritmo : Ricerca del numero di un utente in un elenco
telefonico
• Input: un insieme ordinato di coppie (nome, numero di telefono) e un
nome x
• Output: il numero telefonico corrispondente all'utente di nome x, se
presente nell'insieme; nulla altrimenti
• Algoritmo: Ricerca del cammino più breve tra due punti su
una rete stradale
• Input: una rete stradale (rappresentata come un insieme di piazze,
strade che uniscono due piazze, tempi di percorrenza di ciascuna
strada) e due piazze x e y
• Output: la sequenza di strade che portano da x a y con tempo di
percorrenza minimo
Proprietà degli algoritmi
• Oltre alla proprietà di eseguibilità delle istruzioni
dell’algoritmo, le proprietà fondamentali degli
algoritmi sono:
1. ogni passo dell'algoritmo deve essere non ambiguo
• esempio: «cuocere a fiamma moderata»  moderata?
• durante l’esecuzione, le informazioni devono essere sufficienti
per stabilire univocamente e completamente le azioni da
svolgere
2. ogni passo dell'algoritmo deve essere definito
precisamente
• per qualunque dato di ingresso, a ogni passo della computazione,
esiste al più un passo successivo.
Proprietà degli algoritmi
3. l’algoritmo deve essere corretto
• l'esecuzione dell'algoritmo porta realmente alla soluzione
del problema
4. l’algoritmo deve terminare in un tempo finito
• la sequenza di istruzioni deve essere finita, cioè deve avere
una conclusione, giungendo ad un risultato
5. l’algoritmo deve risolvere una classe di problemi,
indipendentemente dagli specifici dati su cui opera.
• la ricetta di cucina generalizza certe istruzioni: le quantità,
ad esempio, sono indicate per un certo numero di persone
e ma vanno rapportate al numero di persone desiderato.
Classe di problemi

• Una classe di problemi è l’insieme delle istanze del


Problema:
• Problema P: dato un numero naturale N, calcolare la
somma dei primi N numeri naturali
• Istanza di P: risolvere P per N = 12 (ovvero calcolare la
somma dei primi 12 naturali)

 L’algoritmo deve risolvere il Problema con qualunque N, ovvero


deve risolvere l'insieme di tutte le sue possibili istanze.
Esempio
Esempio 2
Questionario svolto

• Quali sono le proprietà fondamentali di un algoritmo?


1. Un algoritmo deve essere finito
2. Un algoritmo deve essere deterministico
3. Un algoritmo deve essere non ambiguo
4. Un algoritmo deve essere generale
Questionario svolto
• Definire la relazione tra Problema e Istanza.
• Il Problema rappresenta una classe di domande omogenee alle
quali è possibile dare risposta mediante una procedura
algoritmica. L’algoritmo deve essere in grado di risolvere il
Problema, indipendentemente dagli specifici dati su cui opera.
• L’ Istanza del problema è ogni specifica domanda della classe
ed è caratterizzata da uno specifico valore dei dati in ingresso.
• La soluzione di un’istanza di un problema è la risposta alla
specifica domanda che l’istanza rappresenta.
Questionario svolto
• Definire la relazione tra variabili del Problema, dati e
risultati.
• Le variabili di ingresso sono termini variabili che caratterizzano
la formulazione di un Problema, quindi permettono di generare
le istanze.
• Le variabili di uscita sono termini variabili che caratterizzano le
soluzioni attese (delle istanze) di un problema.
• I dati sono i valori che possono assumere le variabili di ingresso.
• I risultati sono i valori che possono assumere le variabili di
uscita.
Introduzione alla programmazione

Diagrammi di flusso
Algoritmo e rappresentazione

• E’ importante rilevare la distinzione tra l’algoritmo e la sua


rappresentazione.
• Esempio: distinzione tra la storia e il libro che la racconta
• Se il libro che racconta la storia è tradotto in un’altra lingua o
ripubblicato in un formato digitale, ciò che cambia è
semplicemente la rappresentazione della storia, mentre la storia
rimane la stessa.

 Un algoritmo è astratto e distinto dalla sua


rappresentazione.
• Un singolo algoritmo può essere rappresentato in molti modi
Algoritmo e rappresentazione
• Esempio: Algoritmo per la conversione da gradi Celsius a
gradi Fahrenheit
• Esso è tradizionalmente rappresentato con la seguente formula
algebrica:
Algoritmo e rappresentazione
• Esempio: Algoritmo per la conversione da gradi Celsius a
gradi Fahrenheit
• Potrebbe essere rappresentato anche dalle seguenti tre istruzioni:
1. Moltiplica la lettura della temperatura in gradi Celsius per 9
2. Dividi il prodotto per 5
3. Aggiungi 32 al risultato
• Poiché moltiplicazioni e divisioni possono essere realizzate mediante
circuiti elettronici, l’algoritmo potrebbe essere rappresentato anche
dal circuito elettronico necessario.

 In ogni caso l’algoritmo è sempre lo stesso, differiscono solo


le sue rappresentazioni.
Algoritmo e rappresentazione

• La rappresentazione di un algoritmo è importante quando


si vuole comunicare l’algoritmo ad altri.
• Se l’algoritmo di conversione Celsius-Fahrenheit va comunicato ad
un meteorologo, allora è sufficiente l’istruzione:
1. Converti la temperatura da gradi Celsius a gradi Fahrenheit
• Se l’algoritmo di conversione Celsius-Fahrenheit va comunicato ad
uno studente, allora sono necessarie le tre istruzioni più
dettagliate.
 Il livello di dettaglio della rappresentazione di un algoritmo è
fondamentale!
Algoritmo e rappresentazione
• La rappresentazione di un algoritmo richiede l’utilizzo di un
linguaggio per poter essere comunicato:
1. Linguaggio naturale: nel caso di persone, il linguaggio naturale è quello
tradizionale (es: inglese, russo, giapponese…)
2. Linguaggio ad immagini: dopo il linguaggio naturale, è quello più utilizzato
dalle persone, soprattutto per manuali illustrativi di istruzioni (es: montaggio
di una scrivania, realizzazione di un origami…)
3. Diagrammi di flusso: è un linguaggio grafico, costituito da blocchi
strutturati in sequenza o ciclo
4. Pseudo-codice: è un linguaggio a metà strada tra il linguaggio naturale e i
linguaggi di programmazione
5. Linguaggio di programmazione: è il linguaggio comprensibile al
programmatore
6. Linguaggio macchina: è il linguaggio comprensibile al computer
Linguaggio naturale
• Algoritmo: Calcolare la soluzione di ax + b = 0
1. leggere i valori di a e di b
2. calcolare -b
3. dividere -b per a e assegnare il risultato ad x
4. scrivere x
• Algoritmo: Calcolare il minimo comune multiplo di due
numeri naturali diversi da zero:
1. scomporre i numeri in fattori primi
2. scegliere i fattori comuni
3. scegliere quelli con esponente più piccolo
4. moltiplicare i numeri trovati tra loro
Linguaggio ad immagini

• Algoritmo: montaggio di una scrivania


Diagrammi di flusso
• Algoritmo : preparazione • Algoritmo : somma tra due
di una camomilla numeri letti in input
Pseudocodice
• Algoritmo: somma tra due numeri letti in input
Linguaggio di programmazione
• Algoritmo: somma tra due
numeri letti in input
Linguaggio macchina
• Algoritmo: somma tra due numeri contenuti in due
locazioni di memoria e risultato in un’altra locazione di
memoria
Flow chart
• Cosa si intende per Diagramma di flusso?
In inglese detto flow chart, è una notazione per la rappresentazione di
algoritmi che si basa sulla collocazione di blocchi, che, collegati tra
loro attraverso linee orientate, visualizzano graficamente il flusso
delle istruzioni
• Ogni blocco ha:
• una freccia di ingresso
• una o più frecce di uscita che lo connettono ad altri blocchi
• un’istruzione in esso contenuta
• una forma specifica in base al tipo di istruzione del blocco
Blocchi di un flow chart
Istruzioni di un flow chart

• Le istruzioni contenute nei blocchi possono essere:


• Istruzioni di I/O
• lettura dati, scrittura risultati, istruzioni di
assegnazione
• Esecuzione di calcoli o valutazione di espressioni
• Strutture di controllo = modificano il flusso sequenziale di
esecuzione delle operazioni
Istruzioni di un flow chart
• Istruzioni di I/O
• Lettura di dati in input
• Scrittura dei risultati in output

• Istruzioni di assegnazione
di un valore ad una variabile:
• Una variabile è simile ad un contenitore in cui possiamo
memorizzare o reperire dati utilizzati durante il calcolo
• Una variabile è identificata da un’etichetta, ovvero un
identificatore simbolico (nell’esempio, P)
Istruzioni di un flow chart

• Esecuzione di calcoli

• Valutazione di espressioni
Questionario svolto
• Cosa distingue un algoritmo dal suo diagramma di flusso?
• Un algoritmo è astratto e distinto dalla sua rappresentazione.
• Infatti, uno stesso algoritmo può essere rappresentato
mediante non solo diagramma di flusso, ma anche linguaggio
naturale, linguaggio ad immagini, pseudocodice, linguaggio di
programmazione, linguaggio macchina.
• La scelta della rappresentazione dipende dell’esecutore
dell’algoritmo (essere umano, utente esperto, utente non
esperto, computer…) e dal livello di dettaglio.
Esercizio svolto

• Disegnare il diagramma di flusso per


il seguente Algoritmo = calcolare la
somma di due numeri
Esercizio svolto

• Disegnare il diagramma di flusso per il


seguente Algoritmo = calcolare la
divisione tra un numeratore N e
un denominatore D
• Stampare un messaggio di
errore se il denominatore è 0
Esercizio svolto

• Disegnare il diagramma di flusso del


seguente Algoritmo = verificare il
numero
inserito dall’utente
finchè non è pari a 7
Questionario da svolgere
• Scegliere l’affermazione più corretta in merito al concetto di
Algoritmo.
1. Un algoritmo corrisponde univocamente alla sua rappresentazione.
2. Infatti, un algoritmo può essere rappresentato solo mediante i
diagrammi di flusso.
3. La scelta della rappresentazione di un algoritmo dipende dal tipo di
computer che dovrà eseguirlo.
4. La scelta della rappresentazione di un algoritmo dipende
dell’esecutore dell’algoritmo (sia esso umano o computer) e dal
livello di dettaglio.
Esercizio da svolgere
• Disegnare il diagramma di flusso di un algoritmo che
calcoli e stampi la soluzione dell’equazione di primo
grado ax + b=0
L’algoritmo quindi deve:
1. Leggere a
2. Leggere b
3. Assegnare a temp il valore di -b
4. Assegnare a x il valore di temp / a
5. Stampare x
Esercizio da svolgere

• Disegnare il diagramma di flusso di un algoritmo


che calcoli la divisione di due numeri.
• Stampare eventuali messaggi di errore.
Introduzione alla programmazione

Diagrammi strutturati
Strutture di controllo
• Un diagramma strutturato permette di controllare il
flusso di istruzioni mediante specifiche strutture:
1. Sequenza:
• Le istruzioni devono essere eseguite nell’ordine in cui
sono presentate
2. Condizione:
• Le istruzioni da eseguire sono determinate dalla
valutazione di una data condizione
3. Iterazione:
• Le istruzioni devono essere eseguite ripetutamente fino
a che non si verifica una data condizione
Strutture di controllo
• Esempio: strutture di controllo presenti nell’algoritmo di
acquisto di una bevanda da una macchina automatica
– Sequenza:
• Seleziona bevanda
• Inserisci credito
• ...
– Condizione:
• SE selezioni extra zucchero
• ALLORA aumenta lo zucchero da erogare
– Iterazione:
• RIPETI inserisci monete
• FINO al raggiungimento del credito necessario
Struttura sequenziale
• In rosso viene mostrato l'unico punto d'ingresso, in verde l'unico
punto d'uscita.
Struttura condizionale singola
• Il blocco di istruzioni viene eseguito
SOLO se la condizione è vera,
altrimenti non viene eseguito
Struttura condizionale doppia
• Viene eseguito uno specifico blocco
se la condizione è vera, un altro
blocco se la condizione è falsa
Struttura iterativa
• Il blocco di istruzioni viene eseguito
ripetutamente se la condizione è vera
• Il blocco di istruzioni non viene eseguito
nemmeno una volta se la condizione è falsa
Struttura iterativa 2
• La struttura iterativa può specificare
la condizione anche dopo una prima
esecuzione del blocco di istruzioni.
• Il blocco di istruzioni viene eseguito
ripetutamente se la condizione è vera
• Il blocco di istruzioni viene
eseguito almeno una volta
se la condizione è falsa
Componibilità
• Le strutture di controllo possono anche essere composte tra
loro o annidate l’una dentro l’altra.
Esercizio svolto
• Usando una struttura
condizionale singola, disegnare
un diagramma di flusso per un
algoritmo che legga due numeri e
stampi un messaggio se il primo
numero è maggiore del secondo.
Esercizio svolto
• Usando una struttura
condizionale doppia,
disegnare un diagramma
di flusso per un algoritmo
che legga due numeri, li
confronti e stampi un
messaggio con scritto
quale numero è il
maggiore.
Esercizio svolto
• Usando una struttura
iterativa, disegnare un
diagramma di flusso per un
algoritmo che legga un
numero n e stampi tutti i
numeri pari minori o uguali a
n.
Esercizio svolto
• Usando una struttura
iterativa, disegnare un
diagramma di flusso per un
algoritmo che legga un
numero n e calcoli il
fattoriale.
Esercizio svolto
• Sfruttando la
componibilità delle
strutture di controllo,
disegnare un flow chart per
un algoritmo che legga due
numeri, li confronti e dica
se sono uguali oppure se
un numero è maggiore
dell’altro.
Esercizio svolto
• Disegnare il flow chart per l’algoritmo che calcola la media di
un certo numero N di numeri inseriti dall’utente (massimo 10
numeri interi).

1. Richiedere quanti numeri inserire (N)


2. Se > 10, visualizzare “massimo 10” (torna a 1)
3. Inserire la sequenza di numeri interi e, per ogni numero inserito, sommare
ai precedenti
4. Calcolare la media = somma / numeri totali
5. Visualizzare il risultato
Esercizio svolto
Esercizio da svolgere
• Usando una struttura condizionale singola, disegnare un
diagramma di flusso per un algoritmo che legga due numeri e
stampi un messaggio se il primo numero è minore del
secondo.
Esercizio da svolgere
• Usando una struttura condizionale doppia, disegnare un
diagramma di flusso per un algoritmo che legga due numeri,
li confronti e stampi un messaggio con scritto quale numero
è il minore.
Esercizio da svolgere
• Usando una struttura iterativa, disegnare un diagramma di
flusso per un algoritmo che legga un numero n e stampi
tutti i numeri dispari minori o uguali a n.
Esercizio da svolgere
• Sfruttando la componibilità delle strutture di controllo,
disegnare un flow chart per un algoritmo che legga due
numeri, li confronti e dica se sono uguali oppure se un
numero è minore dell’altro.
Introduzione alla programmazione

Tecniche per flow chart


Inizializzazione
 All’inizio di un algoritmo una variabile non ha alcun valore!
• Non ha quindi senso utilizzarla in una espressione
• Essa deve essere inizializzata:
• esplicitamente mediante un’istruzione di assegnamento
• mediante una operazione di lettura
Tecnica top-down
• Quando il problema è più articolato, non è immediato trovare
subito i passi elementari e la sua soluzione. Una tecnica che
semplifica questo compito è la tecnica per raffinamenti
successivi
Il problema viene suddiviso in sottoproblemi!
• Tale procedimento di scomposizione è detto tecnica top-
down:
• Si parte dalla visione globale del problema (top=alto) e la si
scompone in sottoproblemi autonomi, che a loro volta sono
composti da istruzioni elementari (down=basso).
• Risolvendo i sottoproblemi si giunge alla soluzione del
problema di partenza
Tecnica top-down
• Problema: Calcolo delle radici reali di un’equazione di 2°
grado.
• Soluzione: Data un’equazione di 2° grado
a x2 + b x + c = 0
la determinazione delle radici reali passa attraverso il calcolo
del discriminante Δ = b2 - 4ac .
Se Δ ≥ 0 le radici reali sono
x1 = (- b + sqrt(Δ))/ 2a
x2 = (- b - sqrt(Δ))/ 2a.
Calcolo delle radici

• Scomposizione 1
Calcolo delle radici

• Scomposizione 2
Calcolo delle radici
Calcolo delle radici

• Applicazione della Regola 3:


Calcolo delle radici

• Applicazione della Regola 2:


Verifica se strutturato
• Un diagramma di flusso è detto strutturato se contiene solo
le strutture di controllo
• sequenziali,
• condizionali (singole e doppie),
• iterative (condizione pre-blocco e condizione post-blocco)

 Qualunque diagramma di flusso è sempre trasformabile in


un diagramma di flusso strutturato equivalente a quello dato
[Teorema di Böhm - Jacopini]
Verifica se strutturato

• Nelle strutture condizionali singole, il blocco di istruzioni


va eseguito in seguito alla condizione VERA, non falsa
Verifica se strutturato

• Nelle strutture iterative con


condizione, il blocco di istruzioni
va ripetuto in seguito alla
condizione VERA, non falsa
• se abbiamo un ciclo che viene
eseguito quando la condizione è
falsa, allora occorre rappresentare la
condizione negata
Verifica se strutturato

• Esempio di
diagramma non
strutturato
Programmazione strutturata
• La programmazione strutturata nasce in seguito alla critica della
struttura di controllo del salto incondizionato (istruzione goto, "vai
a"), che rappresentava, negli anni 60, lo strumento fondamentale
per la definizione di algoritmi.
• Il teorema di Böhm-Jacopini può anche essere espresso dicendo
che qualsiasi programma scritto usando il goto poteva essere
riscritto senza usare il goto facendo uso soltanto dei tre tipi di
strutture di controllo: sequenza, condizione e iterazione.
• I linguaggi di programmazione all'inizio degli anni 70 recepirono le
idee di Böhm e Jacopini, mettendo a disposizione parole chiave per
le istruzioni di controllo
• Il linguaggio C è un linguaggio strutturato
Esercizio svolto
• Dato il seguente
diagramma di
flusso, dire se è
strutturato e, in
caso negativo,
come potrebbe
essere ristrutturato.
Esercizio svolto
• Il diagramma contiene le sole
strutture di sequenza e iterazione.
• Tuttavia, il ciclo iterativo presenta
una precondizione e produce
l’esecuzione del blocco di istruzioni
per il valore FALSO della
condizione.
• Dovrebbe essere ri-strutturato con
la condizione i ≠ 0 in modo da
eseguire il blocco per il valore VERO
della condizione.
Esercizio da svolgere
• Dato il seguente
diagramma di flusso,
dire se è strutturato e,
in caso negativo,
come potrebbe
essere ristrutturato.
Esercizio da svolgere
• Disegnare il flow chart strutturato di un algoritmo
che, letto un anno, decida se questo è o meno
bisestile.
• Un anno è bisestile (ha 366 giorni) se è divisibile per
quattro (come il 1980) e non è divisibile per 100 (ad es. il
1900 non è bisestile).Fanno eccezione gli anni divisibili per
400, che sono bisestili (ad es. il 2000 è bisestile).
• Questa regola non si applica prima del 1582, anno di
introduzione del calendario gregoriano.
Tecnica del contatore

• Una struttura iterativa permette di ripetere ciclicamente


un blocco di istruzioni.
• Quando è noto a priori il numero di volte N che il ciclo
viene eseguito,
• si usa una variabile detta contatore del ciclo
• il contatore viene incrementato fino a N (o decrementato
da N a zero) per ogni esecuzione del ciclo
• il ciclo si interrompe quando il contatore è N (o è 0)
Esercizio svolto
• Una classe di 10 studenti sostiene un esame. Le votazioni
possono assumere valori da 1 a 100.
• Scrivere il flow chart di un algoritmo per il calcolo della media
dei voti della classe nell’esame considerato

• L’algoritmo dovrà:
• prendere in input ciascun voto
• eseguire il calcolo della media
• visualizzare il risultato
Esercizio svolto
• Strategia di soluzione
• È noto il numero di studenti, quindi il numero di voti da prendere in
input:
• È possibile usare una iterazione controllata da un contatore per
prendere in input i voti
• Variabili : è necessario usare
• Una variabile contatore che specifichi il numero di volte che
l’iterazione deve essere eseguita (è usata per contare il numero di voti
immessi)
• Una variabile totale per accumulare la somma della serie di valori
Esercizio svolto
Esercizio svolto
• Scrivere il flow chart di un algoritmo per il calcolo della media
dei voti di una classe. L’algoritmo elaborerà un numero
arbitrario di votazioni ogni volta che sarà eseguito.

• L’algoritmo dovrà:
• prendere in input ciascun voto
• eseguire il calcolo della media
• visualizzare il risultato
Esercizio svolto
• Strategia di soluzione : Non è data alcuna indicazione sul numero delle
votazioni:
• In che modo il programma deve terminare l’immissione delle
votazioni?
• In che modo il programma può sapere quando calcolare e visualizzare
la media dei voti?

 Usare un valore speciale fittizio, o valore flag (bandiera)


Le iterazioni controllate da un valore flag sono indefinite il numero
delle iterazioni non è noto prima che inizi l’esecuzione del programma
Esercizio svolto
• Variabili :
• Una variabile usata per indicare la fine dell’immissione dei dati (flag):
l’utente immetterà un valore sentinella per indicare che l’ultima
votazione è stata immessa
• Il valore di sentinella dovrà essere scelto in modo che non possa essere
confuso con un valore di input accettabile: ad esempio si può usare il valore -
1 poiché le valutazioni degli esami sono generalmente numeri interi non
negativi.
• Una variabile che contenga il totale progressivo dei numeri
• Un contatore del numero di voti elaborati
• Una variabile per il valore di ogni valutazione immessa nell’input
• Una variabile per conservare la media calcolata
Esercizio svolto
• Iterazione:
• È necessario fare uso di una struttura di iterazione che prenda in input
ogni votazione.
• Poiché non è noto in anticipo il numero delle votazioni (e quindi delle
iterazioni) si usa una iterazione controllata da un valore sentinella.
• L’utente immetterà una per volta tutte le votazioni legittime.
• Terminata l’immissione delle votazioni legittime l’utente immetterà
il valore sentinella
• Per ognuna delle votazioni immesse il programma controllerà
l’immissione del valore sentinella
• Il programma terminerà il ciclo quando verrà immesso il valore
sentinella
Esercizio svolto
Dal problema alla soluzione
La programmazione
• La risoluzione di un problema tramite un computer è un
procedimento che non consiste solo nello scrivere un programma
mediante un linguaggio di programmazione, ma comprende le
seguenti fasi:
1. Definizione del problema
2. Algoritmo per la soluzione del problema
3. Codifica del programma
4. Correzione del programma
5. Validazione del programma
6. Manutenzione del programma
Problema
• Definizione del problema:
1. Definizione dei dati in ingresso
• Quale tipo di dati?  variabili del programma
• Quale range valido per ogni variabile?
2. Definizione dei dati in uscita
• Quale tipo di dati?  risultato atteso dal programma
• Quale range valido per ogni variabile?
3. Risoluzione delle ambiguità
4. Scomposizione in problemi più semplici
Problema
Per poter definire il risultato che ci attendiamo, è necessario stabilire l’obiettivo del
problema.
Ad esempio, per quanto riguarda «esame di Fondamenti di informatica», quale risultato è
atteso?
1. Il risultato atteso è: il voto finale di ogni studente.
2. Il risultato atteso è: quali studenti hanno superato l’esame
3. Il risultato atteso è: quanti studenti hanno superato l’esame
Per ogni obiettivo cambia il risultato previsto. Stabilito il risultato, è possibile definire i
dati necessari e soprattutto le restrizioni sui dati.
Ad esempio, per definire il voto finale è necessario conoscere:
1. il voto della prova scritta, il voto della prova pratica e il voto dell’eventuale
prova orale.
2. Vincolo: ogni voto è compreso tra 1 e 30.
Algoritmo
• Algoritmo per la soluzione del problema
• Specificare una sequenza di passi elementari, cioè operazioni sui dati
che permettono di ottenere il risultato atteso, mediante:
• Descrizione in linguaggio naturale
• Pseudo-codice = linguaggio di programmazione fittizio per la
rappresentazione di algoritmi
• Diagramma di flusso (flow chart) = diagramma a blocchi per
rappresentare graficamente la sequenza delle operazioni da compiere
Programma
• Codifica del programma
1. Traduzione dell’algoritmo in istruzioni scritte in un
linguaggio di programmazione (compilato o
interpretato)  programma sorgente
2. Inserimento di commenti esplicativi
• per facilitare la comprensione del programma dopo molto tempo dalla
stesura o per terze persone

3. Traduzione con compilatore/interprete


4. Esecuzione del programma
Correzione
• Correzione del programma
Debugging = individuazione della parte di software nella
quale si annida l'errore
• In caso di programma compilato, il debugging richiede
l’inserimento di una serie di istruzioni in più (istruzioni di debug) che,
durante l’esecuzione, stampano avvisi a video o su file (file di log)
relativi alle istruzioni che il programma sta eseguendo, al fine di
individuare quale frammento genera il bug
• In caso di programma interpretato, il debugging più semplicemente
controlla lo stato della CPU e il valore delle variabili mentre una
istruzione alla volta viene interpretata ed eseguita (step-by-step)
Correzione
• Correzione del programma
1. Correzione degli errori sintattici:
• Istruzioni non valide o non ben formate nel linguaggio di
programmazione
2. Correzione degli errori semantici:
• Comportamento non aderente alle aspettative del
programmatore
Validazione
• Validazione
1. Test su tutte le funzionalità del programma,
sviluppate per soddisfare gli obiettivi iniziali del
problema
2. Test su valori estremi (es: inserire come dati in
ingresso tutte variabili nulle oppure un solo numero
inserito…)
Manutenzione

• Manutenzione
1. Manutenzione correttiva
• «Manutenzione a guasto», prevede un intervento di riparazione,
sostituzione o revisione, solo a guasto avvenuto. L'azione manutentiva è
quindi subordinata all'attesa del manifestarsi del guasto.
• Solo a guasto avvenuto viene preparato ed eseguito un intervento di
"ripristino" che riporta la prestazione del sistema al livello che aveva
prima del manifestarsi del guasto in un suo componente.
Manutenzione
• Manutenzione
2. Manutenzione adattativa
• Manutenzione che prevede un intervento di modifica legata all’ambiente
in cui il programma viene eseguito

• nuove versioni del sistema operativo


• aggiornamento del software di base
• nuove interfacce
• nuovi software con cui inter-operare
Manutenzione
• Manutenzione
3. Manutenzione evolutiva
• Manutenzione che prevede l’implementazione di nuove funzionalità del
programma inizialmente non individuate.

• a seguito di nuove richieste dell'utente


• per migliorarne l'efficienza
• a seguito di variazioni normative
• a seguito di variazioni dei processi informativi
• Qual è il processo
Questionario svolto
che porta alla risoluzione di un problema
mediante computer?
1. Classificazione del Problema (è computazionale?)
2. Se sì, progettazione di un Algoritmo risolutivo computabile
3. Programmazione: traduzione dell’algoritmo mediante un
linguaggio di programmazione  programma sorgente
4. Compilazione del programma  programma oggetto
5. Esecuzione del programma oggetto
6. Acquisizione del Risultato
Questionario
• Qual è il processo svolto
di sviluppo di un programma?
• La fase di Programmazione (punto 3 della slide precedente) consiste in:
1. Definizione dei dati di ingresso e uscita del Problema, eventuale
scomposizione in sotto-problemi più semplici
2. Specifica della sequenza di passi dell’Algoritmo mediante descrizione in
linguaggio naturale, pseudocodice o flow chart
3. Codifica dell’algoritmo in un programma corredato di commenti e
istruzioni supplementari utili in fase di correzione
4. Debugging del programma al fine di trovare e correggere gli errori
sintattici e semantici
5. Validazione della coerenza del programma con i requisiti iniziali
6. Manutenzione correttiva, adattativa, evolutiva
Questionario svolto
• A cosa servono i commenti in un programma?
• Le righe di commento, spesso inserite all’interno dei
programmi (in C/C++ precedute da due sbarrette //), non hanno
alcun effetto sul comportamento del programma e vengono
ignorate dal compilatore.
• Esse possono essere usate dal programmatore per includere nel
codice del programma alcune brevi spiegazioni ed osservazioni
relative a ciò che fanno le istruzioni adiacenti.
• Migliorano la leggibilità e comprensione del codice, per cui
sono utili in fase di debug e manutenzione.
Questionario svolto

• Cosa si intende con Debugging?


• Il debugging (o semplicemente debug) indica l'attività che consiste
nell'individuazione delle istruzioni che causano errori (bug) rilevati a
seguito della compilazione ed esecuzione del programma.
• Attività indispensabile, per la messa a punto del programma
• Attività difficile, per la complessità della struttura del programma
• Attività delicata, per il pericolo di introdurre nuovi errori nel
tentativo di correggere quelli per cui si è svolta l'attività di debug.
Questionario svolto
• Cosa si intende per Manutenzione del software?
• Con Manutenzione del software solitamente si intende
un’attività correttiva, adattativa ed evolutiva che avviene dopo
il rilascio del prodotto finale nell’ambiente di destinazione.
• Con il termine rilascio si intende la pubblicazione che avviene una
volta che lo sviluppo del software è stato completato, verificato e
ritenuto pronto per l'utilizzo da parte degli utenti, coerentemente
con il progetto originale.
• Con il termine ambiente di destinazione si intende un luogo
diverso dalle aree dedicate allo sviluppo e ai test del software in
fase di implementazione.
Questionario svolto
• Qual è la differenza tra Manutenzione correttiva, adattativa ed
evolutiva?
• La manutenzione correttiva :
• elimina gli errori presenti sin dall'inizio
• elimina gli errori introdotti da precedenti interventi di manutenzione
• La manutenzione adattativa (o adattiva):
• modifiche a seguito di cambiamenti nell'ambiente
• cambiamenti nell’Hardware, nel Sistema operativo, ecc.
• La manutenzione evolutiva (o perfettiva):
• modifiche per migliorare la qualità del software
• introduzione di nuove funzionalità
• miglioramento delle funzionalità esistenti
Questionario da svolgere
• Qual è il processo che porta alla risoluzione di un problema
mediante computer?
1. Classificazione del Problema, Progettazione dell’Algoritmo,
Programmazione, Acquisizione del Risultato
2. Classificazione del Problema, Programmazione, Esecuzione,
Acquisizione del Risultato
3. Classificazione del Problema, Programmazione, Compilazione,
Esecuzione, Acquisizione del Risultato
4. Classificazione del Problema, Progettazione dell’Algoritmo,
Programmazione, Compilazione, Esecuzione, Acquisizione del
Risultato
Questionario da svolgere
• Qual è il processo di sviluppo di un programma?
1. Definizione dei passi del problema, Codifica in programma,
Test.
2. Definizione dei dati del problema, Specifica dei passi
dell’algoritmo, Codifica in programma, Manutenzione.
3. Definizione dei dati del problema, Specifica dei passi
dell’algoritmo, Codifica in programma, Manutenzione,
Debugging, Validazione.
4. Definizione dei dati del problema, Specifica dei passi
dell’algoritmo, Codifica in programma, Debugging,
Validazione, Manutenzione.
Questionario da svolgere
• A cosa servono i commenti in un programma?
1. Hanno effetto sul comportamento del programma e
vengono tradotti in fase di compilazione.
2. Sono usati per includere nel codice del programma
alcune istruzioni eseguite solo in fase di debug.
3. Migliorano la leggibilità e comprensione del codice, per
cui sono utili in fase di debug e manutenzione.
4. Peggiorano la leggibilità e comprensione del codice, in
quanto aumentano la lunghezza del programma.
Questionario da svolgere
• Cosa si intende con Debugging?
1. E’ l'attività che consiste nell’inserimento di commenti nel
programma per migliorarne la leggibilità e la comprensione del
codice.
2. E’ l'attività che avviene dopo il rilascio del programma nell’ambiente
di destinazione al fine di migliorare il programma.
3. E’ l'attività che consiste nella traduzione dell’algoritmo in un
programma mediante un linguaggio di programmazione.
4. E’ l'attività che consiste nell'individuazione delle istruzioni che
causano bug durante l’esecuzione del programma.
Questionario da svolgere
• Scegliere l’affermazione più corretta in merito alla
Manutenzione del software.
1. La manutenzione correttiva interviene con modifiche a seguito di
cambiamenti nell'ambiente, come Hardware, Sistema operativo, ecc.
2. La manutenzione adattativa interviene con modifiche per migliorare la
qualità del software, per introdurre nuove funzionalità, per migliorare le
funzionalità esistenti.
3. La manutenzione evolutiva elimina gli errori presenti sin dall'inizio o
introdotti da precedenti interventi di manutenzione.
4. La manutenzione evolutiva interviene con modifiche per migliorare la
qualità del software, per introdurre nuove funzionalità, per migliorare le
funzionalità esistenti.
Linguaggi di programmazione
• I computer sono stati introdotti con lo scopo di risolvere
problemi in modo autonomo:
• non sono in grado di risolverli se non sono stati
precedentemente programmati per farlo
• è necessario realizzare un programma in grado di istruire
il computer a risolvere il problema
• Un programma è quindi una sequenza di istruzioni con
riferimento alle azioni che il computer dovrà svolgere per la
risoluzione di un problema.
• Queste istruzioni sono scritte utilizzando un linguaggio di
programmazione
Linguaggi di programmazione
• Cosa si intende per Linguaggio di programmazione?
E’ un linguaggio formale utilizzato per programmare un
computer mediante la scrittura di un programma ad opera di un
programmatore.
Come ogni linguaggio formale, esso ha un proprio:
• Lessico = l’insieme di regole formali per la scrittura di parole
• Sintassi = l’insieme di regole formali per la scrittura di frasi
• Semantica = l’insieme dei significati da attribuire alle frasi
 Una frase può essere sintatticamente corretta e tuttavia non
avere significato!
Linguaggi di basso livello
• La programmazione dei primi computer veniva fatta in uno
short code, da cui poi si è evoluto l’Assembly, che
costituisce una traduzione mnemonica del linguaggio
binario.
• Il linguaggio Assembly riflette il funzionamento fisico del
computer più che la natura del problema da risolvere 
Linguaggio di basso livello
• Necessita di una conoscenza dettagliata delle caratteristiche
della CPU (set istruzioni, registri, bus dati..)
• Qualunque istruzione e relativi operandi sono rappresentati da
codici simbolici o numeri binari
Linguaggi di basso livello
• La scrittura di programmi di interesse pratico in linguaggio
Assembly è un problema non banale:
1. l’unica struttura dati, oltre al bit e al byte, è il numero intero
positivo o negativo
• per manipolare dati come numeri con virgola o stringhe di
caratteri, il programmatore deve trovare un modo per
rappresentarli
2. solo due meccanismi per guidare il flusso di istruzioni:
sequenza e salto
• l’esecuzione di istruzioni alternative non è esplicitabile
3. il programma è monolitico
• il problema non viene scomposto in sottoproblemi, e quindi in
sottoprogrammi
Linguaggi di basso livello
• Vantaggi:
• permettono un diretto accesso alle risorse della macchina
• estremamente efficienti sia in termini di risorse utilizzate che di
velocità di elaborazione.
• Svantaggi:
• i programmi sono complessi da scrivere, in quanto questi linguaggi
hanno poca espressività in termini di strutture dati manipolabili
direttamente e meccanismi per il flusso di istruzioni
• i programmi sono difficili da leggere, in quanto risultano molto
prolissi
• i programmi sono difficili da correggere, in quanto è difficile
effettuare i controlli sugli errori
• semplici procedure implicano la scrittura di moltissime istruzioni
Linguaggi di alto livello
• La maggior parte dei linguaggi di programmazione successivi
all’Assembly cercarono di astrarsi dal livello macchina, dando
la possibilità di rappresentare dati e codificare istruzioni più
complesse in maniera più vicina alla maniera (umana) di
rappresentare i termini dei problemi per i quali ci si prefigge di
scrivere programmi
 Linguaggi di alto livello
• Le istruzioni non corrispondono più in maniera biunivoca alle
istruzioni del linguaggio macchina
• Mettono a disposizione del programmatore costrutti più
astratti e complessi per poter manipolare dati e guidare
istruzioni
Linguaggi di alto livello
• Vantaggi:
• il programmatore può astrarre dai dettagli legati
all’hardware sottostante ed esprimere in modo simbolico
le operazioni da effettuare
• i programmi risultano più facili da scrivere e comprendere,
ma comunque sono eseguibili dal computer
 non direttamente, serve una traduzione
• i programmi sono portabili su altri computer, ovvero
eseguibili da altre CPU (a patto di disporre di traduttori
specifici per tali processori).
Linguaggi di alto livello
• Svantaggi:
• richiedono un traduttore in grado di tradurre le istruzioni
dal linguaggio di alto livello al linguaggio macchina prima
dell’esecuzione;
• come l’Assemblatore per il linguaggio Assembly ma con
una differenza:
• ogni singola istruzione del linguaggio Assembly viene
tradotta in una singola istruzione in linguaggio macchina
• ogni singola istruzione di un linguaggio di alto livello
corrisponde a molte istruzioni in linguaggio macchina
Questionario svolto
• Cosa si intende per Linguaggio di programmazione?
• Un linguaggio di programmazione è un linguaggio
«artificiale» per descrivere procedure di risoluzione di
problemi in una forma che sia comprensibile ad un
computer.
• Essendo un linguaggio, esso ha un proprio lessico ed è
basato su regole sintattiche e semantiche.
• In base alle caratteristiche del linguaggio di
programmazione, si classifica in linguaggio di alto o basso
livello, con sostanziali differenze in astrazione e facilità di
programmazione.
Questionario svolto
• Cosa si intende per Linguaggi di basso livello ?
• Sono linguaggi di programmazione vicini al linguaggio
macchina e utilizzano istruzioni estremamente basilari
che vengono elaborate direttamente dal processore,
pertanto hanno un basso livello di astrazione.
• Vantaggi:
• controllo diretto delle risorse del computer
• velocità di traduzione ed esecuzione
• Svantaggi:
• scarsa espressività, difficoltà di programmazione
• conoscenza dettagliata della CPU
Questionario svolto

• Cosa si intende per Linguaggi di alto livello ?


• Sono linguaggi di programmazione più vicini alla logica
umana in cui una singola istruzione consente di effettuare
un'operazione semplice ma completa, pertanto hanno un
alto livello di astrazione.
• Vantaggi:
• facilità di programmazione
• portabilità, non dipendono da una specifica CPU
• programma modulare, composto da un set di funzioni
• Svantaggi:
• complessità della traduzione in programma eseguibile
Questionario svolto
• Quali sono i requisiti per un buon linguaggio di
programmazione?
• Funzionalità: è in grado di produrre programmi scritti
correttamente, secondo regole sintattiche e semantiche
• Efficienza: è in grado di produrre programmi efficienti in
termini di prestazioni (tempo di esecuzione, occupazione
di memoria) utilizzando oculatamente le risorse
disponibili (memoria, CPU, hard disk..)
• Manutenibilità: è in grado di produrre programmi facili da
ispezionare, correggere e modificare.
Questionario svolto

• Fornire alcuni esempi di linguaggi di


programmazione di alto e basso livello.
• Linguaggi di basso livello: Assembly
• Linguaggi di alto livello: C/C++, Matlab, Java, PHP, Visual
Basic, Python, Ruby…
• I più diffusiLinguaggi di alto livello
linguaggi di programmazione hanno un alto livello
di astrazione per facilitare la programmazione e la portabilità
dei programmi.
• Ma è necessario capire come il computer possa eseguire un
programma scritto in un linguaggio molto distante, sia per
forma che per il significato delle istruzioni, dal linguaggio
macchina.
 I linguaggi di alto livello richiedono un traduttore in
grado di tradurre le istruzioni dal linguaggio di alto livello al
linguaggio macchina prima dell’esecuzione.
Dal problema al programma
• Questi traduttori si distinguono in base alla politica di traduzione,
Compilatori e interpreti
che può essere un processo di compilazione o di interpretazione
• Il compilatore prima traduce tutte le istruzioni del programma
(«programma sorgente»), poi esegue la versione tradotta del
programma («programma oggetto»)
• Esempio: dobbiamo inviare un curriculum in inglese ad una azienda, ma
non conosciamo l’inglese. Abbiamo bisogno di un traduttore che traduca
il curriculum dall’italiano all’inglese:
• Contattiamo il traduttore, il traduttore riceve il curriculum da
tradurre, il traduttore fornisce il testo tradotto, poi possiamo
sottoporre il nostro curriculum all’azienda.
Compilatori e interpreti
• L’interprete traduce ed esegue una istruzione per volta del
programma
• Esempio: dobbiamo incontrare un manager cinese per motivi di
lavoro ma non conosciamo il cinese. Abbiamo bisogno di un
interprete che traduca il nostro dialogo:
• Parliamo in italiano, in presenza dell’interprete;
contemporaneamente l’interprete comunica al manager cinese
quanto detto da noi e viceversa
• Il compito dell’interprete si svolge contestualmente all’incontro
col manager cinese
Compilatori e interpreti
Programmi modulari
• Per supportare la traduzione di programmi complessi, i compilatori
permettono la compilazione separata di parti di programma
(moduli).
• I diversi moduli possono contenere ad esempio utili procedure
aritmetiche o strutture di dati e possono essere progettati e
programmati separatamente.
• I singoli moduli poi vengono compilati separatamente («moduli
oggetto») e archiviati in opportune librerie, che vengono richiamate
all’occorrenza dal programma principale.
• Per eseguire un programma modulare, sono necessari due fasi:
traduzione e collegamento (linking).
Compilatore

1. Il file sorgente: sono le istruzioni del programma principale in linguaggio di alto


livello
2. Il file oggetto: è il programma compilato
3. Il file binario: è il programma compilato e unito alle librerie che contengono le
funzioni richiamate dal programma.
Traduttore

• La fase di traduzione prevede un’analisi lessicale e sintattica e


la generazione del programma oggetto
Linker

• La fase di linking prevede l’integrazione dei moduli oggetto


(presenti nelle librerie) all’interno del programma oggetto, per
creare una singola unità eseguibile.
Interprete
• Gli interpreti sono in grado di eseguire direttamente un programma
scritto in un linguaggio di alto livello, in corrispondenza di un
insieme di dati in ingresso.
• Un interprete:
1. preleva dal programma un’istruzione alla volta
2. effettua l’analisi lessicale, sintattica e semantica
3. se non riscontra la presenza di errori, esegue l’istruzione
• Per far ciò, l’interprete deve gestire in ogni istante il contenuto delle
variabili e il contatore delle istruzioni.
• Un interprete permette di correggere gli errori a run-time, senza
dover ricompilare il programma dall’inizio.
Linguaggi compilati e interpretati
• In base al tipo di traduttore usato, i linguaggi si distinguono
in:
• Linguaggi compilati (es: linguaggio C)
• Linguaggi interpretati (es: linguaggio Java)
• L’esecuzione di un programma compilato è più veloce rispetto all’esecuzione
di un programma che deve essere interpretato
• Inoltre, per distribuire un programma interpretato, si deve necessariamente
copiare il codice sorgente, rendendo possibili operazioni di plagio
• Tuttavia, i programmi interpretati sono estremamente portabili in quanto
indipendenti da architetture hardware e sistemi operativi
• Inoltre, è facilitato il rilevamento di errori in fase di esecuzione
Portabilità
• Si definisce portabilità di un programma la possibilità di eseguire un
programma su piattaforme hw/sw diverse da quella dove è stato
sviluppato:
• portabilità del file eseguibile: richiede calcolatori con hardware e
sistema operativo dello stesso tipo per il quale è stato compilato.
Semplice ma restrittivo.
• portabilità tramite ricompilazione: richiede l’esistenza di un
compilatore e di librerie per la nuova piattaforma e lo svolgimento
della ricompilazione. Non semplice e restrittivo.
• portabilità tramite interpretazione: richiede l’esistenza di un
interprete per la nuova piattaforma. Semplice (purchè l’interprete sia
già installato) e non restrittivo.
Questionario svolto
• Cosa accomuna e differenzia compilatori e interpreti?
• Entrambi sono traduttori, ovvero sono programmi che provvedono a
convertire il codice di programmi scritti in un dato linguaggio di
programmazione di alto livello, nella corrispondente
rappresentazione in linguaggio macchina
• Tuttavia, vi è una sostanziale differenza:
• i compilatori traducono un programma scritto in un linguaggio di
programmazione di alto livello (programma sorgente) in un
programma equivalente direttamente eseguibile dal calcolatore
(programma oggetto).
• gli interpreti: traducono ed eseguono direttamente ciascuna
istruzione del programma sorgente; in ingresso richiedono anche i
dati iniziali.
Questionario svolto
• Qual è la differenza tra file sorgente, file oggetto e file
binario?
• Il file sorgente contiene il programma originario, costituito
dalle istruzioni in linguaggio di alto livello e dato in input al
compilatore.
• Il file oggetto contiene il programma oggetto, che è stato
generato dal processo di traduzione del programma originario
e che andrà in input al Linker, il quale si occuperà di inserire i
moduli oggetto richiamati in esso.
• Il file binario contiene tutte le istruzioni in linguaggio macchina,
direttamente eseguibili dal processore.
Questionario svolto
• Quali sono i vantaggi di un programma scritto in C rispetto a
un programma scritto in Java?
• Il C è un linguaggio che deve essere tradotto da un compilatore,
per cui l’esecuzione del programma oggetto, generato dalla
compilazione del programma sorgente, risulterà più veloce
rispetto all’esecuzione di un programma in Java, che, per poter
essere eseguito, va interpretato istruzione per istruzione.
• Inoltre, per duplicare il programma in C, è sufficiente copiare il
programma oggetto da un pc all’altro e non necessariamente il
codice sorgente, proteggendo così la proprietà intellettuale.
Questionario svolto
• Quali sono i vantaggi di un programma scritto in Java rispetto
a un programma scritto in C?
• Il Java è un linguaggio che deve essere tradotto da un interprete, per
cui il programma sorgente, per poter essere eseguito, viene
interpretato ed eseguito istruzione per istruzione.
• Poiché l’interprete analizza istruzione per istruzione, esso è in grado
di segnalare la presenza di errori al programmatore, che quindi ha la
possibilità di correggerli al momento, senza dover interrompere
l’esecuzione, ricompilare tutto il programma e riavviare l’esecuzione.
• Inoltre, i programmi in Java possono essere semplicemente copiati ed
eseguiti su altri computer con caratteristiche hw/sw diverse,
l’essenziale è che abbiano un interprete Java installato.
Questionario svolto
• Cosa si intende per Portabilità di un programma e da cosa dipende?
• Si definisce portabilità di un programma la possibilità di eseguire un
programma su piattaforme hw/sw diverse da quella dove è stato
sviluppato.
• Il problema della portabilità si presenta in caso di programma
compilato, in quanto il programma oggetto dipende sia da linguaggio
macchina del sistema sul quale esso deve essere eseguito, sia dal
sistema operativo
• Infatti, il sistema operativo estende le istruzioni del linguaggio
macchina con le chiamate di sistema, messe a disposizione delle
applicazioni mediante l’interfaccia di programmazione.

Potrebbero piacerti anche