Linguaggi e Paradigmi di Programmazione
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 Definizione 2 Il linguaggio è un oggetto matematico che consente di rispondere a domande come: quali sono le frasi lecite? si può stabilire se una frase appartiene al linguaggio? come si stabilisce il significato di una frase? quali sono gli elementi linguistici primitivi?
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!
Esempio: la sintassi di un numero naturale Diagramma sintattico
Introduzione La Programmazione (in Informatica) è l attività svolta per creare un Programma Un Programma è 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 I linguaggi di programmazione differiscono comunque dai linguaggi naturali: sono meno espressivi ma più precisi Sono semplici e poveri (poche parole chiave, poche regole), ma privi (generalmente) di qualsiasi ambiguità
Categorie I linguaggi di programmazione si possono suddividere fondamentalmente in tre categorie: Linguaggi Macchina Linguaggi Assembler Linguaggi ad alto livello
Linguaggio Macchina Riflette l organizzazione della macchina più che la natura del problema da risolvere. si diceva : le CPU sono progettate in modo da riconoscere un insieme di istruzioni codificate come configurazioni di bit. L insieme di queste istruzioni è appunto chiamato linguaggio macchina
Linguaggi Assembler Versione simbolica del linguaggio macchina in cui i nomi delle operazioni e degli operandi sono indicati con codici simbolici Esiste (quasi) una corrispondenza biunivoca tra istruzione e numero di operazioni eseguite dal sistema necessita di un traduttore che lo trasformi in word di bit (affinché il calcolatore lo possa eseguire)
Linguaggi ad alto livello Elementi intermedi di una varietà di linguaggi ai cui estremi si trovano il linguaggio macchina, da un lato, ed i linguaggi naturali, dall altro Più sofisticati ed astratti, slegati dal funzionamento fisico della macchina necessitano di un traduttore che lo trasformi in word di bit (affinché il calcolatore lo possa eseguire)
Gerarchie ed astrazioni
Gerarchie ed astrazioni Esistono, quindi, diversi livelli di astrazione: Linguaggii 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
Un po di terminologia Programmare in un determinato linguaggio ad alto livello significa produrre un file di puro testo che prende il nome di codice sorgente (o semplicemente sorgente) La traduzione in linguaggio macchina di un codice sorgente prende il nome di codice eseguibile (o semplicemente eseguibile)
La traduzione 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 Il traduttore converte il testo di un programma scritto in un particolare linguaggio di programmazione (sorgente) nella corrispondente rappresentazione in linguaggio macchina (programma eseguibile) Generalmente 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 è difficile
Tipi di traduttore 1. Compilatore Traduce in linguaggio macchina un programma scritto in uno specifico linguaggio ad alto livello 2. Interprete Analizza e traduce il programma scritto in linguaggio ad alto livello e contemporaneamente vengono eseguite le corrispondenti elaborazioni
Compilatore Opera la traduzione di un programma sorgente (alto livello) in un programma oggetto direttamente eseguibile dal calcolatore PRIMA si programma traduce tutto il POI si tradotta esegue la versione Nota: 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) Programma Compilatore Programma in linguaggio macchina (codice eseguibile) Il codice eseguibile viene memorizzato e può essere eseguito ogni volta che si vuole senza ricompilare Input Esecuzione del codice macchina Output
Esempio di compilazione 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
Interprete Traduce ed esegue il programma sorgente, traduzione ed esecuzione procedono insieme Nota: al termine non vi è alcuna versione tradotta del programma originale se si vuole rieseguire il programma occorre ancora tradurlo Programma Interprete Output Input Non esiste codice eseguibile memorizzato e ogni volta che il programma deve essere eseguito, esso deve essere interpretato
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 con il manager cinese
Compilatore vs Interprete Compilatore Esecuzione efficiente Codice eseguibile non portabile Ogni modifica del programma richiede una nuova compilazione Interprete Esecuzione meno efficiente Programma portabile Esecuzione immediata ad ogni modifica
Nota: la traduzione dei programmi Java Un compilatore Java produce un codice intermedio, il Byte Code che è codice portabile a basso livello, simile all assembler, indipendente dall hardware e invisibile al programmatore Java Un interprete traduce ed esegue il Byte Code
La soluzione di un probleme e l arte l della programmazione La soluzione di un problema tramite un calcolatore è quindi un procedimento elaborato: Definizione del problema Algoritmo per la soluzione del problema Codifica Debugging Validazione Documentazione Manutenzione Programmazione Analisi
La soluzione di un probleme e l arte l della programmazione Codifica Traduzione dell algoritmo in istruzioni del linguaggio di programmazione Debugging, correzione degli errori sintattici e semantici Errori sintattici Espressioni non valide o non ben formate nel linguaggio di programmazione Errori semantici Comportamento non aderente alle aspettative/alla intenzionalità del programmatore
La soluzione di un probleme e l arte l della programmazione 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 il cambiamento delle specifiche con cui deve operare
I paradigmi di programmazione Un paradigma di programmazione è un modello concettuale che fornisce la struttura di un programma. I principali paradigmi di programmazione sono: Programmazione Procedurale (o Imperativa) Programmazione Funzionale Programmazione Logica Programmazione Object-Oriented
Programmazione Procedurale Un programma è composto da istruzioni che realizzano trasformazioni di stato Uno stato è identificato da tutti i valori di un certo insieme di variabili in un certo stadio dell esecuzione: C Pascal etc.
Programmazione Funzionale Un programma è una funzione che viene valutata per ottenere un risultato: Lisp SML etc.
Programmazione Logica Un programmaèun insiemedi fattie regole e la sua esecuzione equivale alla realizzazione di una dimostrazione: Prolog LDL etc.
Programmazione Object-Oriented Un programmaèun insiemedi oggetti (astrazioni della realtà) dotati di proprietà (dati) e metodi (procedure) che comunicano tramite scambio di messaggi: Java C++ etc.