2
Algoritmo


La programmazione

Procedimento di risoluzione di un problema
Permette di ottenere un risultato eseguendo
una sequenza finita di operazioni elementari
Esempi:

Ver. 2.4



Una ricetta di cucina
Il metodo per calcolare le radici di un’equazione di
secondo grado
Le istruzioni per utilizzare il microonde
Ci possono essere più algoritmi in grado di
risolvere lo stesso problema
© 2010 - Claudio Fornaro - Corso di programmazione in C
3
Algoritmo

Proprietà fondamentali dell'algoritmo:





la sequenza di istruzioni deve essere finita
(finitezza);
la sequenza di istruzioni deve portare ad un
risultato (efficacia);
le istruzioni devono essere eseguibili
materialmente (realizzabilità);
le istruzioni devono essere espresse in modo non
ambiguo (non ambiguità).
È importante valutare le risorse utilizzate
(tempo, memoria, …) perché un consumo
eccessivo delle stesse può pregiudicare la
possibilità stessa di utilizzo di un algoritmo
4
Programmare

Se esiste un procedimento che:



può essere descritto in modo non ambiguo fino ai
dettagli
conduce sempre all'obiettivo desiderato in un
tempo finito
allora esistono le condizioni per affidare
questo compito a un calcolatore
Si descrive l'algoritmo in questione in un
programma scritto in un opportuno linguaggio
comprensibile alla macchina.
5
Programmare



6
Linguaggi
Il calcolatore sa eseguire molte operazioni di
base: somma, sottrazione, AND, ecc.
Per risolvere un determinato problema si
combinano queste operazioni in modo
opportuno
Programmare significa determinare quali
operazioni eseguire e in quale sequenza per
raggiungere la soluzione


Perché il programmatore possa istruire il
calcolatore sulle operazioni da fare, serve un
linguaggio noto ad entrambi
Problema:


Il calcolatore comprende solo sequenze di zeri e
uno (ad es. la sequenza 1001001 potrebbe
significare, per un ipotetico calcolatore, “fai la
somma”): linguaggio macchina
Il programmatore comprende le parole “fai la
somma” (mentre 1001001 non significa nulla per
lui): linguaggio umano
7
Linguaggio di programmazione

Soluzione 1
Il programmatore impara il linguaggio
macchina, ma questo:



ha un basso livello di astrazione (scende molto nei
dettagli realizzativi e perde la visione di insieme del
problema da risolvere)
è difficile da ricordare (le istruzioni possono essere
diverse centinaia)
è diverso per ogni piattaforma hardware (ogni tipo
di microprocessore ha il suo set di istruzioni)
8
Linguaggio di programmazione


Soluzione 2
Il programmatore impara un linguaggio simile
al linguaggio macchina detto assembly
Ogni istruzione del linguaggio assembly
corrisponde ad un’istruzione in linguaggio
macchina, ma ha il vantaggio di essere
mnemonico (es. ADD è l’istruzione per
calcolare una somma)
9
Linguaggio di programmazione


Soluzione 2 (Continuazione)
Il linguaggio assembly:




10
Linguaggio di programmazione

ha un basso livello di astrazione
è più facile da ricordare (ad es. per avere una
somma invece di scrivere 1001001 si scrive ADD)
viene tradotto in linguaggio macchina da un
programma relativamente semplice (assembler )
che, in linea di massima, sostituisce le istruzioni
assembly con le corrispondenti istruzioni macchina
è diverso per ogni piattaforma hardware (sebbene
possano essere simili)
Soluzione 3
Il programmatore impara un linguaggio di
programmazione ad alto livello (HLL)




un traduttore complesso ed efficiente lo traduce in
linguaggio macchina o in assembly
ha un alto livello di astrazione (esprime le
operazioni da svolgere senza entrare nei dettagli,
es. A+B calcola la somma di due valori)
è più simile al linguaggio umano e quindi più facile
da ricordare (es. “print X” potrebbe essere
l’istruzione per visualizzare il valore di X)
è (quasi) indipendente da piattaforma hardware e
sistema operativo (PC, Mac, Windows, Linux, ecc.),
è il traduttore che lo converte per il sistema in uso
11
Programma sorgente

Il programmatore sviluppa un programma
scrivendo in un linguaggio di programmazione
(di alto o basso livello) le operazioni da far
eseguire al calcolatore e le memorizza in un
file detto:




programma
programma sorgente
codice sorgente
sorgente
12
Traduttore di tipo interprete

Le istruzioni del codice sorgente vengono ad
una ad una tradotte in linguaggio macchina e
subito eseguite dalla CPU
Sorgente
somma
somma
stampa
stampa
leggi
leggi
calcola
calcola
...
...
13
Traduttore di tipo compilatore

Differenze
Tutto il codice sorgente viene tradotto in
linguaggio macchina e memorizzato in un file
detto programma (o file o codice) eseguibile
Sorgente
somma
somma
stampa
stampa
leggi
leggi
calcola
calcola
...
...
14
Eseguibile
1001001010101
1001001010101
0010100101010
0010100101010
1001001010010
1001001010010
1010010100101
1010010100101
0101010101011
0101010101011
0101001010100
0101001010100
1001001010010
1001001010010
Velocità di esecuzione
 Ogni volta che l’interprete esegue un
programma, deve attuare la traduzione delle
istruzioni in linguaggio macchina: lento
 Il programma compilato è già tradotto e ha
quindi una velocità di esecuzione molto
superiore
 Il compilatore è in genere in grado di produrre
una traduzione più efficiente dal punto di vista
della velocità di esecuzione del codice
prodotto (oppure della dimensione del codice)
15
16
Differenze
Differenze
Competenze per l’uso
 Eseguire un programma interpretato richiede
l’acquisto e del programma interprete da
parte dell’utente finale e l’acquisizione dello
stesso delle competenze necessarie al suo uso
 Eseguire un programma compilato non
richiede che un (doppio) click
 Il compilatore viene acquistato solo dal
programmatore e solo questi ha la necessità
di avere la competenza necessaria per
utilizzarlo
Copyright e gestione della complessità
 L’interprete richiede il codice sorgente che
quindi risulta visibile a chiunque
 Il programma eseguibile non necessita del
sorgente: protezione del copyright
 La procedura di compilazione permette di
suddividere un programma complesso in più
parti, ma è più complessa da gestire
17
Librerie



18
Creazione di un eseguibile
In un HLL il programmatore non ha necessità
di programmare le operazioni di base (ad es.
leggere un numero dalla tastiera, calcolare la
radice quadrata, visualizzare una parola, ecc.)
Queste operazioni sono state programmate e
compilate dal produttore del traduttore e sono
a disposizione del programmatore sotto forma
di funzioni
I codici eseguibili (quindi già tradotti in
linguaggio macchina) che realizzano queste
operazioni vengono raggruppati in file detti
librerie (collezioni di funzioni di base)

Il processo di creazione di un eseguibile a
partire dai sorgenti (build) è composto da 2
fasi:

compilazione: il sorgente viene compilato, ma
alcune parti (le “operazioni di base”) sono ancora
mancanti; viene generato un file intermedio detto
file oggetto

linking: il file oggetto e le librerie vengono unite
(collegate – link) così da aggiungere al file oggetto
le parti mancanti e costituire un unico
file eseguibile
La fase di link può creare un eseguibile collegando
più file oggetto e più librerie
19
Librerie statiche

Nella compilazione il codice delle funzioni di
libreria viene inserito nel file eseguibile
File eseguibile
File oggetto
File libreria
20
Librerie statiche

Spesso le stesse librerie sono usate da più
programmi (es. le operazioni di input/output):
spreco di memoria
Eseguibile A
Eseguibile B
Eseguibile C
Oggetto A
Oggetto B
Oggetto C
Libreria
Libreria
Libreria
RAM
RAM
21
Librerie dinamiche



22
Librerie dinamiche
Dynamic Link Libraries (DLL)
Shared Libraries, Shared Objects
Nella compilazione il codice delle funzioni di
libreria NON è inserito nel file eseguibile,
viene invece indicato il nome del file che lo
contiene

File eseguibile
File oggetto
Quando viene eseguito un programma che
usa quella libreria, questa viene caricata in
memoria, ma è utilizzabile anche dagli altri
programmi
Eseguibile A
Eseguibile B
Eseguibile C
Oggetto A
Oggetto B
Oggetto C
File libreria
RAM
RAM
Libreria
23
Librerie dinamiche



Quando viene eseguito un altro programma
che necessita di quella libreria, questa è già
caricata in memoria e pronta all’uso: il
programma impiega meno tempo a partire
Se una delle funzioni della libreria deve essere
aggiornata (es. nuova versione), è sufficiente
sostituire la DLL mentre il programma in sé
non viene modificato
Se la DLL viene sostituita da un’altra con
codice contenente ad esempio un virus, il
lancio del programma esegue il virus!
24
Interfacce utente

L’interazione tra utente e programma può
avvenire tramite:



Interfacce a carattere (console mode): vengono
visualizzate e immesse solo righe di testo
Interfacce grafiche (GUI – Graphic User Interface):
vengono visualizzati pannelli, bottoni, caselle di
testo, immagini, ecc.
Molti linguaggi dispongono di entrambe le
interfacce