I linguaggi di alto livello
1
Anno accademico 2010-2011
Sommario
• Introduzione alla programmazione
Caratteristiche dei linguaggi di programmazione
I linguaggi di programmazione di alto livello
Compilatori e interpreti
L’arte della programmazione
• Storia del linguaggio C
Lo standard ANSI
2
Anno accademico 2010-2011
Introduzione alla programmazione
3
Anno accademico 2010-2011
Cos’è un linguaggio
• Definizione 1 Un linguaggio è un insieme di parole e di
metodi di combinazione delle parole usati e compresi da una
comunità di persone
• È una definizione poco precisa perché…
Non evita le ambiguità dei linguaggi naturali
Non si presta a descrivere processi computazionali automatici
Non aiuta a stabilire proprietà
• Definizione 2 Il linguaggio è uno strumento matematico
che consente di rispondere a domande come:
Quali sono gli elementi linguistici primitivi?
Quali sono le frasi lecite?
Si può decidere se una frase appartiene o no al linguaggio?
Come si stabilisce il significato di una frase?
Anno accademico 2010-2011
4
Lessico, sintassi e semantica
• Lessico: l’insieme di regole formali per la scrittura di
parole in un linguaggio
• Sintassi: l’insieme di regole formali per la scrittura di
frasi in un linguaggio, che stabiliscono cioè la
grammatica del linguaggio stesso
• Semantica: l’insieme dei significati da attribuire alle
frasi (sintatticamente corrette) costruite nel linguaggio
• Nota: una frase può essere sintatticamente corretta e
tuttavia non avere significato!
“Sento il micino che cinguetta e annaffio nel giardino le mie
mimose blu…”
5
Anno accademico 2010-2011
Esempio: la sintassi di un numero naturale
<cifra-non-nulla> : 1|2|3|4|5|6|7|8|9
<cifra> : 0 | <cifra-non-nulla>
<naturale> : 0 | <cifra-non-nulla>{<cifra>}
Anno accademico 2010-2011
Diagramma sintattico
6
I linguaggi di programmazione:
Cenni storici 1
• Benché siano macchine in grado di compiere operazioni
complesse, i calcolatori devono essere “guidati” per
mezzo di istruzioni appartenenti ad un linguaggio
specifico e limitato, a loro comprensibile
• 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
• A livello hardware, i calcolatori riconoscono solo
comandi semplici, del tipo copia un numero, addiziona
due numeri, confronta due numeri
7
Anno accademico 2010-2011
I linguaggi di programmazione:
Cenni storici 2
• I primi linguaggi di programmazione coincidevano con
l’insieme delle istruzioni eseguibili dall’hardware
• Le istruzioni hardware sono codificate in codice binario:
ogni informazione è rappresentata, all’interno della
macchina, come una sequenza di bit
Enorme sforzo programmativo richiesto per codificare
algoritmi semplici
• I comandi realizzati in hardware definiscono il set di
istruzioni macchina e i programmi che li utilizzano
direttamente sono i programmi in linguaggio macchina
8
Anno accademico 2010-2011
I linguaggi di programmazione:
Cenni storici 3
• In linguaggio macchina…
…ogni “operazione” richiede l’attivazione di numerose
istruzioni base
…qualunque entità, istruzioni, variabili, dati, è
rappresentata da numeri binari: i programmi sono difficili
da scrivere, leggere e manutenere
• Il linguaggio macchina riflette l’organizzazione della
macchina più che la natura del problema da risolvere
• Dalla nascita dei primi calcolatori, si è cercato di
diminuire lo sforzo ed aumentare la produttività
dell’utente, anche a costo di caricare la macchina di
maggiori compiti
Anno accademico 2010-2011
9
I linguaggi di programmazione:
Cenni storici 4
• La prima evoluzione dei linguaggi di programmazione
ha portato ad una codifica di tipo simbolico, anziché
binaria, dei programmi
• Tali versioni simboliche dei linguaggi hardware sono
note come linguaggi assemblatori, dal termine usato
per indicare i programmi traduttori che, ricevendo come
dato la versione simbolica di un programma, producono
come risultato la corrispondente forma binaria
direttamente eseguibile dalla macchina
• Per la prima volta, con la nascita degli assembler, fu
applicato il principio che è meglio risparmiare il tempo
dell’uomo anche a costo di sprecare tempomacchina
(una parte del tempo è dedicata alla traduzione di
programmi, non alla loro esecuzione)
Anno accademico 2010-2011
10
I linguaggi di programmazione:
Cenni storici 5
• Negli anni ‘50, tutti i programmi erano scritti in
linguaggio macchina o in assembly
• In assembly…
…le istruzioni corrispondono univocamente alle istruzioni
macchina, ma vengono espresse tramite nomi simbolici
(parole chiave) piuttosto che mediante codici numerici
…il riferimento alle variabili viene effettuato per mezzo di
nomi piuttosto che con indirizzi di memoria
• I programmi scritti in assembly necessitano di un
apposito programma assemblatore per tradurre le
istruzioni tipiche del linguaggio in istruzioni macchina
11
Anno accademico 2010-2011
I linguaggi di programmazione:
Cenni storici 6
• Il passo successivo nell’evoluzione dei linguaggi di
programmazione tese a rendere la codifica degli
algoritmi il più possibile “vicina” al problema da
risolvere, anziché all’architettura della macchina
destinata all’esecuzione del programma
I primi due linguaggi di alto livello, FORTRAN e COBOL,
hanno costrutti fortemente ispirati alla notazione usata,
negli anni ‘50, per l’elaborazione numerica e gestionale
12
Anno accademico 2010-2011
I linguaggi di programmazione:
Cenni storici 7
• Negli anni ‘60:
Grande sforzo per razionalizzare la definizione e le
tecniche di implementazione dei linguaggi, reso
necessario dallo sviluppo quantitativamente impetuoso
delle applicazioni
Definizione dell’ALGOL 60, il capostipite dei moderni
linguaggi, basato sui principi della programmazione
strutturata
Proliferazione selvaggia, favorita dalle industrie, di nuovi
linguaggi, sia general purpose che rivolti a specifici
settori applicativi
13
Anno accademico 2010-2011
I linguaggi di programmazione:
Cenni storici 8
• Negli anni ‘70:
Si diffondono i linguaggi strutturati, quali il SIMULA 67,
capostipite dei linguaggi ObjectOriented, l’ALGOL 68,
ma soprattutto il PASCAL, primo esempio di prodotto di
origine accademica che abbia conosciuto vasto
successo ed applicazione nel mondo dell’industria
In modo simile, il C, concepito come un assembler
strutturato per trasportare facilmente UNIX, ha finito
per diventare il linguaggio più affermato nella
programmazione di sistema
14
Anno accademico 2010-2011
I linguaggi di programmazione:
Cenni storici 9
• Il periodo a cavallo tra gli anni ‘70 ed ‘80 è segnato da
tendenze contraddittorie:
Viene lanciata dal Dipartimento della Difesa americano
l’iniziativa per la definizione e la realizzazione di un
nuovo linguaggio, che l’ente intende imporre come
proprio standard
ADA dovrebbe rappresentare il punto di maturazione
perfetta di tutti i principi di progettazione software e dei
meccanismi linguistici elaborati negli anni precedenti
Si moltiplicano i nuovi linguaggi tesi a rendere più
gradevole ed efficiente la programmazione tradizionale e
si ha l’affermarsi definitivo dei linguaggi objectoriented
(C, Visual BASIC, Java)
15
Anno accademico 2010-2011
I linguaggi di programmazione:
Cenni storici 10
• Nei linguaggi di alto livello ogni singola istruzione consente
di effettuare un’operazione semplice, ma completa
• 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
• 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à
16
Anno accademico 2010-2011
Astrazione 1
• In informatica si parla di programmazione di 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
più evoluti (Pascal, Perl, Java, etc.)
• In questa gerarchia il linguaggio C si pone ad un livello
intermedio
Anno accademico 2010-2011
17
Astrazione 2
• Esistono, quindi, diversi livelli di astrazione:
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
18
Anno accademico 2010-2011
Evoluzione dei linguaggi di programmazione
19
Anno accademico 2010-2011
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 complesso,
infatti…
…mentre esiste una corrispondenza biunivoca fra istruzioni in
assembler ed istruzioni macchina
…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
20
Anno accademico 2010-2011
Linguaggi di programmazione
di alto livello 2
• I linguaggi che non dipendono dall’architettura della
macchina offrono due vantaggi fondamentali:
i programmatori non devono cimentarsi con i dettagli
architetturali di ogni calcolatore
i programmi risultano più semplici da leggere e da
modificare
portabilità, leggibilità, manutenibilità
21
Anno accademico 2010-2011
Linguaggi di programmazione
di alto livello 3
• Portabilità: i programmi scritti per un calcolatore possono
essere utilizzati su qualsiasi altro calcolatore, previa
ricompilazione
• Leggibilità: la relativa similitudine con i linguaggi naturali
rende i programmi più semplici, non solo da scrivere, ma
anche da leggere
• Manutenibilità: facilità nell’effettuare modifiche di tipo
correttivo, perfettivo, evolutivo e adattivo
• La possibilità di codificare algoritmi in maniera astratta si
traduce in una migliore comprensibilità del codice e quindi in
una più facile analisi di correttezza
Anno accademico 2010-2011
22
Linguaggi di programmazione
di alto livello 4
• Eventuale svantaggio dell’uso dei linguaggi di alto livello è la
riduzione di efficienza
È possibile utilizzare successioni di istruzioni macchina diverse
per scrivere programmi funzionalmente equivalenti: il
programmatore ha un controllo limitato sulle modalità con cui
il compilatore traduce il codice
Tuttavia… i compilatori attuali ricorrono a trucchi di cui molti
programmatori ignorano l’esistenza
• La ragione fondamentale per decretare la superiorità dei
linguaggi di alto livello consiste nel fatto che la maggior
parte dei costi di produzione del software è localizzata nella
fase di manutenzione, per la quale leggibilità e portabilità
sono cruciali
Anno accademico 2010-2011
23
Linguaggi di programmazione
di alto livello 5
• Possiamo aggregare i numerosi linguaggi di
programmazione esistenti sulla base del modello
astratto di programmazione che sottintendono e che è
necessario adottare per utilizzarli
Linguaggi di
programmazione
Imperativi
Procedurali
(C, Pascal)
Ad oggetti
(C++, Java)
Anno accademico 2010-2011
Dichiarativi
Paralleli
Funzionali
(Lisp)
Logici
(Prolog)
24
Linguaggi di programmazione
di alto livello 6
• Linguaggi imperativi
Il modello computazionale è basato sul
cambiamento di stato
della memoria della macchina
È centrale il concetto di assegnazione di un valore ad una
(variabile) locazione di memoria
Il compito del programmatore è costruire una sequenza di
assegnazioni che producano lo stato finale (in modo tale che
questo rappresenti la soluzione del problema)
• Linguaggi dichiarativi
Il modello computazionale è basato sui concetti di
relazione
funzione e
Il programmatore non ragiona in termini di assegnazioni di
valori, ma di relazioni tra entità e di valori di una funzione
25
Anno accademico 2010-2011
Linguaggi di programmazione
di alto livello 7
• Sulla base dell’ambito in cui si colloca il problema da
risolvere, è opportuno adottare un linguaggio piuttosto
che un altro:
Calcolo scientifico: Fortran, C
Intelligenza artificiale: Prolog, Lisp, C
Applicazioni gestionali: Cobol, SQL, C
Sistemi operativi: Assembler, C
Applicazioni visuali: C, Java, Visual Basic
Applicazioni Web: Java, PHP, ASP
26
Anno accademico 2010-2011
I programmi traduttori 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 della macchina
• Ogni traduttore è in grado di comprendere e tradurre un solo
linguaggio
• Il traduttore converte il testo di un programma scritto in un
particolare linguaggio di programmazione (sorgente) nella
corrispondente rappresentazione in linguaggio macchina
(eseguibile)
27
Anno accademico 2010-2011
I programmi traduttori 2
• Compilatore: opera la traduzione di un programma
sorgente (scritto in linguaggio di alto livello) in un
programma direttamente eseguibile dal calcolatore
PRIMA si traduce tutto il programma
POI si esegue la versione tradotta
• Interprete: traduce ed esegue il programma sorgente,
istruzione per istruzione
Traduzione ed esecuzione sono intercalate
28
Anno accademico 2010-2011
I programmi traduttori 3
29
Anno accademico 2010-2011
Il compilatore 1
• Eseguire un programma scritto in un linguaggio compilato
Il programma P scritto in linguaggio L viene dato in
ingresso a un programma PComp
PComp è il programma compilatore del linguaggio L (ad
esempio il programma compilatore del C)
L’esecuzione da parte di un calcolatore di PComp su P
(dove P è il dato di ingresso) produce Pexe FASE di
COMPILAZIONE (compile time)
L’esecuzione da parte di un calcolatore di Pexe su
particolari dati in input produce i relativi risultati FASE
di ESECUZIONE (run time)
Anno accademico 2010-2011
30
Il compilatore 2
• Esempio di compilatore
Dobbiamo sottoporre un curriculum, in inglese, ad una
azienda, ma non conosciamo l’inglese
Abbiamo bisogno di un traduttore che traduca quanto
scritto da noi dall’italiano all’inglese
contattiamo il traduttore
il traduttore riceve il testo da tradurre
il traduttore fornisce il testo tradotto
possiamo sottoporre il nostro curriculum all’azienda
31
Anno accademico 2010-2011
Il compilatore 3
• Compilatore
Analisi lessicale token (parole)
Analisi sintattica albero sintattico
Analisi
simboli
Anno accademico 2010-2011
semantica
tabella
dei
32
Il compilatore 4
• L’analizzatore lessicale trasforma il programma sorgente da
stringa di caratteri a stringa di token
• Un token è un simbolo che esprime la natura di un elemento
del linguaggio
Punteggiatura ed operatori vengono trasformati direttamente
in token
Per parole riservate, nomi di variabili e costanti, l’analizzatore
deve determinare il token appropriato, esaminando sia la
stringa di caratteri, sia il contesto
Ogni identificatore viene inserito nella tabella dei simboli ed i
suoi attributi vengono aggiornati nella fase di analisi semantica
33
Anno accademico 2010-2011
Il compilatore 5
• L’output del’analisi lessicale è un insieme di coppie, il cui
primo elemento identifica la classe del token ed il secondo
punta alla posizione del token e dei suoi attributi nella
tabella dei simboli
Alcuni token non richiedono attributi e dunque avranno
puntatori nulli (ad es., operatori e parole riservate del
linguaggio)
34
Anno accademico 2010-2011
Il compilatore 6
35
Anno accademico 2010-2011
Il compilatore 7
• L’analizzatore sintattico (o parser) permette la costruzione
dell’albero di derivazione del particolare programma basato
sulla grammatica del linguaggio
36
Anno accademico 2010-2011
Il compilatore 8
• L’analizzatore semantico, infine, usa l’albero di derivazione
per generare una rappresentazione intermedia e completare
la tabella di simboli
Un altro ruolo svolto dall’analizzatore semantico è la scoperta
di errori dipendenti dal contesto (tipi di dati che non
corrispondono, variabili non dichiarate, etc.)
37
Anno accademico 2010-2011
Il compilatore 9
• Il generatore di codice traduce la rappresentazione
intermedia in linguaggio assembler o linguaggio macchina
• Prima della generazione di codice:
Allocazione della memoria
Allocazione dei registri
• L’ottimizzatore del codice intermedio effettua trasformazioni
atte a migliorare l’efficienza del codice eseguibile finale
38
Anno accademico 2010-2011
Il compilatore 10
Traduzione da algoritmo a codice C e da C ad Assembler
Anno accademico 2010-2011
39
Il compilatore 11
Interazione fra compilatore, SO e hardware
Anno accademico 2010-2011
40
Compilatore e linker 1
• I compilatori consentono tipicamente
separata di parti di programmi (moduli)
la
compilazione
• I diversi moduli possono essere progettati, costruiti e messi
a punto separatamente, e archiviati in opportune librerie
• Nel momento in cui un programma deve essere eseguito, un
programma apposito, detto linker, si occupa di collegare
opportunamente fra loro i moduli oggetto
• Il risultato dell’esecuzione del linker è un unico modulo,
detto modulo eseguibile, pronto per il caricamento in
memoria e l’esecuzione
41
Anno accademico 2010-2011
Compilatore e linker 2
Il ruolo del linker
Anno accademico 2010-2011
42
Compilatore e linker 3
Da sorgente ad eseguibile
Anno accademico 2010-2011
43
L’interprete 1
• Eseguire un programma scritto in un linguaggio interpretato
Il programma P scritto in linguaggio L viene dato in
ingresso a un programma PInt
PInt è il programma interprete del linguaggio L (ad
esempio il programma interprete del Python)
L’esecuzione da parte di un calcolatore di PInt su P, con i
dati di ingresso a P, produce i relativi risultati
44
Anno accademico 2010-2011
L’interprete 2
• Esempio di interprete
Dobbiamo incontrare un manager cinese per motivi di
lavoro ma non conosciamo il cinese
Abbiamo bisogno di un interprete che traduca il nostro
dialogo
contattiamo l’interprete
parliamo in italiano, in presenza dell’interprete
contemporaneamente l’interprete comunica al manager
cinese quanto detto da noi (e viceversa)
Il
compito dell’interprete si svolge contestualmente
all’incontro col manager cinese
45
Anno accademico 2010-2011
L’interprete 3
Interazione fra interprete, SO e hardware
Anno accademico 2010-2011
46
Compilatori e interpreti 1
• Riassumendo…
I compilatori traducono un intero programma dal linguaggio L al
linguaggio macchina della macchina prescelta:
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)
Gli interpreti invece traducono e immediatamente eseguono il
programma istruzione per istruzione, infatti:
traduzione ed esecuzione procedono insieme
al termine non vi è alcuna versione tradotta del programma originale
se si vuole rieseguire il programma occorre anche ritradurlo
47
Anno accademico 2010-2011
Compilatori e interpreti 2
• L’esecuzione di un programma compilato è generalmente
più veloce dell’esecuzione di un programma interpretato
(nella compilazione si possono attuare processi di
ottimizzazione dell’eseguibile), tuttavia…
L’interprete ha il vantaggio di tradurre solo le istruzioni che
effettivamente esegue, riducendo al minimo l’operazione di
traduzione nel caso in cui l’esecuzione venga terminata o
un gruppo di istruzioni non facciano parte del flusso
esecutivo corrente
Un compilatore ha il vantaggio di tradurre una sola volta
l’intero programma e reiterare certe istruzioni (iterazioni)
per il numero di volte richiesto dalla particolare esecuzione
48
Anno accademico 2010-2011
Compilatori ed interpreti 3
• I linguaggi interpretati sono tipicamente più flessibili e
semplici da utilizzare (nei linguaggi compilati esistono
maggiori limitazioni alla semantica dei costrutti)
• Per distribuire un programma interpretato si deve
necessariamente distribuire il codice sorgente,
rendendo possibili operazioni di plagio
• Nei programmi interpretati, è facilitato il rilevamento di
errori di runtime
49
Anno accademico 2010-2011
L’arte della programmazione 1
• 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
Algoritmo per la soluzione del problema
Analisi
Codifica
Debugging
Validazione
Programmazione
Documentazione
Manutenzione
Anno accademico 2010-2011
50
L’arte della programmazione 2
• Definizione del problema
Definizione degli ingressi e delle uscite
quali variabili
quale dominio per ogni variabile
Risoluzione delle ambiguità
Scomposizione in (sotto)problemi più semplici
• Definizione dell’algoritmo
Soluzione in pseudocodice
Soluzione mediante diagramma a blocchi strutturato
51
Anno accademico 2010-2011
L’arte della programmazione 3
• Codifica
Traduzione dell’algoritmo in istruzioni del linguaggio di
programmazione
• Debugging, correzione degli errori sintattici e semantici
Errori sintattici
Espressioni non valide o non ben formate nel linguaggio di
programmazione
Errori semantici
Comportamento non aderente
intenzionalità del programmatore
alle
aspettative/alla
52
Anno accademico 2010-2011
L’arte della programmazione 4
• Validazione
Test su tutte le condizioni operative del programma
Test su input estremi (es., vettori di dimensione 0 o 1,
variabili nulle)
• Documentazione
Inserimento di commenti esplicativi nelle varie parti del
programma per facilitarne la comprensione (dopo molto
tempo dalla stesura o per terze persone)
• Manutenzione
Modifica del programma per soddisfare al cambiamento
delle specifiche con cui deve operare
53
Anno accademico 2010-2011
I commenti 1
• Perché commentare e documentare i programmi?
I programmi vengono utilizzati più volte nel corso di
tempi lunghi (mesi, anni) per…
…fare cambiamenti (aggiunta di caratteristiche)
…risolvere errori
Commentare il programma serve a rendere chiaro ed
evidente lo scopo delle diverse parti del codice
54
Anno accademico 2010-2011
I commenti 2
• Inoltre:
Si devono evitare commenti inutili
Si deve evitare di inserirne “troppo pochi”
• 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”
55
Anno accademico 2010-2011
Storia del linguaggio C
56
Anno accademico 2010-2011
Storia del linguaggio C 1
• Il linguaggio C venne definito alla fine degli anni ‘60 da
Dennis M. Ritchie, degli AT&T Bell Labs, come
linguaggio di programmazione di sistema
• Il linguaggio C doveva essere…
…un
linguaggio di livello sufficientemente alto per
garantire ai programmi leggibilità e manutenibilità
…un linguaggio sufficientemente semplice da stabilire
una corrispondenza immediata con la macchina
sottostante
…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
Anno accademico 2010-2011
57
Storia del linguaggio C 2
• Oggi molti sistemi operativi sono sviluppati in C o C
• I vantaggi fondamentali della scrittura di sistemi operativi in
linguaggio di alto livello sono la velocità di sviluppo e la
manutenibilità
• Come effetto collaterale si ottiene un sistema operativo che
può essere trasferito su architetture diverse, tramite
ricompilazione su macchina target: porting
• Nel 1977, Ritchie e Brian Kernighan pubblicarono The C
Programming 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
Anno accademico 2010-2011
58
ANSI 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à
• 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
Programming Language C”
• Lo standard è stato rivisto ed aggiornato nel 1999
59
Anno accademico 2010-2011
Caratteristiche del linguaggio C
• 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 a runtime
• Abbina ad un livello medio/alto di astrazione, un buon
controllo delle operazioni a basso livello
60
Anno accademico 2010-2011