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

L02 Programmazione1 Background

Caricato da

pitprem
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)
18 visualizzazioni63 pagine

L02 Programmazione1 Background

Caricato da

pitprem
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
Sei sulla pagina 1/ 63

A.A.

2022/23

Programmazione 1 Simone Bianco

Turno 2
[email protected]
Ed. U14, piano 1, stanza 1011

1
Outline

1 Come è fatto un computer

2 Rappresentazione binaria dell’informazione

3 Linguaggi di programmazione e algoritmi

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 2 / 66


Com’è fatto un computer (1)

In questo corso impareremo a scrivere programmi che dovranno essere


eseguiti da un computer

E’ quindi bene sapere com’è fatto e come funziona un computer...

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 3 / 66


Com’è fatto un computer (2)
Il miglior modo per capire com’è fatta una cosa è... smontarla!

Foto da tutorial PC professionale

http://www.pcprofessionale.it/2012/03/28/costruire-un-pc-la-guida-passo-passo-completa/

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 4 / 66


Com’è fatto un computer (3)
Identifichiamo i componenti più “appariscenti”

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 5 / 66


Com’è fatto un computer (4)
Innazitutto dobbiamo scollegare i cavi di alimentazione...

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 6 / 66


Com’è fatto un computer (5)

... e i cavi-dati

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 7 / 66


Com’è fatto un computer (6)
Ora possiamo rimuovere il DVD e l’hard disk

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 8 / 66


Com’è fatto un computer (7)
A questo punto possiamo dedicarci alla scheda madre e ai componenti ad
essa collegati. Per prima la scheda video (a cui era collegato il monitor)

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 9 / 66


Com’è fatto un computer (8)
Ora la memoria RAM

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 10 / 66


Com’è fatto un computer (9)
Sotto il grosso dissipatore (con ventola) posizionato al centro della scheda
madre...

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 11 / 66


Com’è fatto un computer (9)
...troviamo il processore (o CPU)

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 12 / 66


Com’è fatto un computer (10)
E infine non ci rimane che rimuovere la scheda madre

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 13 / 66


Com’è fatto un computer (11)
Una rappresentazione schematica (ufficiale – Intel). I componenti sono
collegati tramite BUS di comunicazione gestiti dal processore e da un
apposito chipset.

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 14 / 66


Com’è fatto un computer (12)
Una rappresentazione semplificata (unico bus di comunicazione in cui il
chipset non è rappresentato)

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 16 / 66


Architettura Von Neumann

• Prima proposta di architettura di un elaboratore


• Risale al 1946
• Schema generale di tipo funzionale del calcolatore

Unità di elaborazione o CPU (Central Processing Unit):


- acquisisce, interpreta ed esegue istruzioni
Memoria centrale
- contiene istruzioni e dati
Periferiche
- permettono scambio di informazioni da e con l'esterno
Bus di sistema
- collega i vari elementi del calcolatore
La CPU e la memoria RAM

I componenti chiave per l’esecuzione di un programma sono la CPU e la


memoria RAM.
La CPU è un chip capace di eseguire operazioni molto semplici
(operazioni aritmetiche, operazioni logiche, scrittura/lettura di piccole
quantità di dati nella memoria RAM, ecc...) in tempi rapidissimi,
nell’ordine dei miliardi di operazioni al secondo (in teoria...).
La memoria RAM è una memoria volatile (si cancella quando non è
alimentata) che consente di memorizzare grandi quantità di dati
rappresentati in formato binario (ossia come sequenze di valori 0 e 1).

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 17 / 66


La memoria RAM
Un modulo di memoria RAM può memorizzare
decine di miliardi di bit 0/1.
I bit sono organizzati in gruppi di 8, detti
byte
I byte sono organizzati in gruppi di 4 (32
bit) oppure 8 (64 bit) detti word (o parola)
I singoli byte della memoria RAM sono associati
ad un valore numerico (indirizzo di memoria)
che li distingue.

Una parola solitamente è la quantità massima di


memoria che una CPU può utilizzare in una
singola operazione. Operazioni che lavorano su
dati più grandi vengono svolte in più passi dalla
CPU.

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 19 / 66


La CPU
Le operazioni che può svolgere la CPU sono codificate tramite un
linguaggio in codice binario detto linguaggio macchina

Il linguaggio macchina è di solito rappresentato tramite una notazione


simbolica detta linguaggio assembly
mov bx,ax ;copy the content of ax into bx
add ax,bx ;add value in bx to value in ax
sub bx,1 ;subtract 1 from the bx value
add [bx],ax ;add value in ax to memory _word_ pointed to by bx
add [bx],al ;add value in al to memory _byte_ pointed to by bx

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 18 / 66


E ora?

Prima di poter programmare un computer dobbiamo:


trovare un modo per rappresentare i nostri dati in memoria
I Rappresentazione binaria
trovare dei linguaggi più semplici da usare rispetto all’assembly
I Linguaggi di programmazione e algoritmi
Vediamo questi due argomenti in dettaglio...

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 20 / 66


Outline

1 Come è fatto un computer

2 Rappresentazione binaria dell’informazione

3 Linguaggi di programmazione e algoritmi

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 21 / 66


Rappresentazione binaria dell’informazione (1)

Per informazione intendiamo tutto quello che viene manipolato da un


calcolatore:
Numeri (naturali, interi, reali, ...)
Caratteri
Immagini
Suoni
Programmi

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 22 / 66


Rappresentazione binaria dell’informazione (2)

La più piccola unità di informazione memorizzabile o elaborabile da un


calcolatore, il bit, corrisponde allo stato di un dispositivo fisico (ad
esempio spento/acceso) che viene interpretato come 0 o 1.

In un calcolatore tutte le informazioni sono rappresentate in forma binaria,


come sequenze di 0 e 1.

Per motivi tecnologici: distinguere tra due valori di una grandezza fisica è
più semplice che non ad esempio tra dieci valori
Ad esempio, verificare se su un connettore c’è una tensione elettrica
di 5V o meno è più facile che verificare se sullo stesso connettore c’e’
una tensione di 0V, 1V, 2V, 3V, 4V o 5V.

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 23 / 66


Rappresentazione posizionale (1)
Un numero natuale può essere rappresentato mediante una sequenza di
simboli in diversi modi

E’ importante distinguere tra un numero e la sua rappresentazione:


la sequenza di cifre "234" è la rappresentazione decimale del numero
234
la sequenza di cifre romane "CCXXXIV" è un’altra rappresentazione
dello stesso numero

La rappresentazione decimale è un esempio di rappresentazione


posizionale:
ogni cifra contribuisce al numero con un valore che dipende dalla
posizione in cui si trova nella sequenza
ad esempio: nella rappresentazione "2426" il primo 2 contribuisce più
del secondo (2000 vs 20) a rappresentare il numero 2426

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 24 / 66


Rappresentazione posizionale (2)

Nella sequenza di cifre:

cn−1 cn−2 · · · c1 c0

la cifra c0 viene detta cifra meno significativa


la cifra cn−1 viene detta cifra più significativa

Ad esempio, nella rappresentazione "2435"


la cifra meno significativa è 5
la cifra più significativa è 2

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 25 / 66


Rappresentazione di numeri naturali (1)

La rappresentazione decimale dei numeri naturali si basa su un insieme di


cifre costituito da 10 simboli (0,1,...,9).

Il numero b di cifre usate è detto base del sistema di numerazione. Ad


ogni cifra è associato un valore compreso tra 0 e b-1.

Base Cifre Sistema Esempio


2 0,1 binario 1001010110
8 0,1,...,7 ottale 40367
10 0,1,...,9 decimale 3954
16 0,1,...,9,A,...,F esadecimale 2DE4

Nel sistema esadecimale A vale 10, B vale 11, ...., F vale 15.

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 26 / 66


Rappresentazione di numeri naturali (2)

Il numero N rappresentato da una sequenza di cifre cn−1 cn · · · c0 dipende


dalla base b e si ottiene tramite la seguente formula:

N = cn−1 · b n−1 + cn−2 · b n−2 + · · · + c1 · b 1 + c0 · b 0


Ad esempio:
il numero binario 1101 corrisponde a 1 · 23 + 1 · 22 + 0 · 21 + 1 · 20 = 13
il numero ottale 345 corrisponde a 3 · 82 + 4 · 81 + 5 · 80 = 229
il numero decimale 243 corrisponde a 2 · 102 + 4 · 101 + 3 · 100 = 243
il numero esadecimale 2FA corrisponde a
2 · 162 + 15 · 161 + 10 · 160 = 762

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 27 / 66


Rappresentazione binaria di numeri naturali (1)
Nella pratica, per convertire un numero binario in formato decimale si può
costruire una semplice tabellina come nel seguente esempio:

Numero da convertire: 10110101

Numero da convertire 1 0 1 1 0 1 0 1
Potenze di 2 corrispondenti 27 26 25 24 23 22 21 20

Il risultato è la somma delle potenze di 2 associate a valori 1 nella


tabellina (in rosso):

27 + 25 + 24 + 22 + 20
= 128 + 32 + 16 + 4 + 1
= 181

Il risultato coincide con quanto calcolato dalla formula definita in


precedenza.
Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 28 / 66
Rappresentazione binaria di numeri naturali (2)
Anche per convertire un numero decimale in formato binario si può
costruire una tabellina, in cui si divide ripetutamente il numero decimale
per 2.

Il numero binario sarà dato dai resti delle divisioni presi in ordine inverso.

Esempio: numero da convertire: 25

N:2 Quoziente Resto Cifra


25 : 2 12 1 c0
12 : 2 6 0 c1
6: 2 3 0 c2
3: 2 1 1 c3
1: 2 0 1 c4

Il risultato è quindi c4 c3 c2 c1 c0 che corrisponde a 11001.

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 29 / 66


Intervallo di rappresentazione

Quanti numeri si possono rappresentare con un byte? E con una parola?

Nel sistema binario con n cifre si possono rappresentare 2n valori diversi,


i valori vanno da 0 a 2n − 1

Ad esempio:

Con 1 cifra binaria (1 bit) 21 valori {0, 1}


Con 8 cifre binarie (1 byte) 28 valori {0, 1, ....., 255}
Con 16 cifre binarie (2 byte) 216 valori {0, 1, ....., 65.535}
Con 32 cifre binarie (4 byte) 232 valori {0, 1, ....., 4.294.967.295}

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 31 / 66


Rappresentazione binaria di numeri interi (1)

Nella rappresentazione vista abbiamo considerato solo numeri senza segno

Quando si considerano valori interi, per rappresentare il segno si può


pensare di usare uno dei bit (quello più significativo)

Questa convenzione viene detta rappresentazione tramite modulo e segno


Il bit più significativo (cn−1 ) rappresenta il segno
le altre cifre (cn−2 · · · c0 ) rappresentano il valore assoluto
Esempio con 4 bit:

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 32 / 66


Rappresentazione binaria di numeri interi (2)

La rappresentazione tramite modulo e segno presenta diversi problemi:


doppia rappresentazione dello zero (come 00...00 e 10...00)
le operazione aritmetiche diventano complicate

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 33 / 66


Rappresentazione in complemento a 2 (1)
Una rappresentazione alternativa a quella modulo e segno è la
rappresentazione in complemento a 2.

Come prima si usa il bit più significativo per rappresentare il segno

Anche la rappresentazione dei numeri positivi non cambia

Un numero negativo −N invece viene rappresentato come 2n − N, dove n


è il numero dei bit a disposizione (incluso il bit del segno).

Ad esempio, con 4 bit (n = 4) rappresentiamo il numero negativo −3


come 24 − 3 = 16 − 3 = 13 che in binario è 1101.

Quindi:

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 34 / 66


Rappresentazione in complemento a 2 (2)

La rappresentazione in complemento a 2 presenta diversi vantaggi


Lo zero ha una sola rappresentazione (00...00)
Le operazioni aritmetiche rimangono facili
I Si può trasformare un numero positivo in un negativo semplicemente
(vedere dopo...)
I La somma è come abbiamo visto in precedenza (bit a bit)
I La sottrazione si ottiene trasformando il secondo operando in negativo
e sommando
I Moltiplicazione e divisione si basano su somma e sottrazione
Per trasformare un numero positivo nel corrispondente negativo è
sufficiente invertire tutti i bit e sommare 1

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 35 / 66


Rappresentazione in complemento a 2 (3)

Esempio: trasformare 5 in -5 (con 4 bit)


5 è 0101
inverto tutti i bit: 1010
sommo uno: 1011
quello che ottengo è -5

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 36 / 66


Rappresentazione di numeri reali (1)

Anche in un intervallo chiuso, l’insieme dei numeri reali (e dei razionali) è


infinito.
Non è possibile rappresentare tutti i possibili valori di un certo
intervallo
Rappresentazione in virgola fissa (poco usata):
Si rappresentano separatamente, usando un numero fissato di cifre, la
parte intera e la parte frazionaria
Ad esempio:
I usando 8 bit, di cui 4 per la parte intera e 4 per la parte frazionaria
I 5.75 in binario diventa 0101.1100
I Per la parte frazionaria: 1 · 2−1 + 1 · 2−2 + 0 · 2−3 + 0 · 2−4 = 0.75

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 37 / 66


Rappresentazione di numeri reali (2)

Rappresentazione in virgola mobile:


Per rappresentare un numero reale N usa notazione esponenziale:

N = m · 2e

dove:
I m è la mantissa in base 2: numero frazionario tale che

0.5 ≤ |m| < 1

I e è l’esponente in base 2: numero intero


Esempio: per rappresentare 0.125 avremo
I m = 0.5 ( in binario 0.1=1 · 2−1)
I e = -2 ( in binario con 4 bit 1110)
I infatti: 0.5 · 2−2 = 0.125

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 38 / 66


Rappresentazione di numeri reali (3)
I numeri rappresentabili in virgola mobile:
Sono distribuiti simmetricamente rispetto allo 0
NON sono uniformemente distribuiti sull’asse reale
I sono più densi intorno allo 0!
Ad esempio, con 3 bit per la mantissa e 3 bit per l’esponente:
m\e -4 -3 -2 -1 0 1 2 3
0.100 0.03125 0.0625 0.125 0.25 0.5 1 2 4
0.101 0.0390625 0.078125 0.15626 0.3125 0.625 1.25 2.5 5
0.110 0.046875 0.09375 0.1875 0.375 0.75 1.5 3 6
0.111 0.0546875 0.109375 0.21875 0.4375 0.875 1.75 3.5 7

Graficamente (i punti sono numeri rappresentabili):

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 39 / 66


Rappresentazione di numeri reali (4)

Problemi della rappresentazione in virgola mobile:


Molti razionali non sono rappresentabili (ad esempio 1/3)
Non è chiuso rispetto ad addizioni e moltiplicazioni
Per rappresentare un reale N si sceglie l’elemento rappresentabile più
vicino ad N
Perdita di precisione:
I Arrotondamento: mantissa non sufficiente a rappresentare tutte le cifre
significative del numero
I Errore di overflow: esponente non sufficiente (numero troppo grande)
I Errore di underflow: numero troppo piccolo (rappresentato come 0)

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 40 / 66


Rappresentazione di caratteri e testi (1)
I singoli caratteri di un testo possono essere rappresentati come numeri.

La seguente tabella riporta la codifica ASCII (o meglio, US-ASCII) è nata


negli anni 60 per rappresentare (con 7 bit) i simboli della tastiera
americana

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 42 / 66


Rappresentazione di caratteri e testi (2)

La codifica ASCII è stata superata negli anni da codifiche più ricche.

In primis, la codifica Extended-ASCII (8 bit)

Attualmente, una codifica che si sta affermando (specialmente in ambito


web) è UTF-8
usa da 1 a 4 byte (variabile) per rappresentare un carattere

Le stringhe sono sequenze di caratteri che possono contenere un testo


possono essere rappresentate nella memoria di un computer come una
sequenza di caratteri terminata dal carattere NUL (= numero 0)

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 43 / 66


Rappresentazione di immagini e altri dati
Una immagine può essere rappresentata nella memoria di un computer
codificando il colore dei singoli pixel che la compongono tramite valori
numerici

Ad esempio, nel formato bmp a 24 bit ogni pixel dell’immagine viene


rappresentato da 3 byte
ogni byte (256 valori) rappresenta il livello di un colore fondamentale
RGB
111111110000000000000000 = (255,0,0) = rosso
000000001111111100000000 = (0,255,0) = verde
000000000000000011111111 = (0,0,255) = blu
111111111111111111111111 = (255,255,255) = bianco
111111111001100110011001 = (255,204,204) = rosa

Altri formati più sofisticati (gif, png, jpeg) utilizzano metodi di


compressione per ridurre la dimensione della rappresentazione.
Approcci simili sono adottati per rappresentare suoni e filmati...
Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 44 / 66
Outline

1 Come è fatto un computer

2 Rappresentazione binaria dell’informazione

3 Linguaggi di programmazione e algoritmi

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 45 / 66


Problemi computazionali
L’Informatica è una scienza che studia principalmente metodi e strumenti
per la risoluzione di problemi computazionali (problem solving)

Un problema computazionale è un problema che richiede


di calcolare un risultato (output)
a partire da determinati valori noti (input)

Esempi di problemi computazionali:


Calcolo del massimo comune divisore di due numeri
Preparazione di un risotto ai funghi
Tessitura di tappeto con un telaio meccanico
Ordinamento di una sequenza di numeri
Ricerca di una parola in un testo
Risoluzione di un Sudoku

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 46 / 66


Algoritmi (1)

I problemi computazionali possono essere risolti tramite algoritmi.

Un algoritmo è una sequenza finita di passi di elaborazione che, dato un


input, consentono di ottenere l’output ad esso corrispondente.

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 47 / 66


Algoritmi (2)
Un algoritmo si può esprimere in molti modi diversi:
In linguaggio naturale:
I “Per calcolare il massimo comune divisore di X e Y maggiori di 0
bisogna ripetutamente sottrarre il più piccolo dei due dal più grande.
Quando i due numeri saranno diventati uguali tra loro, il loro valore
corrisponderà al risultato.”
Tramite formule matematiche:

mcd(X − Y , Y )
 se X > Y
I mcd(X , Y ) = mcd(X , Y − X ) se Y > X

X altrimenti

In pseudo-codice:
finchè X!=Y ripeti {
se Y>X scambia(X,Y)
X = X-Y
}
stampa X
Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 48 / 66
Algoritmi (3)

Un buon algoritmo deve soddisfare alcune proprietà:


Non ambiguità: I singoli passi devono essere “elementari”: facilmente
eseguibili (atomici) e non ambigui
Determinismo: Eseguito più volte sullo stesso input, l’algoritmo deve
eseguire sempre la stessa sequenza di passi (e conseguentemente deve
dare lo stesso risultato)
Terminazione: L’esecuzione dell’algoritmo deve prima o poi terminare
e fornire un risultato

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 49 / 66


Esempi di Algoritmi (1)

Supponiamo di voler comprare un’auto il più possibile economica:

Ci vengono proposte due alternative:

10000 euro 15000 euro


8 km/l 20 km/l

Quale scegliamo?

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 50 / 66


Esempi di Algoritmi (2)
Ci serve qualche informazione in più:
Vogliamo percorrere circa 50000 km
Il prezzo della benzina è circa 2 euro al litro

Ora possiamo usare il seguente algoritmo (in pseudo-codice):


per ogni auto calcola {
costo_gas = ( km_percorsi / km_al_litro ) x p rezzo_be nzina
costo_tot = p re z zo _acq u is to + costo_gas
}
se costo_tot ( auto1 ) < costo_tot ( auto2 )
compra auto1
altrimenti
compra auto2

Questo algoritmo è non ambiguo (i passi sono semplici), termina (il ciclo
“per ogni” prima o poi finisce) ed è deterministico

Qual è il risultato?
Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 51 / 66
Esempi di Algoritmi (3)

Vogliamo scrivere un algoritmo che possa essere usato da un braccio


meccanico per ordinare i mattoncini di Lego mettendo i pezzi blu a sinistra
e pezzi gialli a destra.

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 52 / 66


Esempi di Algoritmi (4)
Primo Tentativo (in pseudo-codice):
solleva tutti i mattoncini
posali tutti in ordine giusto

Questo algoritmo è ambiguo in quanto i singoli passi non sono


atomici (elementari)
I il braccio meccanico può sollevare un mattoncino per volta

Secondo Tentativo (in pseudo-codice):


finche i mattoncini non sono in ordine giusto {
scambia un mattoncino blu e uno giallo
}

Questo algoritmo non è deterministico: ad ogni passo ho più scelte di


mattoncini da scambiare
Inoltre potrebbe non terminare

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 53 / 66


Esempi di Algoritmi (5)

Terzo Tentativo (in pseudo-codice):


finche i mattoncini non sono in ordine giusto {
indiviuda la coppia di mattoncini giallo - blu piu a sinistra
scambia i due mattoncini
}

Questo algoritmo:
non è ambiguo: in quanto i singoli passi semplici
è deterministico: la scelta della coppia di mattoncini da scambiare è
precisamente ben determinata (la più a sinistra)
ed è facile convincersi che termini, perchè ad ogni iterazione un
mattoncino blu si sposta a sinistra e uno giallo verso destra

Questo è un buon algoritmo!

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 54 / 66


Esempi di Algoritmi (6)
Prova di esecuzione:
finche i mattoncini non sono in ordine giusto {
indiviuda la coppia di mattoncini giallo - blu piu a sinistra
scambia i due mattoncini
}

Input:

Passo 1:

Passo 2:
Passo 3: come continua?

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 55 / 66


Passo 2:

Passo 3:

Passo 4:

Passo 5:
Dagli algoritmi ai programmi

Ora: come dare in pasto un algoritmo al computer?

Il computer parla il linguaggio macchina... è piuttosto difficile esprimere


un algoritmo in linguaggio macchina!

Ecco: i linguaggi di programmazione!

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 58 / 66


I linguaggi di programmazione
Un linguaggio di programmazione è un “linguaggio formale” che consente
scrivere programmi che realizzano algoritmi
Un linguaggio formale (a differenza del linguaggio naturale) è un
linguaggio con regole sintattiche e semantiche ben precise che
rendono i costrutti del linguaggio stesso privi di ambiguità
I programmi potranno poi essere tradotti in linguaggio macchina per
essere eseguiti dal computer
Essendo il linguaggio specificato su regole ben precise, la traduzione
può essere fatta da un altro programma!

Terminologia:
I linguaggi di programmazione sono detti linguaggi di alto livello
I astraggono dai dettagli di funzionamento dell’elaboratore
Il linguaggio macchina e l’assembly sono linguaggi di basso livello

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 59 / 66


Compilazione e interpretazione (1)

Come tradurre un programma dal linguaggio di programmazione in


linguaggio macchina?

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 60 / 66


Compilazione e interpretazione (2)
Pensiamo al mondo reale: come si può comunicare con una persona che
parla solo cinese?

Due soluzioni:
scriviamo una lettera in italiano e troviamo un interprete che faccia
la portiamo all’ambasciata cinese una traduzione simultanea
per farla tradurre

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 61 / 66


Compilazione e interpretazione (3)

Analogamente, per tradurre un programma (sorgente) in linguaggio


macchina si può usare:
Un compilatore: ossia un programma che prende in input il
programma sorgente e produce in output il corrispondente programma
in linguaggio macchina, eseguibile successivamente dal computer
Un interprete: ossia un programma che prende in input il programma
sorgente, traduce un comando per volta e lo esegue man mano.

Esempi:
Il linguaggio C è un linguaggio compilato
Il linguaggio JavaScript è un linguaggio interpretato

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 62 / 66


Compilazione e interpretazione (4)

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 63 / 66


Compilazione e interpretazione (5)

Vantaggi ⇑ e svantaggi ⇓ della compilazione:


⇓ Compilare un programma può richiedere molto tempo
⇑ Il programma eseguibile che si ottiene è veloce
⇑ Il programma eseguibile può essere eseguito più volte senza
ricompilare
⇑ Il compilatore può controllare e ottimizzare il programma prima che
venga eseguito
⇓ Gli errori che sfuggono al controllo del compilatore non potranno
più essere gestiti durante l’esecuzione
⇓ Un compilatore produce un eseguibile che funziona su una sola
architettura (Intel, ARM, ...) e sistema operativo (Windows, Linux,
MacOS, ...)

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 64 / 66


Compilazione e interpretazione (6)

Vantaggi ⇑ e svantaggi ⇓ della interpretazione:


⇓ L’esecuzione del programma è rallentata dall’interprete, che deve
tradurre ogni comando
⇑ Non è necessario ri-compilare tutto il programma ogni volta che si
fa una modifica
⇑ Portabilità: lo stesso identico programma può essere eseguito su
architetture (Intel, ARM,...) e sistemi operativi (Windows, Linux,
MacOS, ...) diversi
⇓ Nessun controllo sui programmi prima di iniziarne l’esecuzione
⇑ Gli errori che si incontrano a tempo di esecuzione possono essere
gestiti meglio

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 65 / 66


Compilazione e interpretazione (6)

Alcuni linguaggi combinano compilazione e interpretazione


Java, ad esempio, è uno di questi (vedremo...)

Paolo Milazzo (Università di Pisa) Programmazione - Background A.A. 2013/2014 66 / 66

Potrebbero piacerti anche