Programmi e linguaggi Un calcolatore è solo un esecutore rapidissimo di istruzioni Algoritmi e Linguaggi Un programma è un insieme di istruzioni codificate in un opportuno linguaggio 2 / 21 Informatica - M. Falda, A. A. 2007 - 2008 Linguaggi e algoritmi Algoritmo Prima di scrivere un programma si deve Le precedenti caratteristiche portano agli algoritmi: un algoritmo è una procedura 1. 2. 3. 4. 5. generalizzare il più possibile la procedura assicurarsi che termini sempre identificare tutte le possibili configurazioni iniziali precisare in maniera univoca i passi da compiere accertarsi che un calcolatore possa eseguirli Informatica - M. Falda, A. A. 2007 - 2008 1. 2. 3. 4. 5. generale finita completa non ambigua eseguibile 3 / 21 4 / 21 Informatica - M. Falda, A. A. 2007 - 2008 Progettare gli algoritmi Complessità Complessità degli algoritmi Non esiste un algoritmo per progettare algoritmi! Tra i problemi calcolabili ce ne sono alcuni intrinsecamente più difficili, ad esempio trovare un percorso minimo per visitare un insieme di città una sola volta Due approcci: top-down: dal generale al particolare bottom-up: dal particolare al generale verificare la correttezza di un circuito logico Non tutti i problemi sono calcolabili trovare il minimo numeri di colori per una mappa e.g.: un programma si fermerà sempre? 5 / 21 Informatica - M. Falda, A. A. 2007 - 2008 6 / 21 Informatica - M. Falda, A. A. 2007 - 2008 Diagrammi di flusso Blocchi di base Rappresentazione Un algoritmo può essere descritto usando un diagramma di flusso Funzione inizio e fine Un diagramma di flusso è costituito da istruzione blocchi di base strutture per comporre i blocchi ingresso / uscita 7 / 21 Informatica - M. Falda, A. A. 2007 - 2008 8 / 21 Informatica - M. Falda, A. A. 2007 - 2008 La programmazione strutturata Inizio Inizio La sequenza Acquisisci Acquisisci lalabase basebb Un qualsiasi algoritmo può essere espresso combinando i blocchi di base mediante È semplicemente un insieme di blocchi che si susseguono sequenza selezione ripetizione o iterazione Acquisisci Acquisisci l’altezza l’altezzahh aa==bb**hh/ /22 E.g.: l’area di un triangolo Restituisci Restituisci l’area l’areaaa Si ottiene un diagramma di flusso strutturato Fine Fine 9 / 21 Informatica - M. Falda, A. A. 2007 - 2008 Informatica - M. Falda, A. A. 2007 - 2008 La selezione L’iterazione Permette di sdoppiare l’esecuzione in dipendenza di una condizione vero Equilatero Equilatero I Ilati latisono sono uguali? uguali? Serve a ripetere una serie di istruzioni fa uso della selezione per terminare falso falso Non Nonequilatero equilatero vero nn>>0? 0? nn==nn/ /bb 11 / 21 Informatica - M. Falda, A. A. 2007 - 2008 10 / 21 resto(n, resto(n,b) b) 12 / 21 Informatica - M. Falda, A. A. 2007 - 2008 Linguaggi naturali e formali Il linguaggio macchina e l’l’assemblatore Un linguaggio naturale è ambiguo Anche le istruzioni sono codificate con sequenze di bit “una vecchia porta la sbarra” Si possono associare simboli mnemonici, ma rimangono Un linguaggio formale non lo è mai la complessità la mancanza di astrazione grammatiche formali 13 / 21 Informatica - M. Falda, A. A. 2007 - 2008 14 / 21 Informatica - M. Falda, A. A. 2007 - 2008 I linguaggi ad alto livello Traduzione Permettono di astrarre le caratteristiche del calcolatore generalizzare la scrittura di procedure ricorrenti Ogni linguaggio deve essere ritradotto in linguaggio macchina Tre metodi Caratteristiche sintassi semplice, familiare al programmatore più sono “lontani” dal calcolatore e meno sono efficienti: compromesso tra velocità e versatilità compilazione: C++ interpretazione: Javascript pseudo-codice: Java 15 / 21 Informatica - M. Falda, A. A. 2007 - 2008 16 / 21 Informatica - M. Falda, A. A. 2007 - 2008 Tipologie di linguaggi ad alto livello Determinismo Imperativi: si specificano le istruzioni da eseguire C, Pascal Ad oggetti: si modella il problema in termini di interazioni tra oggetti C++, Java Funzionali: si formula il problema in termini di funzioni Algoritmi non deterministici Lisp, ML Dichiarativi: si descrive il problema in termini logici lasciando al calcolatore il compito di risolverlo Prolog, XSLT Un algoritmo è deterministico se ad ogni configurazione di ingresso corrisponde un unico percorso di esecuzione algoritmi casuali approcci dichiarativi 17 / 21 Informatica - M. Falda, A. A. 2007 - 2008 18 / 21 Informatica - M. Falda, A. A. 2007 - 2008 Compilazione Interpretazione Il codice viene tradotto una volta per tutte Il codice viene tradotto linea per linea ogni volta efficiente deve essere ricompilato per ogni calcolatore diverso lento portabile immediatamente su calcolatori diversi permette la meta-programmazione Compilatore Compilatore Programma sorgente (codice) Programma oggetto (eseguibile) Interprete Interprete 19 / 21 Informatica - M. Falda, A. A. 2007 - 2008 Linea del programma sorgente Informatica - M. Falda, A. A. 2007 - 2008 Istruzione/i in linguaggio macchina 20 / 21 PseudoPseudo-codice Il problema della fermata Il codice viene tradotto in un linguaggio intermedio “universale” abbastanza lento portabile immediatamente su calcolatori diversi 1. 2. 3. Compilatore Compilatore Programma sorgente (codice) Informatica - M. Falda, A. A. 2007 - 2008 Virtual Virtual M. M. Programma in pseudo-codice Istruzione/i in linguaggio macchina 21 / 21 Sia P(x) un programma che mi dice se il programma x termina (vero o falso) Aggiungo alla fine di P un programma Q(y) che termina solo se y = P(x) è falsa Se ora pongo x = P ottengo una contraddizione, infatti 1. 2. se P termina P + Q non termina se P non termina P + Q termina 22 / 21 Informatica - M. Falda, A. A. 2007 - 2008