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