I linguaggi di alto livello 1 Anno accademico

  • Slides: 63
Download presentation
I linguaggi di alto livello 1 Anno accademico 2010 -2011

I linguaggi di alto livello 1 Anno accademico 2010 -2011

Sommario • Introduzione alla programmazione § Caratteristiche dei linguaggi di programmazione § I linguaggi

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

Introduzione alla programmazione 3 Anno accademico 2010 -2011

Cos’è un linguaggio • Definizione 1 Un linguaggio è un insieme di parole e

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

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

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

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, 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

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”

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

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, 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 tempo macchina (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

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

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, livello FORTRAN e COBOL, 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

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, 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

I linguaggi di programmazione: Cenni storici 8 • Negli anni ‘ 70: § Si diffondono i linguaggi strutturati, quali il SIMULA 67, 67 capostipite dei linguaggi Object Oriented, l’ALGOL 68, 68 ma soprattutto il PASCAL, 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, 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

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 object oriented (C , BASIC Java) Java Visual BASIC, 15 Anno accademico 2010 -2011

I linguaggi di programmazione: Cenni storici 10 • Nei linguaggi di alto livello ogni

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

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, 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

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 Anno accademico 2010 -2011 18

Evoluzione dei linguaggi di programmazione 19 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

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 Anno accademico 2010 -2011 20

Linguaggi di programmazione di alto livello 2 • I linguaggi che non dipendono dall’architettura

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à, portabilità leggibilità, leggibilità manutenibilità 21 Anno accademico 2010 -2011

Linguaggi di programmazione di alto livello 3 • Portabilità: i programmi scritti per un

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

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

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

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

Sommario dei punti più importanti • Linguaggio • Lessico • Sintassi • Semantica •

Sommario dei punti più importanti • Linguaggio • Lessico • Sintassi • Semantica • Differenza tra linguaggi ad alto e basso livello • Linguaggio Macchina • Assembler • Linguaggio C 26 Anno accademico 2010 -2011

Sommario dei punti più importanti • Differenza tra compilatori ed interpreti • Compilatori •

Sommario dei punti più importanti • Differenza tra compilatori ed interpreti • Compilatori • Tokenizzazione • Sintassi • Semantica • Linguaggi Imperativi e dichiarativi • Assegnamenti e cambio di stato della memoria • Definizione entità e relazioni tra esse 27 Anno accademico 2010 -2011

Sommario dei punti più importanti • Vantaggi dei linguaggi ad alto livello • portabilità,

Sommario dei punti più importanti • Vantaggi dei linguaggi ad alto livello • portabilità, portabilità leggibilità, leggibilità manutenibilità 28 Anno accademico 2010 -2011

Linguaggi di programmazione di alto livello 7 • Sulla base dell’ambito in cui si

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 29 Anno accademico 2010 -2011

I programmi traduttori 1 • Affinché un programma scritto in un qualsiasi linguaggio di

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) sorgente nella corrispondente rappresentazione in linguaggio macchina (eseguibile) eseguibile 30 Anno accademico 2010 -2011

I programmi traduttori 2 • Compilatore: opera la traduzione di un programma sorgente (scritto

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 31 Anno accademico 2010 -2011

I programmi traduttori 3 32 Anno accademico 2010 -2011

I programmi traduttori 3 32 Anno accademico 2010 -2011

Il compilatore 1 • Eseguire un programma scritto in un linguaggio compilato § Il

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 33

Il compilatore 2 • Esempio di compilatore § Dobbiamo sottoporre un curriculum, in inglese,

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 riceve il testo da tradurre il traduttore fornisce il testo tradotto possiamo sottoporre il nostro curriculum all’azienda 34 Anno accademico 2010 -2011

Il compilatore 3 • Compilatore § Analisi lessicale token (parole) § Analisi sintattica albero

Il compilatore 3 • Compilatore § Analisi lessicale token (parole) § Analisi sintattica albero sintattico § Analisi simboli Anno accademico 2010 -2011 semantica tabella dei 35

Il compilatore 4 • L’analizzatore lessicale trasforma il programma sorgente da stringa di caratteri

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 § 36 Anno accademico 2010 -2011

Il compilatore 5 • L’output del’analisi lessicale è un insieme di coppie, il cui

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) 37 Anno accademico 2010 -2011

Il compilatore 6 38 Anno accademico 2010 -2011

Il compilatore 6 38 Anno accademico 2010 -2011

Il compilatore 7 • L’analizzatore sintattico (o parser) parser permette la costruzione dell’albero di

Il compilatore 7 • L’analizzatore sintattico (o parser) parser permette la costruzione dell’albero di derivazione del particolare programma basato sulla grammatica del linguaggio 39 Anno accademico 2010 -2011

Il compilatore 8 • L’analizzatore semantico, semantico infine, usa l’albero di derivazione per generare

Il compilatore 8 • L’analizzatore semantico, 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. ) 40 Anno accademico 2010 -2011

Il compilatore 9 • Il generatore di codice traduce la rappresentazione intermedia in linguaggio

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 Anno accademico 2010 -2011 D: =T; 41

Il compilatore 10 Traduzione da algoritmo a codice C e da C ad Assembler

Il compilatore 10 Traduzione da algoritmo a codice C e da C ad Assembler Anno accademico 2010 -2011 42

Il compilatore 11 Interazione fra compilatore, SO e hardware Anno accademico 2010 -2011 43

Il compilatore 11 Interazione fra compilatore, SO e hardware Anno accademico 2010 -2011 43

Compilatore e linker 1 • I compilatori consentono tipicamente la compilazione separata di parti

Compilatore e linker 1 • I compilatori consentono tipicamente la compilazione separata di parti di programmi (moduli) moduli • 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, linker si occupa di collegare opportunamente fra loro i moduli oggetto • Il risultato dell’esecuzione del linker è un unico modulo, detto modulo eseguibile, eseguibile pronto per il caricamento in memoria e l’esecuzione 44 Anno accademico 2010 -2011

Compilatore e linker 2 Il ruolo del linker Anno accademico 2010 -2011 45

Compilatore e linker 2 Il ruolo del linker Anno accademico 2010 -2011 45

Compilatore e linker 3 Da sorgente ad eseguibile Anno accademico 2010 -2011 46

Compilatore e linker 3 Da sorgente ad eseguibile Anno accademico 2010 -2011 46

L’interprete 1 • Eseguire un programma scritto in un linguaggio interpretato § Il programma

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) Python § L’esecuzione da parte di un calcolatore di PInt su P, con i dati di ingresso a P, produce i relativi risultati 47 Anno accademico 2010 -2011

L’interprete 2 • Esempio di interprete § Dobbiamo incontrare un manager cinese per motivi

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 48 Anno accademico 2010 -2011

L’interprete 3 Interazione fra interprete, SO e hardware Anno accademico 2010 -2011 49

L’interprete 3 Interazione fra interprete, SO e hardware Anno accademico 2010 -2011 49

Compilatori e interpreti 1 • Riassumendo… § I compilatori traducono un intero programma dal

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 50 50 Anno accademico 2010 -2011

Compilatori e interpreti 2 • L’esecuzione di un programma compilato è generalmente più veloce

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 51 Anno accademico 2010 -2011

Compilatori ed interpreti 3 • I linguaggi interpretati sono tipicamente più flessibili e semplici

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 run time 52 Anno accademico 2010 -2011

L’arte della programmazione 1 • La soluzione di un problema tramite un programma è

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 53

L’arte della programmazione 2 • Definizione del problema § Definizione degli ingressi e delle

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 54 Anno accademico 2010 -2011

L’arte della programmazione 3 • Codifica § Traduzione dell’algoritmo in istruzioni del linguaggio di

L’arte della programmazione 3 • Codifica § Traduzione dell’algoritmo in istruzioni del linguaggio di programmazione • Debugging, 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 55 Anno accademico 2010 -2011

L’arte della programmazione 4 • Validazione § Test su tutte le condizioni operative del

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 56 Anno accademico 2010 -2011

I commenti 1 • Perché commentare e documentare i programmi? § I programmi vengono

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 57 Anno accademico 2010 -2011

I commenti 2 • Inoltre: § Si devono evitare commenti inutili § Si deve

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” 58 Anno accademico 2010 -2011

Storia del linguaggio C 59 Anno accademico 2010 -2011

Storia del linguaggio C 59 Anno accademico 2010 -2011

Storia del linguaggio C 1 • Il linguaggio C venne definito alla fine degli

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 60

Storia del linguaggio C 2 • Oggi molti sistemi operativi sono sviluppati in C

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, 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 61

ANSI C • Nel 1983, l’American National Standards Institute (ANSI), costituì la commissione X

ANSI C • Nel 1983, l’American National Standards Institute (ANSI), costituì la commissione X 3 J 11, che doveva formulare uno standard per il C, che includesse le nuove caratteristiche 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” C • Lo standard è stato rivisto ed aggiornato nel 1999 62 Anno accademico 2010 -2011

Caratteristiche del linguaggio C • Linguaggio di medio/alto livello; basso livello di controllo degli

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 run time • Abbina ad un livello medio/alto di astrazione, un buon controllo delle operazioni a basso livello 63 Anno accademico 2010 -2011