Sommario • Problema computazionale • Sviluppo software • Algoritmi – Diagrammi di Flusso; – Pseudo Codice • Istruzioni Sequenziali, Condizionali, Cicliche; • Javascript Fondamenti di Informatica -- R.Gaeta 1 Il Problema computazionale • È computazionale un problema che da alcuni dati iniziali porta ad un risultato in uscita tramite almeno una sequenza preordinata di passi; • Esempi nella vita pratica si trovano facilmente nell’arte culinaria o nella musica. Fondamenti di Informatica -- R.Gaeta 2 Esempi Il Risotto alla Zucca: - Abbiamo gli ingredienti (riso, zucca, olio, prezzemolo, cipolla, sale, etc.) con le giuste quantità; - Seguiamo la ricetta; - Serviamo il piatto a tavola. Fondamenti di Informatica -- R.Gaeta 3 Altro esempio L’esecuzione della nona di Beethoven: - Abbiamo l’orchestra, il direttore ed i musicisti; - Seguiamo lo spartito; - La musica riempie la sala. Fondamenti di Informatica -- R.Gaeta 4 Ma… • Non è così facile come sembra! • Per scrivere la “sequenza di passi” bisogna essere un bravo cuoco o un bravo compositore (o entrambi, come Rossini); • Anche per sapere “eseguire” bisogna imparare l’arte (bisogna avere un ottimo esecutore). Fondamenti di Informatica -- R.Gaeta 5 Il “cuore” dell’informatica • definizione di un particolare problema computazionale • scrittura di un algoritmo che lo risolve • scrittura del programma che traduce i passi dell’algoritmo in termini comprensibili dal computer Fondamenti di Informatica -- R.Gaeta 6 Il “cuore” dell’informatica • Ovvero, dato un problema bisogna definire un procedimento (l’algoritmo) che possa essere eseguito automaticamente da un esecutore a partire dai dati in ingresso per risolvere il problema (fornire i risultati in uscita) algoritmo input esecutore output Fondamenti di Informatica -- R.Gaeta 7 Quindi… problema risolutore algoritmo esecutore essere umano calcolatore esecuzione Fondamenti di Informatica -- R.Gaeta 8 Cosa è un Algoritmo • Un algoritmo (procedimento) è una sequenza finita di passi (azioni) che un esecutore è in grado di eseguire affinché venga risolto (in un tempo finito) un dato problema computazionale. • Ogni passo deve essere eseguibile dall’esecutore e in un tempo finito. • Un algoritmo determina un procedimento sequenziale (un passo dopo l’altro secondo un ordine specificato chiamato flusso di esecuzione) • La cosa difficile è scrivere una sequenza di passi che risolvano il problema computazionale e NON scrivere un programma per il calcolatore Fondamenti di Informatica -- R.Gaeta 9 Esecutore di algoritmi • Un esecutore è caratterizzato da – il linguaggio che è in grado di interpretare – l’insieme di azioni che è in grado di compiere – l’insieme delle regole che ad ogni frase corretta del linguaggio (costrutto linguistico) associano le relative azioni da compiere Fondamenti di Informatica -- R.Gaeta 10 Caratteristiche di un algoritmo • Tutte le azioni specificate dall’algoritmo devono essere eseguibili dall’esecutore – sono azioni elementari • In caso contrario, si deve scomporre un problema complesso in più sotto-problemi più semplici • Per ogni problema più semplice deve esistere un’istruzione nel linguaggio adottato per la scrittura degli algoritmi la cui esecuzione lo risolve. Fondamenti di Informatica -- R.Gaeta 11 Esempio di algoritmo L’esecutore è un essere umano che è solo in grado di premere tasti ed usare il mouse • Accendere il calcolatore • Accendere il monitor • Scrivere il nome utente • Scrivere la password • Premere il tasto invio • Se compare il messaggio di “password scaduta” allora cambiare la password altrimenti accedere al desktop di windows Fondamenti di Informatica -- R.Gaeta 12 Esempio: scomposizione in sotto-problemi • Ma l’esecutore sa direttamente eseguire il comando “cambiare la password”? • NO! Abbiamo definito in maniera precisa ed univoca che cosa l’esecutore è in grado di fare per cui dobbiamo scrivere un algoritmo per la risoluzione del problema “cambiare la password” – scrivere una sequenza di almeno sei caratteri – ri-scrivere, per conferma, la stessa sequenza – premere il tasto invio • Per esercizio, avendo ormai esperienza di come si accede all’aula 15, completate l’algoritmo!! Fondamenti di Informatica -- R.Gaeta 13 Caratteristiche di un algoritmo • Formulazione generale – • Passi eseguibili univoci e non ambigui – • la soluzione individuata non deve dipendere solo da valori predefiniti dei dati, cosi che l’algoritmo sia utilizzabile nel maggior numero possibile di casi “abbastanza”, “a volontà”, “un pochetto”, non sono adatti ad esecutori come i calcolatori. Determinismo – una volta fatto un passo, in maniera univoca quello successivo può essere determinato dall’esecutore anche se ci sono alternative • Finitezza del numero di passi • Terminazione – • prima o poi l’esecuzione dell’algoritmo deve terminare La finitezza del numero dei passi implica la terminazione? Fondamenti di Informatica -- R.Gaeta 14 Caratteristiche di un algoritmo Ogni passo (azione) deve • terminare entro un intervallo finito di tempo • produrre un effetto osservabile • produrre lo stesso effetto ogni volta che viene eseguito a partire dalle stesse condizioni iniziali Fondamenti di Informatica -- R.Gaeta 15 Elementi degli algoritmi • Oggetti: le entità su cui opera l’algoritmo – Dati iniziali del problema, informazioni ausiliarie, risultati parziali e finali – Le informazioni sono dette dati (anche i risultati parziali e finali) e possono essere variabili o costanti • Operazioni: Interventi da effettuare sui dati – Calcoli, confronti, ricopiature,acquisizioni, emissioni, ecc. • Flusso di controllo: l’indicazione delle possibili successioni dei passi dell’algoritmo – La correttezza dei risultati dipende non solo dalla corretta esecuzione delle singole operazioni, ma anche dalla corretta sequenza con cui sono eseguite Fondamenti di Informatica -- R.Gaeta 16 Flusso di controllo e di esecuzione • Flusso di controllo: la descrizione a priori di tutte le possibili sequenze nell’esecuzione dei passi dell’algoritmo, in particolare di operazioni in alternativa e di operazioni da ripetere più volte ciclicamente • Flusso di esecuzione: la sequenza di operazioni effettivamente seguita durante una particolare esecuzione dell’algoritmo e che dipende dai particolari valori che i dati assumono in quell’esecuzione Fondamenti di Informatica -- R.Gaeta 17 Cosa è un programma • Il programma è la “scatola nera” che risolve il problema computazionale; • Il programma è una sequenza di istruzioni che devono essere eseguite; • Il programma è la traduzione per il computer dei passi dell’algoritmo • Deve essere scritto tramite un linguaggio che il computer capisca (linguaggio macchina); • Il programmatore utilizza un linguaggio di programmazione che poi viene tradotto (da qualcosa) in linguaggio macchina; Fondamenti di Informatica -- R.Gaeta 18 Dall’uomo al calcolatore uomo pseudo codice diagramma di flusso algoritmo programma linguaggio di programmazione ad alto livello traduttore linguaggio macchina esecuzione del processore input calcolatore output Fondamenti di Informatica -- R.Gaeta 19 Fasi di creazione di un programma 1. Studio Preliminare 2. Analisi del Sistema 6. Manutenzione e Test 3. Progettazione 5. Implementazione 4. Sviluppo Fondamenti di Informatica -- R.Gaeta 20 Le fasi • Analisi del problema computazionale (individuare input ed output, etc.) • Progettazione di una soluzione proponendo una suddivisione del problema in sottoproblemi più semplici; alla fine di questa fase, per ogni sottoproblema si deve scrivere l’algoritmo utilizzando pseudo-codici e diagrammi di flusso; • Stesura del programma a implementazione vera e propria partire dall’algoritmo: • Test del programma: alfa testing, beta testing, debugging • Produzione documentazione e distribuzione Fondamenti di Informatica -- R.Gaeta 21 Un altro esempio di algoritmo Preparazione del Risotto alla Zucca da parte di un esecutore in grado di aggiungere, tagliare, mescolare, tostare, mantecare,… 1. Preparare il soffritto ed il brodo; 2. Aggiungere la zucca a pezzettini al soffritto; 3. Mescolare fino a quando la zucca non è un purè; 4. Aggiungere il riso al soffritto; 5. Fare tostare il riso; poi bagnarlo con il vino; 6. Aggiungere brodo fino a quando il riso è cotto; 7. Aggiungere prezzemolo, pepe e burro; 8. Se preferisci salato, allora aggiungi sale; Fondamenti di Informatica -- R.Gaeta 22 Sottoproblemi • L’algoritmo precedente è un altro esempio di cosa significa scomporre un problema in sottoproblemi; – Come si prepara un soffritto? – Come si prepara un brodo? • Ogni sottoproblema può essere scomposto in problemi via via più elementari; • Per ogni problema elementare deve esistere un’istruzione nel linguaggio adottato la cui esecuzione lo risolve. Fondamenti di Informatica -- R.Gaeta 23 Alto e basso livello • Man mano che si suddivide il problema in sottoproblemi, si scende di livello; • Se ci si avvicina al linguaggio umano, si parla di linguaggi di Alto livello; • Se ci si avvicina al linguaggio macchina, si parla di linguaggi di Basso livello; Fondamenti di Informatica -- R.Gaeta 24 Linguaggi Linguaggio umano (es. Italiano) Descrizione di un algoritmo (es. diagrammi di flusso, pseudo codice, etc…) Linguaggi di Programmazione (es. C, VBasic, Java, Logo, etc…) Alto livello Linguaggio Macchina Basso livello Fondamenti di Informatica -- R.Gaeta 25 Linguaggi di programmazione • Linguaggio macchina – Codifica binaria delle istruzioni – Diverso per ogni architettura – Istruzioni e operazioni elementari coincidono • Linguaggio Assembler – Sempre a livello macchina, ma codifica simbolica delle istruzioni – Es: ADD R1, R6 STORE R1, RAM[255] MOV R1, #4 Fondamenti di Informatica -- R.Gaeta 26 Linguaggi di programmazione • Linguaggio ad alto livello (HLL - High-Level Languages – Elaboratore virtuale • Operazioni molto più astratte delle operazioni HW – Es: x = y+2 z = cos(x) – Linguaggio indipendente dalla piattaforma! – Possibile mediante l’esistenza di traduttori Fondamenti di Informatica -- R.Gaeta 27 Linguaggi di programmazione Programma sorgente (HLL) Traduttore Programma eseguibile (bit) Fondamenti di Informatica -- R.Gaeta 28 Traduttori “somma due interi” … “stampa un messaggio” 010101010111 010101111111 101010101010 101010101011 Traduttore Traduttore ... Uomo Macchina Fondamenti di Informatica -- R.Gaeta 29 Traduttori • Due schemi – Compilatori – Interpreti Fondamenti di Informatica -- R.Gaeta 30 Compilatori • Traduzione avviene in due passi: – Compilazione vera e propria – Collegamento (link) • Dopo la fase di link, il programma può essere eseguito direttamente • Ogni fase produce un file corrispondente all’aggiunta di informazioni di vario tipo – Formato oggetto – Formato eseguibile Fondamenti di Informatica -- R.Gaeta 31 Compilatori sorgente COMPILATORE COMPILATORE oggetto LINKER LINKER eseguibile Libreria 01011010 01010100 11111111 ... Fondamenti di Informatica -- R.Gaeta 32 Linker • Risolve i riferimenti ad indirizzi di memoria – Indirizzi logici => indirizzi fisici • Aggiunge al codice le librerie: – Funzioni pre-compilate e riutilizzabili (es. funzioni matematiche) e distribuite con il compilatore – Codice scritto in precedenza – Due schemi: • Librerie statiche • Librerie dinamiche Fondamenti di Informatica -- R.Gaeta 33 Interpreti • Il formato interno viene generato traducendo il formato sorgente • Il programma viene interpretato eseguito istruzione per istruzione. ed interpretando e immediatamente • Non viene generato né formato intermedio (oggetto) né eseguibile. Fondamenti di Informatica -- R.Gaeta 34 Compilatori vs. interpreti • Linguaggi compilati: – Vantaggi: • Formato del programma eseguibile più efficiente → esecuzione più veloce • Migliore supporto per istruzioni “complesse” e programmi di grandi dimensioni – Svantaggi: • Rallentamento tempo di sviluppo dei programmi • Maggiori requisiti di spazio di memoria (il compilatore è un programma sofisticato) • Linguaggi interpretati: – Ideali in ambiente didattico per lo sviluppo rapido di programmi. Fondamenti di Informatica -- R.Gaeta 35 Portabilità del software • Possibilità per un programma di poter essere eseguito su piattaforme HW e SW diverse da quelle su cui è stato sviluppato compilatore Windows codice sorgente compilatore Linux compilatore MacOS codice eseguibile Windows codice eseguibile Linux codice eseguibile MacOS Fondamenti di Informatica -- R.Gaeta 36 Linguaggi di programmazione • FORTRAN – FORmula TRANslation (1956) • calcoli tecnico-scientifici (ambiente fisico/matematico) • svariate librerie • compilato • COBOL – COmmerce and Business Oriented Language (1960) • elaborazione di archivi, tabulati • applicazioni contabili Fondamenti di Informatica -- R.Gaeta 37 Linguaggi di programmazione • BASIC – Beginner’s All-purpose Symbolic Instruction Code (1962) • relativamente semplice • capacità grafiche • interpretato • versioni “evolute” (VisualBasic) • PASCAL – (1972) • Linguaggio molto “formale” (progetto accademico) • Programmazione strutturata • Utile per la didattica • Compilato Fondamenti di Informatica -- R.Gaeta 38 Linguaggi di programmazione • C – Bell Labs (1972) • Evoluzione più efficiente del PASCAL • Istruzioni per ottimizzazione del codice • efficiente • Molto usato nella programmazione di sistema • compilato • C++ – Bell Labs (‘80) • Evoluzione del C ad oggetti • Diverso paradigma di programmazione • Include il C • compilato Fondamenti di Informatica -- R.Gaeta 39 Linguaggi di programmazione • Java – Sun MicroSystems (‘90) • Evoluzione del C++ • Schema misto compilato+interpretato • Portabilità universale tramite formato intermedio (bytecode) • Vasta gamma di librerie • Supporto alla programmazione web • Perl – GNU project (‘90) • interpretato • complesso, ma molto potente • molto utilizzato nella programmazione web • programmi=>script Fondamenti di Informatica -- R.Gaeta 40