I linguaggi di alto livello
Cenni sul linguaggio macchina
Introduzione alla programmazione
Caratteristiche
programmazione
Fondamenti di Informatica
6. Linguaggi di programmazione
dei
linguaggi
di
I linguaggi di programmazione di alto livello
Compilatori ed interpreti
L’arte della programmazione
Introduzione al linguaggio C
Corso di Laurea in Ingegneria Informatica e dell’Automazione
A.A. 2012-2013
2° Semestre
Prof. Giovanni Pascoschi
Lo standard ANSI
Fondamenti di Informatica – A.A. 2012-2013
Il linguaggio macchina
a cura di Pascoschi Giovanni
2
Il linguaggio macchina
• Quando il programma è in esecuzione, è memorizzato nella
memoria principale; esso è rappresentato da una serie di numeri
binari che codificano le istruzioni eseguibili dall’unità centrale
00000000101000010000000000011000
00000000100011100001100000100001
10001100011000100000000000000000
10001100111100100000000000000100
10101100111100100000000000000000
CENNI SUL LINGUAGGIO MACCHINA
PC
• Il programma non è quindi distinguibile dai dati osservando il
contenuto della memoria; le istruzioni sono individuate dai valori
assunti dal registro PC durante l’esecuzione del programma
• Ogni codice binario codifica il tipo di istruzione (OPCODE) ed
eventuali parametri (es. registri, indirizzi in memoria)
• I primi calcolatori si programmavano direttamente in linguaggio
macchina!
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
3
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
4
Il set di istruzioni macchina
Esempio di programma in linguaggio macchina
0100000000010000
0100000000010001
0100000000010010
0100000000010011
0000000000010000
0001000000010001
0110000000000000
0010000000010100
0000000000010010
0001000000010011
0110000000000000
0001000000010100
1000000000000000
0010000000010100
0101000000010100
1101000000000000
………………………
………………………
………………………
………………………
………………………
• L’insieme delle istruzioni eseguibili, e la relativa
codifica, sono generalmente diverse per
modelli diversi di processore
• Le categorie di
disponibili sono:
istruzioni
normalmente
Trasferimento dati
dati:: spostano dati (byte, word) tra registri,
memoria principale e dispositivi di ingresso/uscita (I/O)
Aritmetico−
Aritmetico
−logiche
logiche:: eseguono i calcoli nella ALU
Salti (condizionati e incondizionati):
incondizionati): prendono decisioni e
alterano la normale esecuzione sequenziale delle istruzioni
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
5
Assembler
leggi un valore in ingresso e ponilo nella cella numero 16 (variabile x)
leggi un valore e ponilo nella cella numero 17 (variabile y)
leggi un valore e ponilo nella cella numero 18 (variabile z)
leggi un valore e ponilo nella cella numero 19 (variabile r)
carica il registro A con il contenuto della cella 16
carica il registro B con il contenuto della cella 17
somma i contenuti dei dei registri A e B
copia il contenuto del registro A nella cella 20 (risultato, variabile s)
carica il registro A con il contenuto della cella 18
carica il registro B con il contenuto della cella 19
somma i contenuti dei registi A e B
carica il registro B con il contenuto della cella 20
moltiplica i contenuti dei registri A e B
copia il contenuto del registro A nella cella numero 20
scrivi in output il contenuto della cella numero 20
arresta l’esecuzione (HALT)
spazio per la variabile x (cella 16)
spazio per la variabile y (cella 17)
spazio per la variabile z (cella 18)
spazio per la variabile r (cella 19)
spazio per la variabile s (cella 20)
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
6
Il linguaggio di programmazione
• Per facilitare la programmazione è stato definito il linguaggio
assembly
• L’assembly impiega una notazione simbolica che è in stretta
relazione con i codici in linguaggio macchina; il programma
scritto in assembly è convertito automaticamente in linguaggio
macchina per mezzo del programma traduttore, l’assembler
assembler
registro
LOAD R1, MEM1
CMP R1, R2
BREQ RISZERO
STORE R1, MEM1
RISZERO:
LOAD R2, MEM2
Assembler
LINGUAGGIO DI PROGRAMMAZIONE
indirizzo di
memoria
10001000110110101101010101010100
01001000100100000000000000000000
11000000000000000000000000001000
10011000110110101101010101010100
10001001010110101101001000001100
OPCODE
(LOAD)
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
7
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
8
Cos’è un linguaggio
Lessico, sintassi e semantica
Definizione 1 – Un linguaggio è un insieme di parole e di
metodi di combinazione delle parole usati e compresi da una
comunità di persone
Lessico: l’insieme di regole formali per la scrittura di
Lessico
singole parole in un linguaggio (p.e. no parole che
iniziano con un numero, no con triple lettere)
È una definizione poco precisa perché…
…non evita le ambiguità dei linguaggi naturali (p.e. “pesca”)
Sintassi: l’insieme di regole formali per la scrittura di
Sintassi
frasi in un linguaggio, che stabiliscono cioè la
grammatica del linguaggio stesso
…non si presta a descrivere processi computazionali automatici
…non aiuta a stabilire proprietà
Definizione 2 – Il linguaggio è un sistema matematico che
consente di rispondere a domande come:
Semantica l’insieme dei significati da attribuire alle
Semantica:
frasi (sintatticamente corrette) costruite nel linguaggio
quali sono le frasi lecite?
si può stabilire se una frase appartiene al linguaggio?
Nota una frase può essere sintatticamente corretta e
Nota:
tuttavia non avere significato!
come si stabilisce il significato di una frase?
quali sono gli elementi linguistici primitivi?
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
9
I linguaggi di programmazione #1
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
10
I linguaggi di programmazione #2
Benché siano macchine in grado di compiere operazioni
complesse, i calcolatori devono essere “guidati” per
mezzo di istruzioni appartenenti ad un linguaggio
i computer
specifico e limitato, a loro comprensibile
sono essenzialmente “stupidi”
I comandi realizzati in hardware definiscono il set di
istruzioni macchina e i programmi che li utilizzano
direttamente sono i programmi in linguaggio macchina
In linguaggio macchina…
Un linguaggio di programmazione è costituito, come
ogni altro tipo di linguaggio, da un alfabeto, con cui
viene costruito un insieme di parole chiave (il
vocabolario) e da un insieme di regole sintattiche per
l’uso corretto delle parole del linguaggio
…ogni “operazione” richiede l’attivazione di numerose
istruzioni base
…qualunque entità, istruzioni, variabili, dati, è
i programmi sono
rappresentata da numeri binari
difficili da scrivere, leggere e manutenere
A livello hardware, i calcolatori riconoscono solo
comandi semplici, del tipo copia un numero, addiziona
due numeri, confronta due numeri
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
11
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
12
I linguaggi di programmazione #3
I linguaggi di programmazione #4
Negli anni ‘50, tutti i programmi erano scritti in
linguaggio macchina o in assembly
Oggi si utilizza l’assembly solo se esistono vincoli stringenti
sui tempi di esecuzione; viceversa, si usano linguaggi più
vicini al linguaggio naturale, i linguaggi di alto livello
In assembly…
I linguaggi di alto livello sono elementi intermedi di una
varietà di linguaggi ai cui estremi si trovano il linguaggio
macchina, da un lato, ed i linguaggi naturali, come l’italiano
e l’inglese, dall’altro
…ogni istruzione è identificata da una sigla piuttosto che
da un codice numerico
…il riferimento alle variabili viene effettuato per mezzo di
nomi piuttosto che mediante indirizzi di memoria
I linguaggi di programmazione
differiscono comunque dai
linguaggi naturali: sono infatti
meno espressivi ma più
precisi
Sono semplici e poveri (poche
parole chiave, poche regole),
ma privi di qualsiasi ambiguità
I programmi scritti in assembly necessitano di un
apposito programma assemblatore per tradurre le
istruzioni tipiche del linguaggio in istruzioni macchina
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
13
Astrazione #1
Astrazione
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
14
Astrazione #2
Esistono, quindi, diversi livelli di astrazione:
In informatica si parla di programmazione a basso livello
quando si utilizza un linguaggio molto vicino alla
macchina
Si parla invece di programmazione di alto livello quando
si utilizzano linguaggi più sofisticati ed astratti, slegati
dal funzionamento fisico della macchina
Si viene così a creare una gerarchia di linguaggi, dai
meno evoluti (il linguaggio macchina o l’assembler) ai
Pascal, Perl
Perl, Java
Java, etc.)
più evoluti (Pascal
Linguaggio macchina e Assembler
Implicano la conoscenza dettagliata delle caratteristiche della
macchina (registri, dimensione dati, set di istruzioni)
Semplici algoritmi implicano la specifica di molte istruzioni
Linguaggi di alto livello
Il programmatore può astrarre
dai dettagli legati all’architettura
ed esprimere i propri algoritmi in
modo simbolico
Sono
indipendenti
dalla
macchina
hardware
sottostante
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
15
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
16
Evoluzione dei linguaggi di programmazione
Linguaggi di programmazione di alto livello #1
Consentono al programmatore di trattare oggetti complessi
senza doversi preoccupare dei dettagli della particolare
macchina sulla quale il programma viene eseguito
Richiedono un compilatore o un interprete che sia in
grado di tradurre le istruzioni del linguaggio di alto livello in
istruzioni macchina di basso livello, eseguibili dal calcolatore
Un compilatore è un programma traduttore simile ad un
assemblatore, ma più complesso, infatti…
…esiste una corrispondenza biunivoca
assembler ed istruzioni macchina
fra
istruzioni
in
…ogni singola istruzione di un linguaggio di alto livello
corrisponde a molte istruzioni in linguaggio macchina: quanto
più il linguaggio si discosta dal linguaggio macchina, tanto più
il lavoro di traduzione del compilatore è difficile
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
17
Linguaggi di programmazione di alto livello #2
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
18
Linguaggi di programmazione di alto livello #3
I linguaggi che non dipendono dall’architettura della
macchina offrono due vantaggi fondamentali:
Portabilità: i programmi scritti per un calcolatore possono
Portabilità
essere utilizzati su qualsiasi altro calcolatore, previa
ricompilazione
i programmatori non devono cimentarsi con gli aspetti
architetturali di ogni calcolatore
Leggibilità la relativa similitudine con i linguaggi naturali
Leggibilità:
rende i programmi più semplici, non solo da scrivere, ma
anche da leggere
Manutenibilità: facilità nell’effettuare modifiche di tipo
Manutenibilità:
correttivo, perfettivo, evolutivo e adattivo
i programmi risultano più semplici da leggere e da
modificare
⇒ portabilità
portabilità, leggibilità,
leggibilità manutenibilità
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
19
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
20
Tipi di linguaggi di programmazione
Compilatori ed interpreti #1
Affinché un programma scritto in un qualsiasi linguaggio di
programmazione sia comprensibile (e quindi eseguibile) da
parte di un calcolatore, occorre tradurlo dal linguaggio
originario al linguaggio macchina
Sulla base dell’ambito in cui si colloca il problema da
risolvere, è opportuno adottare un linguaggio piuttosto
che un altro:
Ogni traduttore è in grado di comprendere e tradurre un solo
linguaggio
Calcolo scientifico:
scientifico Fortran, C
Il traduttore converte il testo di un programma scritto in un
particolare linguaggio di programmazione (sorgente
sorgente) nella
corrispondente rappresentazione in linguaggio macchina
(programma eseguibile)
eseguibile
Intelligenza Artificiale:
Artificiale Prolog, Lisp, C
Applicazioni gestionali:
gestionali Cobol, SQL, C
Sistemi operativi:
operativi Assembler, C
Applicazioni visuali:
visuali C++, Java, Visual Basic
Applicazioni Web:
Web Java, PHP, ASP
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
21
Compilatori ed interpreti #2
22
Esempio di compilatore
Dobbiamo sottoporre un curriculum, in inglese, ad una
azienda, ma non conosciamo l’inglese
PRIMA si traduce tutto il programma
Abbiamo bisogno di un traduttore che traduca quanto
scritto da noi dall’italiano all’inglese
POI si esegue la versione tradotta
il
contattiamo il traduttore
programma
il traduttore riceve il testo da tradurre
Traduzione ed esecuzione sono intercalate
di un’istruzione alla volta
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
Compilatori ed interpreti #3
Compilatore: opera la traduzione di un programma
Compilatore
sorgente (scritto in linguaggio di alto livello) in un
programma oggetto direttamente eseguibile dal
calcolatore
Interprete
Interprete:
traduce ed esegue
sorgente, istruzione per istruzione
Fondamenti di Informatica – A.A. 2012-2013
il traduttore fornisce il testo tradotto
esecuzione
a cura di Pascoschi Giovanni
possiamo sottoporre il nostro curriculum all’azienda
23
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
24
Compilatori ed interpreti #4
Compilatori ed interpreti #5
Riassumendo…
Esempio di interprete
I compilatori traducono un intero programma dal linguaggio di
alto livello al linguaggio macchina della macchina prescelta:
Dobbiamo incontrare un manager cinese per motivi di
lavoro ma non conosciamo il cinese
traduzione e esecuzione procedono separatamente
al termine della compilazione è disponibile la versione tradotta
del programma
la versione tradotta è però specifica per quella macchina
per eseguire il programma basta avere disponibile la versione
tradotta (non è necessario ricompilare)
Abbiamo bisogno di un interprete che traduca il nostro
dialogo
contattiamo l’interprete
parliamo in italiano, in presenza dell’interprete
Gli interpreti invece traducono e immediatamente eseguono il
programma istruzione per istruzione, infatti:
contemporaneamente l’interprete comunica al manager
cinese quanto detto da noi e viceversa
traduzione ed esecuzione procedono insieme
al termine non vi è alcuna versione tradotta del programma
originale
se si vuole rieseguire il programma occorre anche ritradurlo
Il compito dell’interprete si svolge contestualmente
all’incontro col manager cinese
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
25
Compilatori ed interpreti #6
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
26
L’arte della programmazione #1
L’esecuzione di un programma compilato è più
veloce dell’esecuzione di un programma interpretato
I linguaggi interpretati sono tipicamente più flessibili e
semplici da utilizzare
Per distribuire un programma interpretato si deve
necessariamente distribuire il codice sorgente, rendendo
possibili operazioni di “copia”
Nei programmi interpretati, è facilitato il rilevamento di
errori di run−time
La soluzione di un problema tramite un programma è
un procedimento che non si esaurisce nello scrivere
codice in un dato linguaggio di programmazione, ma
comprende una fase di progetto, che precede, e di
verifica, che segue, la scrittura del codice
Definizione del problema
Analisi
Algoritmo per la soluzione del problema
Codifica
Debugging
Validazione
Programmazione
Documentazione
Manutenzione
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
27
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
28
L’arte della programmazione #2
1.
L’arte della programmazione #3
3.
Definizione del problema
Traduzione dell’algoritmo in istruzioni del linguaggio di
programmazione
Definizione degli ingressi e delle uscite (I/O)
4.
quali variabili
quale dominio per ogni variabile (intervallo di valori)
Definizione dell’algoritmo
a cura di Pascoschi Giovanni
29
L’arte della programmazione #4
sintattici
e
Fondamenti di Informatica – A.A. 2012-2013
alle
aspettative/alla
a cura di Pascoschi Giovanni
30
I commenti #1
Validazione
Perché commentare e documentare i programmi?
Test su tutte le condizioni operative del programma
I programmi vengono utilizzati più volte nel corso di
tempi lunghi (mesi, anni) per…
Test su input estremi (es., vettori di dimensione 0 o 1,
variabili nulle)
…fare cambiamenti (aggiunta di caratteristiche)
Documentazione
…risolvere errori
Inserimento di commenti esplicativi nelle varie parti del
programma per facilitarne la comprensione (dopo
molto tempo dalla stesura o per terze persone)
7.
errori
Comportamento non aderente
intenzionalità del programmatore
Soluzione mediante diagramma a blocchi strutturato
6.
degli
Errori semantici
Soluzione in pseudocodice
5.
correzione
Espressioni non valide o non ben formate nel linguaggio
di programmazione
Scomposizione in problemi più semplici
Fondamenti di Informatica – A.A. 2012-2013
Debugging,
Debugging
semantici
Errori sintattici
Risoluzione delle ambiguità
2.
Codifica
Commentare il programma serve a rendere chiaro ed
evidente lo scopo delle varie parti del codice
Manutenzione
Modifica del programma per soddisfare il cambiamento
delle specifiche con cui deve operare
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
31
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
32
I commenti #2
Il linguaggio C
Inoltre:
Si devono evitare commenti inutili
Si deve evitare di inserirne “troppo pochi”
INTRODUZIONE AL LINGUAGGIO
C
Un buon metodo per verificare il livello di
documentazione è quello di leggere solo i commenti (e
non il codice) ed ottenere una chiara idea su “cosa fa
un programma e come lo fa”
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
33
Storia del linguaggio C #1
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
Storia del linguaggio C #2
Il linguaggio C venne definito alla fine degli anni ‘60 da
Dennis M. Ritchie, degli AT&T Bell Labs, come
Oggi molti sistemi operativi sono sviluppati in C o C++
linguaggio di programmazione di sistema
I vantaggi fondamentali della scrittura di sistemi operativi in
linguaggio di alto livello sono la velocità di sviluppo e la
manutenibilità
Il linguaggio C doveva essere…
…un linguaggio di livello sufficientemente alto per
garantire ai programmi leggibilità e manutenibilità
Come effetto collaterale si ottiene un sistema operativo che
può essere trasferito su architetture diverse, tramite
ricompilazione su macchina target: porting
…un linguaggio sufficientemente semplice da stabilire
una corrispondenza immediata con la macchina
sottostante
Nel 1977, Ritchie e Brian Kernighan pubblicarono “The
The C
Programming Language”,
Language che formalizza lo standard K&R
Inizialmente il linguaggio C veniva usato soprattutto sui
sistemi UNIX (PCC − Portable C Compiler) ma, con la
diffusione dei PC, compilatori C furono prodotti per nuove
architetture e nuovi sistemi operativi
…indipendente dall’hardware e quindi portabile
Il linguaggio C si dimostrò così flessibile, ed il codice
macchina prodotto così efficiente che, nel 1973, Ritchie
e Ken Thompson riscrissero UNIX in C
Fondamenti di Informatica – A.A. 2012-2013
34
a cura di Pascoschi Giovanni
35
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
36
ANSI C
Caratteristiche del linguaggio C
Nel 1983, l’American National Standards Institute
(ANSI), costituì la commissione X3J11, che doveva
formulare uno standard per il C, che includesse le
nuove caratteristiche che il linguaggio aveva
progressivamente
maturato,
mantenendone
la
portabilità
Linguaggio di medio/alto livello; basso livello di
controllo degli errori nella fase di compilazione
Variabili tipizzate, con notevoli possibilità di
conversione mediante il type casting, che permette di
forzare una variabile a cambiare tipo
La versione finale dello standard C fu approvata
dall’ANSI nel 1989
Lo Standard ANSI C è descritto nel documento
“American National Standard for Information Systems −
Abbina ad un livello medio/alto di astrazione, un buon
controllo delle operazioni a basso livello
Programming Language C”
Lo standard è stato rivisto ed aggiornato nel 1999
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
37
Sommario della lezione
Fondamenti di Informatica – A.A. 2012-2013
a cura di Pascoschi Giovanni
38
a cura di Pascoschi Giovanni
40
Fine della lezione
Linguaggi di programmazione
Cenni sul linguaggio macchina
Linguaggi di programmazione di alto livello
Compilatori/interpreti
Introduzione al linguaggio C
Fondamenti di Informatica – A.A. 2012-2013
Domande?
a cura di Pascoschi Giovanni
39
Fondamenti di Informatica – A.A. 2012-2013