anno accademico 2010-2011 1 i linguaggi di alto livello

60
Anno accademico 2010-2011 Anno accademico 2010-2011 1 I linguaggi di alto I linguaggi di alto livello livello

Upload: piera-abbate

Post on 01-May-2015

220 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

11

I linguaggi di alto livelloI linguaggi di alto livello

Page 2: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

22

SommarioSommario

• Introduzione alla programmazioneIntroduzione alla programmazione Caratteristiche dei linguaggi di programmazioneCaratteristiche dei linguaggi di programmazione I linguaggi di programmazione di alto livelloI linguaggi di programmazione di alto livello Compilatori e interpretiCompilatori e interpreti L’arte della programmazioneL’arte della programmazione

• Storia del linguaggio CStoria del linguaggio C Lo standard ANSILo standard ANSI

Page 3: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

33

Introduzione alla Introduzione alla programmazioneprogrammazione

Page 4: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

44

Cos’è un linguaggioCos’è un linguaggio

• Definizione 1 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 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?

Page 5: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

55

Lessico, sintassi e semanticaLessico, sintassi e semantica

• Lessico:Lessico: l’insieme di regole formali per la scrittura di parole in un linguaggio

• Sintassi:Sintassi: l’insieme di regole formali per la scrittura di frasi in un linguaggio, che stabiliscono cioè la grammatica del linguaggio stesso

• Semantica:Semantica: l’insieme dei significati da attribuire alle frasi (sintatticamente corrette) costruite nel linguaggio

• Nota: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…”

Page 6: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

66

Esempio: la sintassi di un numero Esempio: la sintassi di un numero naturalenaturale

Diagramma sintatticoDiagramma sintattico

<cifra-non-nulla> : 1|2|3|4|5|6|7|8|9

<cifra> : 0 | <cifra-non-nulla>

<naturale> : 0 | <cifra-non-nulla>{<cifra>}

Page 7: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

77

I linguaggi di programmazione:I linguaggi di programmazione:Cenni storici Cenni storici 1 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 alfabetoalfabeto, con cui viene costruito un insieme di parole chiaveparole chiave (il vocabolario) e da un insieme di regole sintatticheregole sintattiche per l’uso corretto delle parole del linguaggio

• A livello hardware, i calcolatori riconoscono solo comandi semplici, del tipo copia un numerocopia un numero, addiziona due numeriaddiziona due numeri, confronta due numericonfronta due numeri

Page 8: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

88

I linguaggi di programmazione:I linguaggi di programmazione:Cenni storici Cenni storici 2 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 Enorme sforzo programmativo richiesto per

codificare algoritmi semplicicodificare algoritmi semplici

• I comandi realizzati in hardware definiscono il set set di istruzioni macchinadi istruzioni macchina e i programmi che li utilizzano direttamente sono i programmi in linguaggio macchinalinguaggio macchina

Page 9: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

99

I linguaggi di programmazione:I linguaggi di programmazione:Cenni storici Cenni storici 3 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 Dalla nascita dei primi calcolatori, si è cercato di diminuire lo sforzo ed aumentare la produttività diminuire lo sforzo ed aumentare la produttività dell’utente, anche a costo di caricare la dell’utente, anche a costo di caricare la macchina di maggiori compitimacchina di maggiori compiti

Page 10: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

1010

I linguaggi di programmazione:I linguaggi di programmazione:Cenni storici Cenni storici 4 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 assemblatorilinguaggi 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)

Page 11: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

1111

I linguaggi di programmazione:I linguaggi di programmazione:Cenni storici Cenni storici 5 5

• Negli anni ‘50, tutti i programmi erano scritti in linguaggio macchina o in assemblyassembly

• 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 assemblatoreassemblatore per tradurre le istruzioni tipiche del linguaggio in istruzioni macchina

Page 12: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

1212

I linguaggi di programmazione:I linguaggi di programmazione:Cenni storici Cenni storici 6 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 livellolinguaggi di alto livello, FORTRANFORTRAN e COBOLCOBOL, hanno costrutti fortemente ispirati alla notazione usata, negli anni ‘50, per l’elaborazione numerica e gestionale

Page 13: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

1313

I linguaggi di programmazione:I linguaggi di programmazione:Cenni storici Cenni storici 7 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 60ALGOL 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

Page 14: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

1414

I linguaggi di programmazione:I linguaggi di programmazione:Cenni storici Cenni storici 8 8

• Negli anni ‘70: Si diffondono i linguaggi strutturati, quali il

SIMULA 67SIMULA 67, capostipite dei linguaggi ObjectOriented, l’ALGOL 68ALGOL 68, ma soprattutto il PASCALPASCAL, primo esempio di prodotto di origine accademica che abbia conosciuto vasto successo ed applicazione nel mondo dell’industria

In modo simile, il CC, concepito come un assembler strutturato per trasportare facilmente UNIXUNIX, ha finito per diventare il linguaggio più affermato nella programmazione di sistema

Page 15: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

1515

I linguaggi di programmazione:I linguaggi di programmazione:Cenni storici Cenni storici 9 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

ADAADA 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 (CC, Visual BASICVisual BASIC, JavaJava)

Page 16: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

1616

I linguaggi di programmazione:I linguaggi di programmazione:Cenni storici Cenni storici 10 10

• Nei linguaggi di alto livellolinguaggi 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 semplici e poveri (poche parole chiave, poche regole), ma privi di qualsiasi privi di qualsiasi ambiguitàambiguità

Page 17: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

1717

Astrazione Astrazione 1 1

• In informatica si parla di programmazione di programmazione di basso livellobasso livello quando si utilizza un linguaggio molto vicino alla macchina

• Si parla invece di programmazione di alto livelloprogrammazione 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 (PascalPascal, Perl,Perl, JavaJava, etc.)

• In questa gerarchia il linguaggio Clinguaggio C si pone ad un livello intermedio

Page 18: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

1818

Astrazione Astrazione 2 2• Esistono, quindi, diversi livelli di astrazione:

Linguaggio macchina e AssemblerLinguaggio macchina e AssemblerImplicano la conoscenza dettagliata delle caratteristiche della macchina (registri, dimensione dati, set di istruzioni)Semplici algoritmi implicano la specifica di molte istruzioni Linguaggi di alto livelloLinguaggi 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

Page 19: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

1919

Evoluzione dei linguaggi di Evoluzione dei linguaggi di programmazioneprogrammazione

Page 20: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

2020

Linguaggi di programmazioneLinguaggi di programmazionedi alto livello di alto livello 1 1

• Consentono al programmatore di trattare oggetti complessi senza doversi preoccupare dei dettagli della particolare macchina sulla quale il programma viene eseguito

• Richiedono un compilatorecompilatore o un interpreteinterprete 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

Page 21: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

2121

Linguaggi di programmazioneLinguaggi di programmazionedi alto livello di alto livello 2 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àportabilità, leggibilitàleggibilità, manutenibilitàmanutenibilità

Page 22: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

2222

Linguaggi di programmazioneLinguaggi di programmazionedi alto livello di alto livello 3 3

• Portabilità:Portabilità: i programmi scritti per un calcolatore possono essere utilizzati su qualsiasi altro calcolatore, previa ricompilazione

• Leggibilità:Leggibilità: la relativa similitudine con i linguaggi naturali rende i programmi più semplici, non solo da scrivere, ma anche da leggere

• Manutenibilità: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 correttezzaanalisi di correttezza

Valued Acer Customer
L'essenza della programmazione ad alto livello, ovvero dell'uso di linguaggi di elevata potenza espressiva, risiede nella capacità di astrazione, cioè nella possibilità di prescindere dai dettagli considerati inessenziali ai fini della soluzione di un problema, favorendo con ciò la concentrazione sugli elementi fondamentali. Un linguaggio di programmazione deve fornire all'utente buoni meccanismi per definire autonomamente tutte le astrazioni di cui ha bisogno: il programmatore deve disporre di strumenti sufficienti per spiegare al calcolatore tutte le operazioni che intende effettuare. La funzione svolta da un programma ben strutturato scritto in un linguaggio di programmazione di alto livello può essere facilmente compresa da un lettore: i simboli e le istruzioni utilizzate si avvicinano più ai simboli ed alle istruzioni di uso comune che non a quelle interne del calcolatore.
Page 23: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

2323

Linguaggi di programmazioneLinguaggi di programmazionedi alto livello di alto livello 4 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à La ragione fondamentale per decretare la superiorità dei linguaggi di alto livello consiste nel fatto che la dei linguaggi di alto livello consiste nel fatto che la maggior parte dei costi di produzione del software è maggior parte dei costi di produzione del software è localizzata nella fase di manutenzione, per la quale localizzata nella fase di manutenzione, per la quale leggibilità e portabilità sono crucialileggibilità e portabilità sono cruciali

Page 24: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

2424

Linguaggi di programmazioneLinguaggi di programmazionedi alto livello di alto livello 5 5

• Possiamo aggregare i numerosi linguaggi di programmazione esistenti sulla base del modello modello astratto di programmazioneastratto di programmazione che sottintendono e che è necessario adottare per utilizzarli

Linguaggi di Linguaggi di programmazionprogrammazion

ee

ImperativiImperativi

ParalleliParalleliProceduraliProcedurali(C, Pascal)(C, Pascal)

Ad oggettiAd oggetti(C++, Java)(C++, Java)

DichiarativiDichiarativi

FunzionaliFunzionali(Lisp)(Lisp)

LogiciLogici(Prolog)(Prolog)

Page 25: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

2525

Linguaggi di programmazioneLinguaggi di programmazionedi alto livello di alto livello 6 6

• Linguaggi imperativiLinguaggi imperativi Il modello computazionale è basato sul cambiamento cambiamento

di stato della memoriadi stato della memoria della macchina È centrale il concetto di assegnazione di un valoreassegnazione 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 dichiarativiLinguaggi dichiarativi Il modello computazionale è basato sui concetti di

funzione e relazionefunzione e relazione Il programmatore non ragiona in termini di

assegnazioni di valori, ma di relazioni tra entità e di valori di una funzione

Page 26: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

2626

Linguaggi di programmazioneLinguaggi di programmazionedi alto livello di alto livello 7 7

• Sulla base dell’ambito in cui si colloca il problema da risolvere, è opportuno adottare un linguaggio piuttosto che un altro:

Calcolo scientifico: Calcolo scientifico: Fortran, CC

Intelligenza artificiale:Intelligenza artificiale: Prolog, Lisp, CC

Applicazioni gestionali: Applicazioni gestionali: Cobol, SQL, CC

Sistemi operativi:Sistemi operativi: Assembler, CC

Applicazioni visuali: Applicazioni visuali: CC, Java, Visual Basic

Applicazioni Web: Applicazioni Web: Java, PHP, ASP

Page 27: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

2727

I programmi traduttori I programmi traduttori 1 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 (sorgentesorgente) nella corrispondente rappresentazione in linguaggio macchina (eseguibileeseguibile)

Page 28: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

2828

I programmi traduttori I programmi traduttori 2 2

• Compilatore: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 programmaPRIMA si traduce tutto il programma POI si esegue la versione tradottaPOI si esegue la versione tradotta

• Interprete:Interprete: traduce ed esegue il programma sorgente, istruzione per istruzione

Traduzione ed esecuzione sono intercalateTraduzione ed esecuzione sono intercalate

Page 29: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

2929

I programmi traduttori I programmi traduttori 3 3

Page 30: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

3030

Il compilatore Il compilatore 1 1

• Eseguire un programma scritto in un linguaggio Eseguire un programma scritto in un linguaggio compilatocompilato

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 CC)

L’esecuzione da parte di un calcolatore di PComp su P (dove P è il dato di ingresso) produce Pexe FASE di COMPILAZIONEFASE di COMPILAZIONE (compile timecompile time)

L’esecuzione da parte di un calcolatore di Pexe su particolari dati in input produce i relativi risultati FASE di ESECUZIONEFASE di ESECUZIONE (run timerun time)

Page 31: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

3131

Il compilatore Il compilatore 2 2

• Esempio di compilatoreEsempio 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

Page 32: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

3232

Il compilatore Il compilatore 3 3

• CompilatoreCompilatore

Analisi lessicale token (parole)

Analisi sintattica albero sintattico

Analisi semantica tabella dei simboli

Page 33: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

3333

Il compilatore Il compilatore 4 4

• L’analizzatore lessicale analizzatore lessicale trasforma il programma sorgente da stringa di caratteri a stringa di tokenstringa di token

• Un tokentoken è 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 tabella dei simboli simboli ed i suoi attributi vengono aggiornati nella fase di analisi semanticaanalisi semantica

Page 34: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

3434

Il compilatore Il compilatore 5 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)

Page 35: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

3535

Il compilatore Il compilatore 6 6

Page 36: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

3636

Il compilatore Il compilatore 7 7• L’analizzatore sintattico analizzatore sintattico (o parserparser) permette la

costruzione dell’albero di derivazione del particolare programma basato sulla grammatica del linguaggio

Page 37: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

3737

Il compilatore Il compilatore 8 8

• L’analizzatore semanticoanalizzatore 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.)

Page 38: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

3838

Il compilatore Il compilatore 9 9• Il generatore di codice 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 ottimizzatore del codice intermedio effettua trasformazioni atte a migliorare l’efficienza del codice eseguibile finale

Page 39: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

3939

Il compilatore Il compilatore 10 10

Traduzione da algoritmo a codice C e da C ad Traduzione da algoritmo a codice C e da C ad AssemblerAssembler

Page 40: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

4040

Il compilatore Il compilatore 11 11

Interazione fra compilatore, SO e Interazione fra compilatore, SO e hardwarehardware

Page 41: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

4141

Compilatore e linker Compilatore e linker 1 1

• I compilatori consentono tipicamente la compilazione separata di parti di programmi (modulimoduli)

• I diversi moduli possono essere progettati, costruiti e messi a punto separatamente, e archiviati in opportune librerielibrerie

• Nel momento in cui un programma deve essere eseguito, un programma apposito, detto linkerlinker, si occupa di collegare opportunamente fra loro i moduli oggetto

• Il risultato dell’esecuzione del linker è un unico modulo, detto modulo eseguibilemodulo eseguibile, pronto per il caricamento in memoria e l’esecuzione

Page 42: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

4242

Compilatore e linker Compilatore e linker 2 2

Il ruolo del Il ruolo del linkerlinker

Page 43: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

4343

Compilatore e linker Compilatore e linker 3 3

Da sorgente ad Da sorgente ad eseguibile eseguibile

Page 44: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

4444

L’interprete L’interprete 1 1

• Eseguire un programma scritto in un linguaggio Eseguire un programma scritto in un linguaggio interpretatointerpretato

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 PythonPython)

L’esecuzione da parte di un calcolatore di PInt su P, con i dati di ingresso a P, produce i relativi risultati

Page 45: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

4545

L’interprete L’interprete 2 2

• Esempio di interpreteEsempio 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

contemporaneamentecontemporaneamente l’interprete comunica al manager cinese quanto detto da noi (e viceversa)

Il compito dell’interprete si svolge contestualmente all’incontro col manager cinese

Page 46: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

4646

L’interprete L’interprete 3 3

Interazione fra interprete, SO e Interazione fra interprete, SO e hardwarehardware

Page 47: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

4747

Compilatori e interpreti Compilatori e interpreti 1 1

• Riassumendo… I compilatori traducono un intero programma dal

linguaggio L al linguaggio macchina della macchina prescelta:

traduzione e esecuzione procedono separatamenteal termine della compilazione è disponibile la versione tradotta del programmala 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 istruzioneistruzione per istruzione, infatti:

traduzione ed esecuzione procedono insiemeal termine non vi è alcuna versione tradotta del programma originalese si vuole rieseguire il programma occorre anche ritradurlo

Page 48: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

4848

• 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

Compilatori e interpreti Compilatori e interpreti 2 2

Page 49: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

4949

Compilatori ed interpreti Compilatori ed interpreti 3 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

Page 50: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

5050

L’arte della programmazione L’arte della programmazione 1 1

AnalisiAnalisi

ProgrammazioProgrammazionene

• 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

Codifica Debugging Validazione Documentazione Manutenzione

Page 51: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

5151

L’arte della programmazione L’arte della programmazione 2 2

• Definizione del problemaDefinizione 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’algoritmoDefinizione dell’algoritmo

Soluzione in pseudocodice Soluzione mediante diagramma a blocchi

strutturato

Page 52: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

5252

L’arte della programmazione L’arte della programmazione 3 3

• CodificaCodifica

Traduzione dell’algoritmo in istruzioni del linguaggio di programmazione

• DebuggingDebugging, correzione degli errori sintattici e semantici

Errori sintattici

Espressioni non valide o non ben formate nel linguaggio di programmazione

Errori semantici

Comportamento non aderente alle aspettative/alla intenzionalità del programmatore

Page 53: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

5353

L’arte della programmazione L’arte della programmazione 4 4

• ValidazioneValidazione Test su tutte le condizioni operative del

programma Test su input estremi (es., vettori di dimensione 0

o 1, variabili nulle)

• DocumentazioneDocumentazione Inserimento di commenti esplicativi nelle varie

parti del programma per facilitarne la comprensione (dopo molto tempo dalla stesura o per terze persone)

• ManutenzioneManutenzione Modifica del programma per soddisfare al

cambiamento delle specifiche con cui deve operare

Page 54: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

5454

I commenti I commenti 1 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

Page 55: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

5555

I commenti I commenti 2 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”

Page 56: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

5656

Storia del linguaggio CStoria del linguaggio C

Page 57: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

5757

Storia del linguaggio C Storia del linguaggio C 1 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 sistemalinguaggio 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 UNIXUNIX in C

Page 58: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

5858

Storia del linguaggio C Storia del linguaggio C 2 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: portingporting

• Nel 1977, Ritchie e Brian Kernighan pubblicarono The The C Programming LanguageC Programming Language, che formalizza lo standard standard K&RK&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

Page 59: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

5959

ANSI CANSI C

• Nel 1983, l’American National Standards American National Standards Institute 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 CStandard ANSI C è descritto nel documento “American National Standard for Information American National Standard for Information Systems Systems Programming Language C Programming Language C”

• Lo standard è stato rivisto ed aggiornato nel 1999

Page 60: Anno accademico 2010-2011 1 I linguaggi di alto livello

Anno accademico 2010-2011Anno accademico 2010-2011

6060

Caratteristiche del linguaggio CCaratteristiche 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