anno accademico 2010-2011 1 i linguaggi di alto livello
TRANSCRIPT
Anno accademico 2010-2011Anno accademico 2010-2011
11
I linguaggi di alto livelloI 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
Anno accademico 2010-2011Anno accademico 2010-2011
33
Introduzione alla Introduzione alla programmazioneprogrammazione
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?
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…”
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>}
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
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
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
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)
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
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
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
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
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)
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à
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
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
Anno accademico 2010-2011Anno accademico 2010-2011
1919
Evoluzione dei linguaggi di Evoluzione dei linguaggi di programmazioneprogrammazione
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
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à
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
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
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)
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
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
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)
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
Anno accademico 2010-2011Anno accademico 2010-2011
2929
I programmi traduttori I programmi traduttori 3 3
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)
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
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
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
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)
Anno accademico 2010-2011Anno accademico 2010-2011
3535
Il compilatore Il compilatore 6 6
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
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.)
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
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
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
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
Anno accademico 2010-2011Anno accademico 2010-2011
4242
Compilatore e linker Compilatore e linker 2 2
Il ruolo del Il ruolo del linkerlinker
Anno accademico 2010-2011Anno accademico 2010-2011
4343
Compilatore e linker Compilatore e linker 3 3
Da sorgente ad Da sorgente ad eseguibile eseguibile
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
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
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
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
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
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
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
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
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
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
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
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”
Anno accademico 2010-2011Anno accademico 2010-2011
5656
Storia del linguaggio CStoria del linguaggio C
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
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
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
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