Linguaggi di
programmazione
1
Da linguaggio macchina a
linguaggio assembly





Linguaggi macchina (prima generazione)
Codici operativi mnemonici, identificatori al
posto di indirizzi di memoria, nomi per i registri
All’inizio, solo su carta e poi traduzione in
lunguaggio macchina
Poi, traduzione automatica (programma
assemblatore)
Linguaggi assembly (seconda generazione)
2
Linguaggi assembly

Dipendenti da
 Numero
dei registri
 Istruzioni del linguaggio macchina
 Non trasportabili su un altro calcolatore
 Descrizione di un algoritmo con primitive che
rappresentano passi molto piccoli
 Meglio primitive piu’ ad alto livello, e poi
traduzione in concetti piu’ dettagliati
3
Linguaggi di terza generazione


Es.: FORTRAN (FORmula TRANslator), COBOL
(COmmon Business Language)
Insieme di primitive ad alto livello, ognuna
traducibile in una sequenza di primitive in
linguaggio macchina
pesolordo  pesocarico + pesoveicolo
 Due load, una add, una store
 Es.:



Programma traduttore (compilatore): traduce il
programma in linguaggio macchina
Interprete: traduce ogni primitiva ed esegue
subito le primitive corrispondenti del l.m., senza
memorizzare la traduzione
Trasportabili da una macchina all’altra, basta
4
cambiare compilatore
Paradigmi di programmazione

Imperativo (procedurale):
 programma
= sequenza di comandi che descrive un
algoritmo pensato dal programmatore
 Es.: pseudocodice, linguaggio macchina, Pascal, C

Dichiarativo:
 Basta
descrivere il problema e non il suo algoritmo
 Algoritmo generale per risolvere i problemi
 Ambiti ristretti o linguaggi basati su logica matematica
(programmazione logica, Prolog)
5
Paradigma funzionale



Funzioni, con ingresso e uscita
Connesse in modo da costruire funzioni
complesse a partire da funzioni elementari
Es.: media di una lista di valori
 Somma:
dato un elenco di valori, genera la somma
 Conta: data una lista di valori, gnera il loro numero
 Dividi: dati due valori, genera il quoziente della loro
divisione
 In LISP: (dividi (somma numeri) (conta numeri))
6
7
Paradigma orientato agli oggetti
Dati associati a procedure per gestirli
(oggetti)
 Es.: elenco di nomi

 Procedure
per inserire un nuovo nome,
eliminarne uno, vedere se l’elenco e’ vuoto,
ordinare l’elenco, ...
 Un programma accede all’elenco e usa le sue
procedure per gestirlo
8
Paradigma orientato agli oggetti

Es.: interfaccia grafica
 Icone:
oggetti, con procedure che vengono attivate da
eventi (clic del mouse, ...)
 Ogni oggetto e’ un’entita’ autonoma





Costruzione modulare del software
Comunicazione tra oggetti tramite messaggi
Adatta al sistema client-server
Ogni procedura: programma imperativo
C++: C con funzionalita’ orientate agli oggetti
9
Cronologia dei paradigmi
10
Concetti dei programmi imperativi

Tre categorie di istruzioni:
 Istruzioni
dichiarative: dichiarano i nomi usati
nel programma, di solito all’inizio
 Istruzioni imperative: passi dell’algoritmo
 Commenti: spiegano i passi del programma
11
Variabili e tipi





Nomi che indicano una cella di memoria
Cambiando il valore in una posizione di
memoria, cambia il valore associato al nome 
variabile
Dichiarazione di una variabile e del tipo di dato
che sara’ memorizzato nella posizione di
memoria associata alla variabile
Es.: tipo intero (integer), reale (real o float), ...
Operazioni diverse su tipi diversi (es. ADD e
FADD)
12
Variabili e tipi

Es.: LimitePeso variabile con valore intero
 C,
C++, Java, C#: int LimitePeso;
Es.: FineDellaLista variabile con tipo
booleano (vero o falso)
 Tipi usati per selezionare le operazioni
giuste e per scoprire errori

 Es.:
somma di due variabili di tipi carattere
13
14
Strutture dati




Variabili come nomi per dati o strutture dati
 vari dati organizzati
 es: una lista di numeri o una matrice di nomi
Array omogeneo: blocco di valori dello stesso
tipo
 Lista monodimensionale
 Tabella bidimensionale con righe e colonne
 Tabella multidimensionale
Per creare un array: nome, lunghezza delle
dimensioni
Es.: (C)
 int Punteggio[2] [9];
 In FORTRAN: INTEGER Punteggio(2,9)
15
Accesso ad un array






Nome per l’intero array
Nome + indici (tanti quante le dimensioni) per un
singolo elemento
Linguaggi diversi hanno diversi valori iniziali
degli indici
Es.: per elemento in riga 2 e colonna 4:
 In C: Punteggio[1][3]
 In FORTRAN: Punteggio(2,4)
Flessibilita’ nell’intervallo degli indici
Es. (Pascal):
 Punteggio: array [3..4,12..20] of integer;
 Elemento in seconda riga e quarta colonna:
16
Punteggio[4,15]
Array eterogeneo (record)


Blocco di dati di tipo possibilmente diverso
Es.: Dipendente
 Nome,
tipo carattere
 Eta, tipo intero
 Valutazione, tipo reale

Accesso tramite nome del campo e non indice
 Es.:
Dipendente.Eta
17
18
Costanti


Nome associato ad un valore costante
Es.:
 Ada:
Max constant Integer := 200;
 Java: final int Max = 200;
 C++ e C#: cost Max = 200;

Uso della costante:
A<

Max
Se si vuole modificare il massimo, basta
cambiare la dichiarazione della costante
19
Istruzioni di assegnamento


Mette un valore nell’area di memoria associata
ad una variabile
Es. (C, C++, C#, Java)
Z

Ada, Pascal
Z

= X + Y;
:= X + Y;
APL
Z
X + Y
20
Espressione nell’assegnamento


Qualunque espressione algebrica, con +, -, *, /
ES.: 2*4+6/2
7
se valutata da sinistra a destra, 14 se da destra a
sinistra


Precedenza degli operatori (prima * e /, poi + e )  11
Parentesi nei linguaggi
 Es.:
2*(4+6)/2  10
21
Istruzioni di controllo
Passi elementari dell’algoritmo
 Istruzione goto: salto incondizionato
 Pericolosa in un linguaggio ad altro livello
 Genera programmi difficili da capire,
modificare e correggere

22
Esempio di goto
goto 40
20: Applica la procedure Scappa
goto 70
40: If (livello < max) then goto 60
goto 20
60: Applica la procedura Salva
70: ...
23
Esempio di goto
Programma equivalente:
If (livello < max)
then (applica la procedura Salva)
else (applica la procedura Scappa)
24
Strutture di controllo (C, C++, C#,
Java)
25
Strutture di controllo (C, C++, C#,
Java): case
26
For

Il corpo del ciclo viene eseguito un numero
fissato di volte, per tutti i valori di una
variabile intera (contatore) in un certo
intervallo
27
Esempio di for in vari linguaggi
28
Procedure





Programma + nome, che puo’ essere eseguito in
vari posti del programma
Chiamata o attivazione di procedura
Programma chiamante e chiamato
La chiamata fa iniziare l’esecuzione della
procedura chiamata e sospende l’esecuzione
del programma chiamante
Alla fine, si ritorna all’esecuzione del programma
chiamante
29
Programma chiamante e procedura
chiamata
30
Procedure
Una procedura e’ fatta come un
programma: dichiarazioni e istruzioni
 Variabili dichiarate nella procedura:
variabili locali

 Usabili
solo all’interno di quella procedura
31
Parametri
Le procedure sono scritte usando
parametri generici (formali)
 Al momento della chiamata si dicono i dati
su cui eseguire la procedura (parametri
attuali)
 Es.: procedure Ordina(Lista)

 Lista
puo’ essere una lista di nomi, o un
elenco di numeri telefonici, ...
32
Esempio di procedura in C
Es. di chiamata: ProjectPopulation(0.03)
33
Passaggio dei parametri
Trasferimento dati tra parameri attuali e
formali
 Un modo (passaggio per valore): duplicato
dei parametri attuali, passato alla
procedura  modifiche fatte dalla
procedura non si riflettono sui dati del
programma chiamante

34
35
Passaggio dei parametri
Parametri di grandi dimensioni  non
efficiente fare un duplicato  accesso
diretto ai dati del programma chiamante
(passaggio per riferimento)
 La procedura puo’ modificare i dati del
programma chiamante
 Es.: Ordina(Lista)

36
37
Esercizio
Procedura:
Procedure Modifica(Y)
Y  7;
Stampa(Y).
Programma chiamante:
X  5;
Modifica(X);
Stampa(X).


Parametro passato per valore: 7, 5
Parametro passato per riferimento: 7, 7
38
Funzioni






Scopo di una procedura: eseguire vari comandi
Scopo di una funzione: calcolare un valore
Una funzione passa questo valore all’unita’
chiamante
Es.: nel programma chiamante:
 A = Somma(Lista);
 Somma calcola la somma dei valori nella lista
 Oppure: if (A < Somma(Lista)) then ...
Dichiarazione: nome + parametri + tipo del
risultato
Istruzione che calcola il risultato (es.: return)
39
Esempio di funzione (C)
Float volumecilindro(float raggio, float altezza);
{float volume;
volume = 3.14 * raggio * raggio * altezza;
return volume;
}
Uso nel programma chiamante:
Costo = costounitario * volumecilindro(3.45,12.7);
40
Input/output
Le procedure piu’ usate sono predefinite
 Ad esempio quelle di input/output
 Es. (Pascal)

 Readln(Valore)
legge dalla tastiera e lo
assegna alla variabile Valore
 Writeln(Valore) visualizza sullo schermo il
valore della variabile Valore

In C: scanf e printf
41
Traduzione
Traduzione di un programma da un
linguaggio ad un altro
 Da programma sorgente a programma
oggetto
 Tre fasi:

 Analisi
lessicale
 Analisi sintattica (parsing)
 Generazione di codice
42
Fasi della traduzione
43
Analisi lessicale
Da programma come stringa di caratteri a
sequenza di entita’ (ognuna una stringa di
caratteri)
 Es.: 154 vano visti come una singola
entita’, un numero
 Unita’ singole (token): numeri, parole
chiave, nomi di comandi, identificatori, ...

44
Analisi sintattica





Input: sequenza di token
Raggruppa i token in istruzioni
Aiuto: parole chiave per indicare l’inizio delle
istruzioni, punto e virgola per la fine, ...
Regole per definire la sintassi di un linguaggio
Diagrammi sintattici per definire le regole
45
Diagramma sintattico per if-thenelse
46
Diagrammi sintattici per le
espressioni
47
Albero sintattico per x+(y*z)
•Fa vedere come una stringa di tokens rispetta le regole
•Analisi sintattica: costruisce l’albero sintattico del programma
48
sorgente
Generazione del codice
Da istruzioni generate dall’analisi sintattica
a istruzioni in linguaggio macchina
 Anche ottimizzazione del codice

49
Programmazione orientata agli
oggetti
Oggetto: dato + procedure che agiscono
sul dato
 Esempi in C++, Java, C#

50
Esempio





Videogioco: dobbiamo proteggere la terra da
alcune meteore sparando con un laser
Il laser ha una sorgente di alimentazione interna,
limitata
Ogni volta che il laser spara, consuma parte
della sua energia
Quando l’energia finisce, il laser non puo’ piu’
sparare
Il laser deve poter rispondere a comandi per
puntare a destra, a sinistra, e per ativare il
raggio laser
51
Esempio

Ogni laser e’ un oggetto con
 Valore
della potenza rimasta
 Procedure per modificare la direzione e sparare


Classe per descrivere un laser generico
Sintassi (C++, Java, C#):
Class Nome
{ ...}
52
Esempio
classe Laser
{ int Potenzarimasta = 100;
void puntadestra ( )
{...}
void puntasinistra ( )
{...}
void fuoco ( )
{...}
}
53
Esempio

Qualsiasi oggetto creato secondo lo
schema della classe Laser contiene:
 Una
variabile intera Potenzarimasta
 Tre procedure (metodi) puntadestra,
puntasinistra, fuoco

Oggetto: istanza di una classe
54
Esempio





Nel programma, tre variabili L1, L2, L3 di tipo
Laser
Sintassi: Laser L1, L2, L3;
Vengono creati tre oggetti secondo lo schema
della classe Laser
Per far sparare il laser 1: L1.fuoco();
Per far spostare a sinistra il laser 2:
L2.puntasinistra();
55
Programmazione dichiarativa
Algoritmo generale basato sulla logica
formale
 Es.:

 Carlo
e’ al lavoro o e’ ammalato
 Carlo non e’ al lavoro
  Carlo e’ ammalato

Risoluzione
56
Simboli



A e not(A), OR, AND,  (per implicazione):
asserzioni
Risoluzione:
 P OR Q
 R OR not(Q)
 P OR R
Se (P OR Q) e (P OR not(Q)) sono vere, allora
(P OR R) vera
 Q vero  not(Q) falso  R vero
 Q falso  P vero
 O R o P sono vere
57
Risoluzione
58
Clausole
Si applica solo ad asserzioni del tipo A OR
B (clausole)
 Qualunque formula della logica del primo
ordine puo’ essere scritta come una
clausola

 Es.:
P  Q diventa not(P) OR Q
59
Consistenza
Un insieme di asserzioni e’ inconsistente
se non e’ possibile che tutte le asserzioni
siano vere
 Es.: P e not(P)
 Usando la risoluzione ripetutamente,
posso scroprire se l’insieme e’
inconsistente: se produco la clausola
vuota

60
Esempio di inconsistenza
61
Implicazione
Vogliamo provare che un insieme di
asserzioni S implica P
 Implicare P equivale a contraddire not(P),
cioe’ far vedere che S unito a not(P) e’
inconsistente
 Applico la risoluzione a S unito not(P), e
vedo se genero la clausola vuota

62
Unificazione

Per applicare la risoluzione a
 (Carlo
e’ un X) OR not(Paolo e’ un X)
 (Paolo e’ uno studente)
Devo solo fare l’associazione X=studente
 Il risultato e’ (Carlo e’ uno studente)
 Unificazione: assegnazione di valori a
variabili

63
Prolog




PROgramming in LOGic: linguaggio di
programmazione dichiarativa il cui algoritmo
generale e’ basato sull’uso ripetuto della
risoluzione
Programma Prolog: insieme di asserzioni S
Goal: asserzione P di cui provare l’implicazione
Esecuzione del programma: risoluzione ripetuta
applicata a S unito not(P)
64
Asserzioni in Prolog

Predicati e argomenti, con valore vero o falso
 Es.:
genitore(bruno, maria).
 Vero



se bruno e’ genitore di maria
Fatto Prolog: singolo predicato
Regola Prolog: implicazione
 Es.: saggio(X) :- vecchio(X).
 Significa: se X e’ vecchio, allora X e’ saggio
Es. regole e fatti:
 piuveloce(X,Y)
:- piuveloce(X,Y), piuveloce(y,z).
 piuveloce(coniglio, tartaruga).

Programma Prolog: fatti e regole
65
Esempio
piuveloce(tartaruga,lumaca).
piuveloce(coniglio, tartaruga).
piuveloce(X,Z) :- piuveloce(X,Y), piuveloce(Y,Z).






Goal1: piuveloce(tartaruga, lumaca).  OK
Goal2: piuveloce(coniglio, tartaruga).  OK
Goal3: piuveloce(consiglio, lumaca).  OK
Goal4: piuveloce(X, lumaca).  OK se X=tartaruga
o X=coniglio
Goal5: piuveloce(coniglio,Z)  OK se Z=lumaca
Goal6: piuveloce(V,W)  Ok se ...
66
Esercizio

Insieme di asserzioni consistente?
P
OR Q OR R
 not(R) OR Q
 R OR not(P)
 not(Q)
67
Esercizio
femmina(carla).
femmina(susanna).
maschio(bruno).
maschio(giovanni).
genitore(giovanni,carla).
genitore(susanna, carla).
mamma(X,Y) :- genitore(X,Y), femmina(X).
papa(X,Y) :- genitore(X,Y), maschio(X).
Goal1: mamma(susanna, carla).
Goal2: papa(giovanni,bruno).
68
Esempi su linguaggi
69
Efficienza:
somma dei primi n numeri 1, ..., n
1.
Leggi n
2. Inizializza S a 0
3. Inizializza I a 1
4. Esegui S = S+I
5. Incrementa I (I=I+1)
6. Se I<n torna a 4, altrimenti se I=n esegui 7
7. Stampa S
Richiede n somme  O(n)
70
Secondo algoritmo
Uso
la proprieta’ S = n x (n+1) /2
1. Leggi n
2. Calcola S = n x (n+1)/2
3. Stampa S
Una sola somma, 1 prodotto, 1 divisione:
solo 3 operazioni aritmetiche  piu’
efficiente (tempo costante)
71
Esercizio: programma per
somma (C++)
Main()
{
Int X=10, Y=25, Zero=0;
X=X+Y;
If (X > Zero) Y=X);
}
72
Esercizio: minimo esponente e
tale che 2 alla e superi X (C++)
Main()
{
Int X=10, p=1, e=0;
While (X>p)
{
p=p*2;
esponente++;
}
}
73
Esempio: stampa dei numeri
da 1 a 10
main()
{
Int i;
For (i=0;i<10;i++)
Printf(“%d\n,i+1);
}
74
Esempio: funzione per xy (in Pascal)
Function potenza (base: real, esponente: integer): real;
Var risultato: real;
begin
risultato := 1;
While (esponente >0)
begin
Risultato := risultato * base;
Esponente := esponente –1;
End;
Potenza : = risultato
End;
75
Esempio: funzione per xy (in C)
Float potenza (float base, int esponente)
{
Float risultato = 1.0;
While (esponente >0)
{
Risultato = risultato * base;
Esponente = esponente –1;
}
Return risultato;
}
Es. di chiamata: z = potenza(x,3);
76
Esempio (C): inizializzazione a 0
degli elementi di una matrice 20x20
Macro: ogni occorrenza di Max e zero viene
#define Max 20
sostituita con 20 e 0.0 prima di iniziare a
#define zero 0.0; compilare (pre-processore)
main()
{
int i,j;
float A[Max][Max];
for (i=0;i<Max;i++)
for j=0; j<Max; J++)
A[i][j] = zero
}
77
Esempio (C++): determinare la posizione
del massimo in un array di interi (while)
#include <iostream>
il pre-processore include la libreria di funzioni iostream
main()
{
int a[]={10,0,5,-12,45,-9,23};
int i=1, max=A[0], pos_max=0;
while (i<7)
{
if (A[i]>max)
Output standard (video)
{
max=A[i];
pos_max=i;
Funzione << di scrittura
}
i++;
}
cout<<‘’Il massimo e’:’’<<max<<‘’ in posizione:’’ <<pos_max<<endI;
}
78
Esempio (C++): determinare la posizione
del massimo in un array di interi (for)
#include <iostream>
main()
{
int a[]={10,0,5,-12,45,-9,23};
int max=A[0], pos_max=0;
for (int i=1;i<7;i++)
if (A[i]>max)
{
max=A[i];
pos_max=i;
}
cout<<‘’Il massimo e’:’’<<max<<‘’ in posizione:’’ <<pos_max<<
endI;
79
}
Esempio (C): prodotto degli elementi di
un vettore di interi
main()
{
int num[100]={10,0,5,-12,45,-9,23, ...};
float prod = 1.0;
for (i=0;i<100;i++)
prod= prod*num[i];
printf(“il Prodotto e’”,prod);
}
80
Esempio (C): minimo e massimo di un
vettore
main()
{
int V[10]={10,0,5,-12,45,-9,23,8,10,9};
int min=max=V[0];
for (i=1;i<10;i++)
{
if (V[i]<min) min=V[i];
if (V[i]>max) max=V[i];
}
}
81
Esempio (C): trovare la posizione di un
elemento in un vettore
main()
{
int val = 45, pos, i, T[10]={10,0,5,-12,45,-9,23,8,10,9};
pos=-1; i=0;
do
{
if (val ==T[i]) pos=i;
i++;
}
}
Numero di confronti O(n): 1 nel caso migliore, n nel caso
pessimo (val non e’ contenuto in T)
82
Esempio (C): trovare la posizione di un
elemento in un vettore ordinato –
ricerca binaria
main( )
{
int sn, dx, ct, N=10, val = 45, pos, i, T[10]={10,0,5,-12,45,
9,23,8,10,9};
pos=-1; sn = 0; dx = N-1;
do
{
ct = (sn+dx+1)/2;
if (val ==T[ct]) pos = ct;
if (val < T[ct]) dx = ct-1
else sn=ct+1;
}
while (sn<=dx);
}
Numero di confronti O(log2(n))
83
Esempio (C++): numero di elementi
<0 in un array
main()
{
int num=0,T[10]={10,0,5,-12,45, 9,23,8,10,9};
for (i=0;i<10;i++)
if (T[i] < 0) num=num+1;
}
84
Esercizio: trovare il minimo e il
massimo di una matrice
main()
{
int V[10][20]={10,0,5, ...};
int min=max=V[0][0];
for (i=0;i<10;i++)
for (j=0;j<20;j++)
{
if (V[i][j]<min) min=V[i][j];
if (V[i][j]>max) max=V[i][j];
}
}
85
Esercizio: inizializzare una matrice
a righe crescenti
main()
{
int V[4][4];
for (i=0;i<4;i++)
for (j=0;j<4;j++)
{
V[i][j] = j +1 + i*4;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
86
Domande
Cos’e’
un algoritmo?
Che differenza c’e’ tra un algoritmo e un
programma?
Come si misura l’efficienza di un algoritmo?
Un algoritmo che ha complessita’ O(n) e’ piu’ o
meno efficiente di uno che ha complessita’
O(logn)? E di uno che e’ O(n2) o O(2n)?
Cosa sono le parole chiave di un linguaggio di
programmazione?
87
Domande
Cos’e’
la sintassi di un linguaggio di
programmazione? E la semantica?
Cosa si intende per linguaggi imperativi?
Cos’e’ una variabile?
Cos’e’ un’espressione Booleana?
Cos’e’ un assegnamento?
88
Domande
Descrivere
il costrutto di selezione a uno, due o piu’ rami
Descrivere i tre costrutti per l’iterazione, specificando le
loro differenze
A cosa servono le dichiarazioni in un programma?
Cos’e’ un sottoprogramma?
Che differenza c’e’ tra una procedura e una funzione?
Cosa succede quando viene chiamato un
sottoprogramma?
Cosa si intende per sottoprogramma ricorsivo?
89
Domande
Qual
e’ la funzione di un compilatore?
Cosa succede durante la fase di analisi lessicale?
E quella di analisi sintattica?
Fare degli esempi di tipi di dati semplici
Cosa sono i tipi di dati strutturati? Fare degli esempi
Quali sono le principali caratteristiche di un array?
Cosa contiene la dichiarazione di un array?
Quali sono le principali differenze tra array e record?
90