AOT
LAB
Agent and Object Technology Lab
Dipartimento di Ingegneria dell’Informazione
Università degli Studi di Parma
Fondamenti di Informatica
Linguaggi di Programmazione
Michele Tomaiuolo
AOT
LAB
Linguaggi macchina
I linguaggi macchina forniscono solo le operazioni
che l'elaboratore può eseguire:
Operazioni molto elementari
Diverse per ogni processore
Scritte in linguaggio binario
Sono più orientati alla macchina che ai problemi
da trattare
2
AOT
LAB
Linguaggi assemblativi
Una prima evoluzione sono i linguaggi
assemblativi che sostituiscono i codici binari con
codici simbolici
START:
EQUAL:
MOV
CMP
JZ
INT
RET
MOV
AX, BX
AX, 12h
EQUAL
21h
BL, 82h
I linguaggi macchina e i linguaggi assemblativi
sono detti linguaggi a basso livello
3
AOT
LAB
Linguaggi ad alto livello
I cosiddetti linguaggi ad alto livello sono stati
introdotti per facilitare la scrittura dei programmi
Sono linguaggi simbolici e in continua evoluzione
Sono definiti da un insieme di regole formali, le regole
grammaticali o sintassi
Questi linguaggi di programmazione permettono:
La descrizione del problema in modo intuitivo,
dimenticandosi che verranno eseguiti da un calcolatore
Una astrazione rispetto al calcolatore su cui verrà
eseguito il programma
Ma devono essere tradotti in linguaggio macchina
4
AOT
LAB
Storia dei linguaggi
Inizi
Assembly
Linguaggio
macchina
1945 1950




Sistema
ALGOL
Prolog
COBOL
Simula
LISP
BASIC C
FORTRAN
Pascal
1960
1970
OOP
Internet
.NET
Smalltalk
PHP
C++
Javascript
ADA
Java
1980
2000
http://www.oreilly.com/news/graphics/prog_lang_poster.pdf
http://www.levenez.com/lang/history.html
http://www.byte.com/art/9509/sec7/art19.htm
http://www.princeton.edu/~ferguson/adw/programming_languages.shtml
5
AOT
LAB
Sintassi e semantica
Le regole di sintassi definiscono come si devono
comporre i simboli e le parole per formare delle
istruzioni corrette
La semantica di un’istruzione definisce il significato
della stessa
Un programma sintatticamente corretto non è
necessariamente semanticamente corretto
I programmi fanno quello che prescriviamo che
facciano e non quello che vorremmo che
facessero
6
AOT
LAB
Sintassi e semantica
Programma sintatticamente corretto
Soddisfa le regole sintattiche
Cioè, è una sequenza di parole o simboli appartenenti
alle giuste categorie sintattiche
Programma semanticamente corretto
Soddisfa le regole semantiche
Dice se il programma ha senso, se sarà possibile
eseguirlo
Ad esempio, la frase “Il cane gioca in borsa” è
sintatticamente corretta, ma non semanticamente
7
AOT
LAB
Semantica
Correttezza semantica (typing)
Quali tipi di dato possono essere elaborati?
Quali operatori applicabili ad ogni dato?
Quali regole per definire nuovi operatori?
Effetto dell’esecuzione (semantica operazionale)
Quale è il singolo effetto di ogni azione elementare?
Quale è l’effetto dell’aggregazione delle azioni?
• Cioè quale è l’effetto dell’esecuzione di un certo programma?
8
AOT
LAB
Paradgmi di programmazione
Forniscono la filosofia con cui si scrivono i
programmi e stabiliscono:
La metodologia con cui si scrivono i programmi
Il concetto di computazione
I linguaggi devono consentire ma soprattutto
spingere all’adozione di un particolare paradigma:
Imperativo
Logico
Funzionale
Orientato agli oggetti
9
AOT
LAB
Imperativi
Fortran
Cobol
C
Pascal
Visual Basic
Funzionali
Lisp
ML
Linguaggi di programmazione
Logici
Prolog
Orientati agli Oggetti
C++
Java
C#
Smalltalk
Eiffel
10
AOT
LAB
Esempi di programma
Calcolo fattoriale
Il fattoriale del numero intero positivo n è il prodotto dei
primi n numeri interi positivi
Il fattoriale viene rappresentato con la forma n!
Gestione liste
Una lista è una delle strutture dati consistente in una
sequenza di nodi che contengono
• Campi di dati arbitrari
• Uno o due riferimenti che puntano al nodo successivo e/o
precedente
Operazioni possibili sulle liste sono aggiunta, rimozione,
ordinamento ecc. di nodi
11
AOT
LAB
Linguaggi imperativi
Un linguaggio imperativo è legato all’architettura
della macchina di Von Neumann, ma ad un livello
di astrazione vicino a quello dei diagrammi di
flusso
La principale attività del processore è assegnare
valori a celle di memoria
Le operazioni che effettuano le istruzioni di un
linguaggio imperativo si basano sul concetto di
variabile
Astrazione del concetto di locazione di memoria
12
AOT
LAB
Linguaggi imperativi
I linguaggi imperativi adottano uno stile prescrittivo
Il programma imperativo prescrive le operazioni che il
processore deve compiere
L’esecuzione delle istruzioni è nell'ordine in cui
appaiono nel programma
L’ordine può essere alterato dalle strutture di controllo
realizzate dal processore con le istruzioni di salto
13
AOT
LAB
Programma imperativo
La struttura del programma consiste
principalmente in due parti:
Una parte di dichiarazione in cui si dichiarano tutte le
variabili del programma ed il loro tipo
Una parte di istruzioni che realizzano l'algoritmo
risolutivo del problema
I tipi di istruzioni corrispondono proprio ai tipi di
istruzioni possedute dai processori
Istruzioni di lettura e scrittura
Istruzione di assegnamento
Istruzioni aritmetiche e logiche
Istruzioni di controllo
14
AOT
LAB
Fattoriale
main(…) {
printf(“%d”, fattoriale(n));
}
cc fattoriale.c
int fattoriale(int n) {
int fatt = 1;
for (int i = 1; i <= n; i++) {
fatt = fatt * i;
}
return fatt;
}
fattoriale 3
6
15
AOT
LAB
struct lista {
int val;
lista *next;
}
main(…) { … }
int aggiungi(int n, lista l) { … }
Gestione liste
cc gestisciLista.c
gestisciLista
Scegli l’operazione:
…
int rimuovi(int indice, lista l) { … }
…
16
AOT
LAB
Pregi e difetti
+ Ottima efficienza
+ Adatti a programmi numerici e gestionali
-
Scarsa naturalezza, leggibilità e flessibilità
Difficile programmazione incrementale
Non adatti per la manipolazione simbolica
Le funzioni e le variabili non sono funzioni e
variabili matematiche
- Poco adatti per applicare metodi formali di
correttezza e di verifica di programmi
- Difficile manipolazione dinamica di programmi
17
AOT
LAB
Linguaggi funzionali
In un linguaggio funzionale un programma è visto
come una funzione matematica
Una funzione è una regola di corrispondenza che
associa ad ogni elemento del suo dominio un
unico elemento nel codominio
Una definizione di funzione specifica il dominio, il
codominio e la regola di associazione
Dopo la definizione una funzione può essere
applicata ad un elemento del dominio per restituire
l'elemento associato nel codominio
18
AOT
LAB
Linguaggi funzionali
 La sola operazione del modello funzionale è l’applicazione
di funzioni ad operandi
 Il ruolo della macchina funzionale (interprete) è valutare il
programma e produrre un valore
 Il valore di una funzione è determinato solo dai suoi
argomenti
 Non ci sono effetti collaterali (funzionale puro)
 L'essenza della programmazione funzionale è combinare
funzioni
 Basato sull’utilizzo della ricorsione
 Le variabili sono variabili matematiche che denotano un
valore fisso nel tempo e non valori mutabili
 Non c’è nessun assegnamento
19
AOT
LAB
(defun fattoriale(n)
(if (= n 0)
1
(* n (fattoriale (- n 1)))
)
)
Fattoriale
(fattoriale 3)
 6
http://www.joeganley.com/code/jslisp.html
20
AOT
LAB
Gestione liste
(car (list 1 2 3))
 1
(cdr (list 1 2 3))
 (2 3)
(cons 4 (list 1 2 3))
 (4 1 2 3)
21
AOT
LAB
Pregi e difetti
+ Adatti per la manipolazione simbolica e per i problemi
naturalmente ricorsivi
+ Le funzioni e le variabili sono funzioni e variabili
matematiche
+ Adatti per applicare metodi formali di correttezza e di
verifica di programmi
+ Facile manipolazione dinamica di programmi
+ Adatti per applicazioni di Intelligenza Artificiale e
programmazione esplorativa
+ Buona naturalezza
-
Bassa efficienza
Non adatti per la manipolazione numerica
Difficile programmazione procedurale
Scarsa leggibilità e flessibilità
Non facilitano la programmazione incrementale
22
AOT
LAB
Linguaggi logici
In un linguaggio logico un programma è composto
da una base di conoscenza contenente:
Una descrizione del problema basata su formule logiche
(fatti, predicati, …)
Un insieme di regole per manipolare la descrizione del
problema
Con un linguaggio logico programmare significa:
Descrivere il problema con delle formule del linguaggio
Interrogare il sistema (motore inferenziale) per effettuare
delle inferenze
23
AOT
LAB
Linguaggi logici
 L’esecuzione di un programma corrisponde all’applicazione
delle regole alla descrizione del problema
 L’esecuzione è attivata da una interrogazione dell’utente
 Lo scopo dell’esecuzione è
•
Verificare se la descrizione del problema soddisfa l’interrogazione
•
Recuperare i valori della descrizione del problema che soddisfano
l’interrogazione
• Rispetto alle normali computazioni, il calcolo logico ha le
caratteristiche del cosiddetto non-determinismo:
 Può terminare con insuccesso
 Può concludersi con più di un caso di successo
24
AOT
LAB
Fattoriale
fattoriale(0, 1) :- !.
fattoriale(N, X) :- N > 0, M is N - 1,
fattoriale(M, Y), X is Y * N.
fattoriale(3, X)
X = 6
http://www.sfu.ca/~gholst/JLog/index.html
25
AOT
LAB
Gestione liste
aggungi([], X, X).
aggiungi([[X1 | X2], Y, [X1 | Z]) :- aggiungi(X2, Y, Z).
aggiungi([1], [1, 2], W)
W = [1, 1, 2]
26
AOT
LAB
Pregi e difetti
+ Adatti per la manipolazione simbolica e per i problemi
naturalmente ricorsivi
+ Adatti per applicare metodi formali di correttezza e di
verifica di programmi
+ Facile manipolazione dinamica di programmi
+ Adatti per applicazioni di Intelligenza Artificiale
+ Buona naturalezza
-
Bassa efficienza
Non adatti per la manipolazione numerica
Scarsa leggibilità e flessibilità
Difficile programmazione procedurale
Non facilitano la programmazione incrementale
27
AOT
LAB
Linguaggi orientati agli oggetti
 I linguaggi orientati agli oggetti si sono evoluti a partire dal
concetto di astrazione di dato introdotto in alcuni linguaggi
imperativi
 Con un linguaggio orientato agli oggetti si cerca di
rappresentare un problema descrivendo ogni entità
partecipante con un oggetto nella forma e nel
comportamento
 La definizione di un oggetto è basata su tecniche di
 Incapsulamento dei dati
 Ereditarietà
 Astrazione
 Polimorfismo
28
AOT
LAB
Linguaggi orientati agli oggetti
 Incapsulamento dei dati
 I dettagli di definizione degli oggetti sono nascosti
 Solo le operazioni (metodi) permesse su di loro sono visibili
 Ereditarietà
 Gli oggetti sono definiti in una gerarchia
 Ereditano dall’immediato parente dati e metodi
 Aggiungono dati e metodi e specializzano quelli ereditati
 Astrazione
 Il meccanismo con cui si specifica le caratteristiche peculiari di un
oggetto che lo differenzia da altri
 Polimorfismo
 Possibilità di eseguire funzioni con lo stesso nome su tipi di dati
differenti
29
AOT
LAB
Linguaggi orientati agli oggetti
In un linguaggio di programmazione orientato agli
oggetti (OOP) un programma consiste:
Definizione di un insieme di classi
Creazione di un insieme di istanze di queste classi ed
esecuzione dei loro metodi
Una classe definisce un tipo di oggetto come
insieme di:
Variabili (campi)
Funzioni (metodi)
30
AOT
LAB
class Fattoriale {
int valore;
int fattoriale(int n) {
int fatt = 1;
for (int i = 1; i <= n; i++)
fatt = fatt * i;
return fatt;
}
void main(String[] args) {
…
System.out.println(fattoriale(n));
…
}
}
Fattoriale
javac fattoriale.java
java fattoriale 3
6
31
AOT
LAB
Gestione liste
class Lista {
int val;
Lista next;
Lista aggiungi(int val) { … }
…
javac GestisciListe.java
java GestisciListe

Lista rimuovi(int indice) { … }
}
import Lista;
Class GestisciListe {
Vector<Lista> liste;
…
void main(String[] args) { …}
}
32
AOT
LAB
+
+
+
+
+
+
Pregi e difetti
Ottima flessibilità e programmazione incrementale
Ottimo riuso del software
Buona efficienza
Adatti per programmi numerici e gestionali
Abbastanza adatti per la manipolazione simbolica
Discreta naturalezza e leggibilità e flessibilità
- Poco adatti per applicare metodi formali di
correttezza e di verifica di programmi
- Difficile manipolazione dinamica di programmi
33
AOT
LAB
Paradigmi di programmazione
Imperativo
Programma = Algoritmo + Dati
Logico
Programma = Logica + Controllo
Funzionale
Programma = Funzione
Orientato agli Oggetti
Programma = Oggetti
34
AOT
LAB
Perchè più paradigmi e linguaggi?
Efficienza
Rapida prototipazione
Facile comprensione del linguaggio (leggibilità)
Modificabilità e riusabilità
Programmazione in largo
Qualità del programma
35
AOT
LAB
Programmazione multi paradigma
Rispetto alla varietà dei problemi e delle
applicazioni concrete ogni paradigma presenta
propri vantaggi e svantaggi
Per risolvere il problema si cerca di aggiungere a
un linguaggio, appartenente ad un particolare
paradigma di programmazione, caratteristiche
proprie di un altro paradigma
A volte lo stesso scopo viene raggiunto aggiungendo
particolari librerie
Un'altra soluzione, spesso adottata, è quella di
interfacciarsi con altri linguaggi
36
AOT
LAB
Ciclo di vita del software
Lo sviluppo del software è un’attività dinamica
soggetta a continue variazioni e modifiche
Si parla di manutenzione del software per indicare
l’attività che prevede la correzione ed il
miglioramento di un programma e della sua
documentazione
Il software, per questo motivo, è soggetto ad una
evoluzione nota con il nome di ciclo di vita che può
essere riassunta nello schema seguente
37
AOT
LAB
Ciclo di vita del software
Fase 1 – Analisi dei requisiti
Intervista con il cliente per la messa a punto delle
specifiche. Descrizione dell’input e dell’output mediante
variabili semplici e strutturate
Fase 2 – Progetto
Stesura dell’algoritmo, rappresentato mediante pseudo
codice, e controllo della sua funzionalità
Fase 3 – Implementazione
Codifica dell’algoritmo in un linguaggio di
programmazione dipendente dal tipo di problema
38
AOT
LAB
Ciclo di vita del software
Fase 4 – Collaudo e validazione
Procedura di prova e verifica del programma realizzato
attraverso l’esecuzione con dati campione e l’utilizzo di
utenti
Fase 5 – Redazione della documentazione
Procedura di stesura del manuale d’uso
Fase 6 – Rilascio del prodotto
Diffusione del software prodotto e della sua
documentazione per la relativa commercializzazione
Fase 7 – Manutenzione
Attività di correzione e modifica necessarie per un
migliore utilizzo o funzionamento
39