Alcune domande fondamentali Dipartimento di Ingegneria dell’Informazione Università degli Studi di Parma Fondamenti di Informatica n L’elaboratore come strumento in grado di eseguire un’insieme di azioni elementari che vengono richieste tramite istruzioni scritte in un particolare linguaggio 2 Algoritmi e Programmazione 2 2 Quali istruzioni esegue un elaboratore? Quali problemi può risolvere un elaboratore? Che ruolo ha il linguaggio di programmazione? Monica Mordonini FI - Algoritmi e Programmazione Il problema di fondo Algoritmo Descrizione di un problema þindividuazione di un algoritmo n Ø Ø Ø n n come si costruisce la soluzione ad un problema? Quale è il giusto punto di partenza? Quali metodologie o tecniche utilizzare? n Dall'arabo al-Khuwarizmi a sua volta dal greco aritmhós Un algoritmo è un metodo generale che risolve in un tempo finito e con una sequenza finita di mosse qualsiasi istanza di un dato problema di elaborazione. Problemi: q q q FI - Algoritmi e Programmazione FI - Algoritmi e Programmazione 4 Programma n Fase di scrittura di un algoritmo attraverso un insieme ordinato di istruzioni scritte in un qualche linguaggio di programmazione, che specificano le azioni da completare n n n n FI - Algoritmi e Programmazione risolvibili non-risolvibili non-affrontabili 3 Codifica di un algoritmo n 2 5 Testo scritto in accordo alla sintassi e alla semantica di un linguaggio di programmazione Un programma può non essere un algoritmo (basta che la sequenza di mosse non sia finita cioè che il programma non termini)... ... E tuttavia può essere molto utile (es. gestione semafori) Un programma rappresenta l’insieme delle istruzioni che descrivono un processo espresse in un qualche linguaggio Un processo trasforma un insieme di dati iniziali nei risultati finali mediante una successione di azioni elementari FI - Algoritmi e Programmazione 6 1 Esecuzione n n Elementi di un algoritmo L’esecuzione delle azioni nell’ordine specificato dall’algoritmo consente di ottenere a partire dai dati in ingresso i risultati che risolvono il problema Problema : þ algoritmo þ programma metodo risolutivo q q q q n q q q Condurre un'attenta analisi del problema ed eventualmente suddividere il problema in piccoli sottoproblemi. Individuare i possibili ingressi e precisare le uscite (definizione dei dati). Definire completamente e dettagliatamente la sequenza dei passi che portano alla soluzione. FI - Algoritmi e Programmazione 10 Il crivello di Eratostene n Possiamo “trovare” algoritmi anche per la risoluzione di problemi non strettamente informatici Esempi: q 8 Per definire un algoritmo è necessario: 9 Algoritmo n FI - Algoritmi e Programmazione n Finitezza: composto da un numero finito di passi elementari. Non ambiguità (determinismo): i risultati non variano in funzione della macchina/persona che esegue l'algoritmo. Realizzabilità: deve essere eseguibile con le risorse a disposizione. Efficienza (auspicabile): eseguire il numero minimo di operazioni FI - Algoritmi e Programmazione n Processo o anche esecuzione: sequenza ordinata di passi Algoritmo Un algoritmo deve avere le seguenti proprietà : q n 7 Algoritmo q Passi elementari: azioni atomiche non scomponibili in azioni piú semplici linguaggio di programmazione FI - Algoritmi e Programmazione n n 1) Si costruisca una sequenza ordinata dei numeri fra 2 e n. 2) Si estragga il primo numero dalla sequenza. E’ necessariamente un numero primo. 3) Si eliminino dalla sequenza tutti i multipli del numero estratto al passo 2). 4) se la sequenza non e’ vuota si torna la passo 2) altrimenti si termina. Spiegare un percorso stradale Istruzioni per il montaggio di un mobile Istruzioni per l’esecuzione di una torta Un algoritmo può non essere l’unica soluzione al problema FI - Algoritmi e Programmazione Si vogliono trovare tutti i numeri primi compresi fra 2 e n (In modo efficiente). 11 FI - Algoritmi e Programmazione 12 2 Il crivello di Eratostene: esempio Il crivello di Erastone Sequenza iniziale (da 2 a 20): 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,20 2 e’ primo lo elimino con tutti i suoi multipli: 3,5,7,9,11,13,15,17,19 3 e’ primo lo elimino con tutti i suoi multipli: 5,7,11,13,17,19 5 e’ primo lo elimino con tutti i suoi multipli: … 19 e’ primo, la sequenza e’ vuota, termino. n n FI - Algoritmi e Programmazione q q q q 13 Algoritmo di Euclide n n Algoritmo Finito Non ambiguo Realizzabile Efficiente (si spera) FI - Algoritmi e Programmazione 14 Algoritmo di Euclide Calcola il massimo comun divisore fra due interi positivi m ed n (supponiamo che n= m, altrimenti li possiamo scambiare). L’ algoritmo si compone di 3 passi ripetuti ciclicamente fino ad una condizione di arresto: FI - Algoritmi e Programmazione n n n Passo E1 {ricerca del resto} : Sia m = n. Si divide m per n. Sia r il resto. Allora 0 = r < n. Passo E2 {r = 0?} : Se r = 0 l’ algoritmo e’ terminato e n e’ la risposta finale. Passo E3 {scambio} : Se r ? 0 si operano gli scambi m ? n e n ? r. Si torni al passo E1. 15 Algoritmo di Euclide: esempio FI - Algoritmi e Programmazione Algoritmo di Euclide: finitezza n Si voglia l’ MCD fra 30 e 45 (I due numeri vanno scambiati) m n r 45 30 15 30 15 0 16 n Poiche’ al passo E1 {ricerca del resto} si ha senpre 0 = r < n, ad ogni scambio il valore di n decresce. Dopo un numero finito di passi si raggiungera` la condizione r = 0, e la terminazione dell’ algoritmo. Poiche’ il resto r = o, l’ultimo valore per n e’ l’ MCD FI - Algoritmi e Programmazione 17 FI - Algoritmi e Programmazione 18 3 Algoritmo di Euclide Algoritmo di Euclide: correttezza n n n n Ad ogni passo abbiamo che m = q n + r (con q intero). Se r ?0 ogni divisore di m,n divide anche r=m-qn. D’altra parte anche ogni divisore di n,r divide m=qn+r. In pratica la coppia m,n primo e dopo lo scambio m ? n e n ? r hanno lo stesso MCD. Se r=0 l’ algoritmo termina e n e’ l’MCD. FI - Algoritmi e Programmazione n n 19 Calcolo MCD modo 2 FI - Algoritmi e Programmazione Problema: dati due numeri determinare il loro massimo comune denominatore: q q q q q q q 21 Algoritmo n Problema: dati due numeri determinare il loro massimo comun denominatore q scomporre in fattori primi i due numeri considerare solo fattori comuni prendere quelli con esponente piú piccolo moltiplicarli tra loro FI - Algoritmi e Programmazione 20 Calcolo MCD modo 3 n n L’algoritmo descritto non è l’unico per risolvere il problema del MCD Ma è il più efficiente se a priori non conosco nulla dei due numeri costruire insieme divisori primo numero costruire insieme divisori secondo numero costruire intersezione fra i due insiemi individuare nell'intersezione l'elemento piú grande FI - Algoritmi e Programmazione 22 Diagramma di Flusso (Flow-Chart) Per realizzare un algoritmo con un calcolatore occorre rappresentare la sequenza di passi che portano alla sua soluzione con istruzioni appartenenti ad un linguaggio di programmazione. FI - Algoritmi e Programmazione n n n 23 I diagrammi di flusso sono un formalismo grafico per descrivere gli algoritmi. I diagrammi di flusso scompongono in passi successivi gli algoritmi. Un diagramma di flusso è una descrizione più efficace e meno ambigua di una descrizione a parole. FI - Algoritmi e Programmazione 24 4 Diagrammi di flusso n Diagramma di flusso Le operazioni su cui si basa un diagramma di flusso q q q q q q n Ingresso/Uscita dati Trasferimento di informazione (Assegnamenti) Calcolo di espressioni aritmetiche e logiche Assunzione di decisioni Esecuzione di iterazioni (Cicli) Possono contenere costanti e variabili FI - Algoritmi e Programmazione q q FI - Algoritmi e Programmazione I I Si/No No/Si n No/Si n No/Si While - Do Si compone di sequenze, decisioni (if then, if then else) e cicli (while-do, repeat until). Ogni diagramma ha esattamente un ingresso ed una uscita. Ogni azione puo essere q Si/No O 26 Programmazione Strutturata n Si/No Nodi Archi 25 Strutture di Controllo I Un diagramma di flusso è costituito da due tipi di entità: O Repeat - Until O If - Then - Else FI - Algoritmi e Programmazione q una azione semplice una azione composta da altri diagrammi strutturati 27 Tipi di Nodi FI - Algoritmi e Programmazione 28 Esempio: Somma di N Numeri Start Start Var1 Var1 ← Espr1 Inizio Lettura dati Elaborazione / Assegnamento Stop Var1 Fine Scrittura dati Si No Espr1 Espr1 Espr1 Espr1 Espr1 Espr1 = ≠ > ≥ < ≤ I<N Si N Somma ← Somma + Var1 I←I+1 Espr2 Espr2 Espr2 Espr2 Espr2 Espr2 I←0 Somma ← 0 Somma Decisione FI - Algoritmi e Programmazione No Stop 29 FI - Algoritmi e Programmazione 30 5 Esempio: Somma di Tre Numeri Programmazione Top-Down n Start Var1 Somma ← Var1 +Var2 + Var3 La programmazione top-down è una tecnica di programmazione per la realizzazione di programmi con la scomposizione iterativa di un problema in sotto-problemi. Somma Var2 Stop Var3 FI - Algoritmi e Programmazione 31 Tecniche di programmazione n 32 Programmazione Top-Down n Programmazione top-down: scomposizione iterativa del problema in sottoproblemi q i sottoproblemi devono essere indipendenti ed avere interfacce ben definite q visibilità dei dettagli di ogni sottoproblema solo all’interno del sottoproblema stesso q FI - Algoritmi e Programmazione FI - Algoritmi e Programmazione La programmazione top-down si presta molto bene per la definizione di algoritmi con i diagrammi di flusso: q q q All’inizio il diagramma di flusso è rappresentato da un nodo che rappresenta la soluzione al problema. Questo nodo viene scomposto in una rete di nodi in modo iterativo. La scomposizione termina quando i singoli nodi possono essere rappresentati da semplici sequenze di istruzioni del linguaggio di programmazione scelto. 33 Esempio: Somma di Tre Numeri FI - Algoritmi e Programmazione 34 Esempio: Somma di Tre Numeri Start Start Somma i tre numeri Inizializzazione Leggi e somma i tre numeri Stampa la somma Stop Stop FI - Algoritmi e Programmazione 35 FI - Algoritmi e Programmazione 36 6 Esempio: Somma di N Numeri Start No I<N N I←0 Somma ← 0 Problema della ricorsione Si Somma ← Somma + Var1 I←I+1 Somma Stop FI - Algoritmi e Programmazione 37 Il calcolo del fattoriale n Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita n Vediamo di capire cosa significa… 0! = 1 1! = 1(1-1)! = 1·0! = 1·1 = 1 2! = 2(2-1)! = 2·1! = 2·1 = 2 3! = 3(3-1)! = 3·2! = 3·2·1 = 6 4! = 4(4-1)! = 4·3! = 4·3·2·1 = 24 5! = 5(5-1)! = 5·4! = 5·4·3·2·1 = 120 n Quindi, per ogni n intero positivo, il fattoriale di n è il prodotto dei primi n numeri interi positivi se n = 0 1 n!= n( n − 1)! se n > 0 dove n è un numero intero non negativo FI - Algoritmi e Programmazione 39 La ricorsione nella programmazione FI - Algoritmi e Programmazione In un programma… n n n Si invoca un metodo mentre si esegue lo stesso metodo è un paradigma di programmazione che si chiama factorial(1) invoca factorial(0) factorial(0) restituisce 1 factorial(1) restituisce 1 e un metodo che ne faccia uso si chiama factorial(2) restituisce 2 factorial(3) restituisce 6 metodo ricorsivo La ricorsione è uno strumento molto potente per realizzare alcuni algoritmi, ma è anche fonte di molti errori di difficile diagnosi FI - Algoritmi e Programmazione Vediamo la sequenza usata per calcolare 3! si invoca factorial(3) factorial(3) invoca factorial(2) factorial(2) invoca factorial(1) ricorsione n 40 41 n Si crea quindi una lista LIFO (uno stack ) di metodi “in attesa”, che si allunga e che poi si accorcia fino ad estinguersi FI - Algoritmi e Programmazione 42 7 La ricorsione n n La ricorsione n Per capire come utilizzare correttamente la ricorsione, vediamo innanzitutto come funziona Quando un metodo ricorsivo invoca se stesso, la macchina virtuale esegue le stesse azioni che vengono eseguite quando viene invocato un metodo qualsiasi q sospende l’esecuzione del metodo invocante q esegue il metodo invocato fino alla sua terminazione q riprende l’esecuzione del metodo invocante dal punto in cui era stata sospesa FI - Algoritmi e Programmazione n 43 La ricorsione: caso base n q q FI - Algoritmi e Programmazione n il metodo ricorsivo deve fornire la soluzione del problema in almeno un caso particolare, senza ricorrere ad una chiamata ricorsiva tale caso si chiama caso base della ricorsione nel nostro esempio, il caso base era Seconda regola q q if (n == 0) return 1; q n in particolare, che arrivi a conclusione in un numero finito di passi FI - Algoritmi e Programmazione n 46 Invece, se q q ad ogni invocazione il problema diventa sempre più semplice e si avvicina al caso base la soluzione del caso base non richiede ricorsione allora certamente la soluzione viene calcolata in un numero finito di passi, per quanto complesso possa essere il problema Si potrebbe pensare che le chiamate ricorsive si possano succedere una dopo l’altra, all’infinito FI - Algoritmi e Programmazione il concetto di “problema più semplice” varia di volta in volta: in generale, bisogna avvicinarsi ad un caso base La ricorsione: un algoritmo? Le regole appena viste sono fondamentali per poter dimostrare che la soluzione ricorsiva di un problema sia un algoritmo q q 45 La ricorsione: un algoritmo? n il metodo ricorsivo deve effettuare la chiamata ricorsiva dopo aver semplificato il problema nel nostro esempio, per il calcolo del fattoriale di n si invoca la funzione ricorsivamente per conoscere il fattoriale di n-1, cioè per risolvere un problema più semplice if (n > 0) return n * factorial(n - 1); a volte ci sono più casi base, non è necessario che sia unico FI - Algoritmi e Programmazione 44 La ricorsione: passo ricorsivo Prima regola q In ogni caso, anche se il meccanismo di funzionamento della ricorsione può sembrare complesso, la chiave per un suo utilizzo proficuo è q dimenticarsi come funziona la ricorsione, ma sapere come vanno scritti i metodi ricorsivi perché il tutto funzioni! Esistono infatti due regole ben definite che vanno utilizzate per scrivere metodi ricorsivi che funzionino 47 FI - Algoritmi e Programmazione 48 8 Ricorsione infinita n q q n se manca il caso base, il metodo ricorsivo continua ad invocare se stesso all’infinito se il problema non viene semplificato ad ogni invocazione ricorsiva , il metodo ricorsivo continua ad invocare se stesso all’infinito Dato che la lista dei metodi “in attesa” si allunga indefinitamente, l’ambiente runtime esaurisce la memoria disponibile per tenere traccia di questa lista, ed il programma termina con un errore FI - Algoritmi e Programmazione 49 Torri di Hanoi: regole n Torri di Hanoi: regole Il rompicapo è costituito da tre pile di dischi (“torri”) allineate q q n Situazione iniziale Situazione finale all’inizio tutti i dischi si trovano sulla pila di sinistra alla fine tutti i dischi si devono trovare sulla pila di destra I dischi sono tutti di dimensioni diverse e quando si trovano su una pila devono rispettare la seguente regola q nessun disco può avere sopra di sé dischi più grandi FI - Algoritmi e Programmazione 51 Torri di Hanoi: regole n Progetto: Torri di Hanoi Non tutti i metodi ricorsivi realizzano algoritmi FI - Algoritmi e Programmazione Algoritmo di soluzione Per risolvere il rompicapo bisogna spostare un disco alla volta q un disco può essere rimosso dalla cima della torre ed inserito in cima ad un’altra torre n non può essere “parcheggiato” all’esterno… q in ogni momento deve essere rispettata la regola vista in precedenza n nessun disco può avere sopra di sé dischi più grandi n n n n FI - Algoritmi e Programmazione 52 53 Per il rompicapo delle Torri di Hanoi è noto un algoritmo di soluzione ricorsivo Il problema generale consiste nello spostare n dischi da una torre ad un’altra, usando la terza torre come deposito temporaneo Per spostare n dischi da una torre all’altra si suppone di saper spostare n-1 dischi da una torre all’altra, come sempre si fa nella ricorsione Per descrivere l’algoritmo identifichiamo le torri con i numeri interi 1, 2 e 3 FI - Algoritmi e Programmazione 54 9 Algoritmo ricorsivo n n Algoritmo ricorsivo Il caso base si ha quando n vale 1, in questo caso possiamo spostare liberamente il disco da una torre ad un’altra Per spostare n dischi dalla torre 1 alla torre 3 n n 1 gli n-1 dischi in cima alla torre 1 vengono spostati sulla torre 2, usando la torre 3 come deposito temporaneo (si usa una chiamata ricorsiva, al termine della quale la torre 3 rimane vuota) 2 il disco rimasto nella torre 1 viene portato nella torre 3 3 gli n-1 dischi in cima alla torre 2 vengono spostati sulla torre 3, usando la torre 1 come deposito temporaneo (si usa una chiamata ricorsiva, al termine della quale la torre 1 rimane vuota) FI - Algoritmi e Programmazione Si basa sul Principio di induzione Il principio di induzione dice che una proprietà è vera per qualsiasi valore di n se q q 55 è vera per n = 1, e nell’ipotesi che sia vera per un dato valore di n = n’ siamo capaci di dimostrare che è vera per n = n’ +1 FI - Algoritmi e Programmazione 56 La “Torre di Hanoi” Algoritmo Hanoi(n, da, a, int) input: il numero di dichi n, il perno di partenza, di arrivo e intermedio output: le mosse necessarie if n = 1 then muovi (1, da, a) else hanoi (n-1, da, int, a) muovi (n, da, a) hanoi (n-1, int, a, da) FI - Algoritmi e Programmazione 1 10 30 2 10 20 1 30 20 3 10 30 1 20 10 2 20 30 1 10 30 mosse 10 20 57 30 FI - Algoritmi e Programmazione Algoritmo ricorsivo n n FI - Algoritmi e Programmazione 58 59 Si può dimostrare che il numero di mosse necessarie per risolvere il rompicapo con l’algoritmo proposto è pari a: 2n – 1 Il tempo necessario alla soluzione è proporzionale al numero di mosse (ogni mossa richiede un tempo costante) cioe’: T(n) = 2n – 1 FI - Algoritmi e Programmazione 60 10 La torre di Brahama n n Quando finirà il mondo? Torre di Hanoi con 64 dischi Una leggenda narra che alcuni monaci buddisti in un tempio dell’Estremo Oriente siano da sempre impegnati nella soluzione del rompicapo, spostando fisicamente i loro 64 dischi da una torre all’altra, consapevoli che quando avranno terminato il mondo finirà FI - Algoritmi e Programmazione Dipende.. 61 Torri di Hanoi: la leggenda n Sono necessarie 2 64 − 1 mosse, che sono circa 16 miliardi di miliardi di mosse… cioè circa 18 Linguaggi di programmazione 1.6 × 10 n Supponendo che i monaci facciamo una mossa ogni minuto, essi fanno circa 500000 mosse all’anno, quindi il mondo finirà tra circa 30 mila miliardi di anni… n Un processore ad 1GHz che fa una mossa ad ogni intervallo di clock (un miliardo di mosse al secondo…) impiega 16 miliardi di secondi, che sono circa 500 anni... FI - Algoritmi e Programmazione 63 Linguaggi di Programmazione n n 2 2 Linguaggi di Programmazione: Sintassi & Semantica n Un linguaggio di programmazione è una notazione formale per descrivere algoritmi Un programma è la descrizione di un algoritmo in un particolare linguaggio di programmazione Quali “parole chiave” Quali meccanismi di combinazione? FI - Algoritmi e Programmazione Sintassi: l’insieme di regole formali per la scrittura di programmi in un linguaggio, che dettano le modalità per costruire frasi corrette nel linguaggio stesso n Semantica: l’insieme dei significati da attribuire alle frasi (sintatticamente corrette) costruite nel linguaggio . n n.b. Una frase può essere sintatticamente corretta e tuttavia non avere significato 65 FI - Algoritmi e Programmazione 66 11 Sintassi e Semantica n n Sintassi Dopo la definizione di un linguaggio (con sintassi e semantica) serve un sistema che possa eseguire i programmi scritti in tale linguaggio Si parla di implementazione di un linguaggio q 67 Grammatica FI - Algoritmi e Programmazione q q q n un alfabeto di simboli terminal (l'alfabeto del linguaggio) un alfabeto di simboli non terminali un simbolo iniziale S (o assioma) un insieme finito di regole sintattiche Imperativi Funzionali q Dichiarativi q n 69 Linguaggi di Programmazione FI - Algoritmi e Programmazione n q q n Operazioni molto elementari. Diverse per ogni processore. Scritte in linguaggio binario Una prima evoluzione sono i linguaggi assemblativi che sostituiscono i codici binari con codici simbolici. q q q Sono più orientati alla macchina che ai problemi da trattare. ancora orientati alla macchina e non ai problemi più immediati da utilizzare definiscono variabili, simboli START: EQUAL: FI - Algoritmi e Programmazione 70 Linguaggi di Programmazione I linguaggi macchina forniscono solo le operazioni che l'elaboratore può eseguire: q Tutti basati sulla traduzione nell'unico linguaggio eseguibile dal calcolatore: il Linguaggio Macchina Le frasi di un linguaggio di programma-zione sono dette programmi FI - Algoritmi e Programmazione n Diversi tipi di linguaggi: q Data una grammatica, il linguaggio generato è definito come l'insieme delle frasi derivabili a partire dall'assioma S q 68 Linguaggi di Programmazione La grammatica è definita da: q n n Per definire la sintassi di un linguaggio, è necessario definire le grammatiche La grammatica è un insieme di regole che servono per costruire una frase generalmente è un traduttore verso il linguaggio dell’elaboratore FI - Algoritmi e Programmazione n n 71 FI - Algoritmi e Programmazione MOV CMP JZ INT RET MOV AX, BX AX, 12h EQUAL 21h BL, 82h 72 12 Linguaggi di Programmazione n Linguaggi di Programmazione I linguaggi macchina e i linguaggi assemblativi sono detti linguaggi a basso livello. n q q n FI - Algoritmi e Programmazione q q q n FI - Algoritmi e Programmazione n Linguaggi imperativi Linguaggi logici Linguaggi funzionali Linguaggi orientati agli oggetti n Un linguaggio imperativo è legato all’architettura della macchina di Von Neumann, ma ad un livello di astrazione vicino a quello dei diagrammi di flusso. Un programma è una sequenza di istruzioni in cui: q Ognuno provvede le forme espressive appropriate per alcuni problemi specifici. q n q q 75 Linguaggi Imperativi n n n trasferimento dati operazioni aritmetiche alterazione del flusso del programma FI - Algoritmi e Programmazione 76 Linguaggi Logici Le operazioni che effettuano le istruzioni si basano sul concetto di variabile. Una variabile è una astrazione del concetto di locazione di memoria in cui può essere assegnato, letto e modificato un valore. Il C, Fortran, Pascal, Cobol e Basic sono i linguaggi imperativi più diffusi. n Basati sulla logica q q n 77 obiettivo: formalizzare il ragionamento caratterizzati da meccanismi deduttivi Programmare significa: q q FI - Algoritmi e Programmazione Le istruzioni vengono eseguite in sequenza. La sequenza può essere alterata con istruzioni di salto. Eseguono 3 tipi di operazioni: q FI - Algoritmi e Programmazione 74 Linguaggi Imperativi Esistono diversi tipi di linguaggi ad alto livello: q La descrizione del problema in modo intuitivo, dimenticandosi che verranno eseguiti da un calcolatore. Una astrazione rispetto al calcolatore su cui verrà eseguito il programma. Ma devono essere tradotti in linguaggio macchina. 73 Linguaggi di Programmazione n I cosiddetti linguaggi ad alto livello permettono: descrivere il problema con formule del linguaggio interrogare il sistema, che effettua deduzioni sulla base delle definizioni FI - Algoritmi e Programmazione 78 13 Linguaggi Logici n Linguaggi Logici In un linguaggio logico un programma è composto da una base di conoscenza contenente: L’esecuzione di un programma corrisponde all’applicazione delle regole sui fatti della base di conoscenza: n Una descrizione del dominio del problema composta da un insieme di fatti. Un insieme di regole per manipolare l’insieme dei fatti. q q q q q Il linguaggio più conosciuto è il Prolog. n FI - Algoritmi e Programmazione 79 FI - Algoritmi e Programmazione n n n Linguaggi basati sul concetto di funzione e di applicazione di una funzione ad argomenti; per questa ragione essi sono anche detti linguaggi applicativi In un linguaggio funzionale un programma è visto come una funzione matematica. L’esecuzione di un programma corrisponde alla valutazione della funzione rispetto ai suoi argomenti. FI - Algoritmi e Programmazione La differenze maggiori con un linguaggio imperativo sono: q q q n Il Lisp (acronimo per LISt Processing) è il linguaggio più conosciuto, ma non è più molto usato. FI - Algoritmi e Programmazione In un linguaggio di programmazione orientato agli oggetti (OOP) un programma consiste: q q Interagiamo con oggetti di uso quotidiano, conoscendone le funzioni, ma non il funzionamento interno q Definizione di un insieme di classi. Creazione di un insieme di oggetti ed esecuzione dei suo metodi. Il C++ e Java sono i due linguaggi OOP più diffusi q Gli oggetti sono scatole nere dotate di interfaccia che limita l’accesso ai meccanismi interni Gli oggetti hanno uno stato n q 83 L’insieme delle proprietà che lo caratterizzano in un dato istante e un comportamento n n FI - Algoritmi e Programmazione 82 Cos’è un oggetto? n q Non esiste il concetto di variabile: il calcolo è basato sul calcolo di valori e non sull'assegnamento di valori a variabili il risultato è il risultato di una funzione, non l'effetto causato dalla esecuzione di una sequenza di operazioni Sono adatti a elaborazioni simboliche non numeriche. 81 Linguaggi Orientati agli Oggetti n 80 Linguaggi Funzionali Linguaggi Funzionali n L’esecuzione è guidata da un motore inferenziale. L’esecuzione è attivata da una interrogazione dell’utente. Lo scopo dell’esecuzione è verificare che l’interrogazione dell’utente è vera o falsa. L’insieme delle azioni che un oggetto può compiere Un oggetto sw è un’astrazione o un modello della realtà che limita il numero dei dettagli rappresentati all’essenziale per il contesto considerato 84 14 Astrazione n n q q n Lo stato di un oggetto sw è descritto e rappresentato da una o più variabili n Non ci preoccupiamo dei suoi dettagli interni per usarlo Non conosciamo come funziona il metodo “scrivi a monitor” quando l’invochiamo Una variabile è un dato individuato da un identificatore q Effettuiamo astrazioni continuamente q q n Gli oggetti software L’astrazione nasconde o ignora dettagli inessenziali Un oggetto è un’astrazione Possiamo trattare solo poche informazioni contemporaneamente Ma se raggruppiamo le informazioni (come gli oggetti) allora possiamo trattare informazioni più complicate Quindi, possiamo anche scrivere software complesso organizzandolo attentamente in classi e oggetti n il comportamento è definito dai metodi n Un oggetto sw è costituito dall’insieme delle variabili e dei metodi 85 Gli oggetti software FI - Algoritmi e Programmazione 86 Oggetti e classi Un insieme di dati e funzioni: Dato Dato Dato FI - Algoritmi e Programmazione n Gli oggetti sono generati da una classe q Fun ne zio zio ne Fun Cod ice i Cod one funz ce ion zi e fun Fun zio ne Co fun dice zio ne n La classe è uno schema per produrre una categoria di oggetti strutturalmente identici q La classe costituisce il prototipo q Una classe è una fabbrica di istanze: possiede lo schema e la tecnica di produzione 87 Classi ed ereditarieta’ Si dicono anche istanze della classe FI - Algoritmi e Programmazione 88 Gli oggetti come astrazione Soldato n Un oggetto che modella una bicicletta q q FI - Algoritmi e Programmazione 89 Una velocità (20 Km/h), il giro dei pedali (15 g/m) e la marcia (5°) sono variabili di istanza proprietà rappresentate in ciascuna bicicletta modellata FI - Algoritmi e Programmazione 90 15 Gli oggetti come astrazione – 2 Le istanze n n n Inoltre nel modello rappresentiamo funzioni come frenare o cambiare marcia, che modificano le variabili d’istanza Si chiamano metodi d’istanza perché hanno accesso alle variabili d’istanza e le modificano FI - Algoritmi e Programmazione 91 Incapsulamento dei dati n n n n n q n n La bicicletta appesa in garage è un oggetto e basta, ci vuole un ciclista che interagisca con lei perché sia interessante Gli oggetti sw per interagire si mandano messaggi Chiedendo di eseguire un certo metodo (procedura) q Consente modularità e flessibilità nel codice, impedendo errori nel manipolare gli oggetti e semplifica la gestione di sistemi complessi 93 I messaggi – 2 n 92 Gli oggetti interagiscono tra loro per ottenere funzioni più complesse q Private: accessibili solo alla classe Public: accessibili a chiunque e quindi anche alle sottoclassi FI - Algoritmi e Programmazione n FI - Algoritmi e Programmazione I messaggi Nascondere le informazioni fornendo un’interfaccia Netta divisione fra interfaccia e implementazione Le variabili di un oggetto, che ne rappresentano lo stato, sono nascoste all’interno dell’oggetto, accessibili solo ai metodi Idealmente i metodi proteggono le variabili Diversi livelli di accesso a metodi e variabili q n Definita una classe, si possono creare un numero arbitrario di oggetti appartenenti alla classe FI - Algoritmi e Programmazione 94 I messaggi – 3 n Spesso i metodi necessitano di informazioni per poter essere eseguiti: i parametri Tre componenti: n n L’oggetto a cui il messaggio è rivolto q Il metodo da eseguire per ottenere un certo effetto q I parametri , se necessari al metodo q FI - Algoritmi e Programmazione n n 95 Un oggetto può essere visto come un insieme di servizi che possiamo chiedere di eseguire I servizi sono definiti dai metodi Il comportamento degli oggetti è definito dai suoi metodi e il meccanismo di invio dei messaggi consente l’interazione tra gli oggetti Ogni oggetto ha in se tutto ciò che gli serve per rispondere alle chiamate Gli oggetti che si scambiano i messaggi possono anche essere ‘distanti’ tra loro q Su macchine diverse q Non appartenenti allo stesso modello FI - Algoritmi e Programmazione 96 16 Interfaccia n n n Inviare messaggi L’interfaccia è l’insieme dei messaggi che un oggetto è in grado di interpretare Un oggetto deve soddisfare la richiesta di un messaggio Eseguendo il metodo si soddisfa la risposta ad un messaggio da parte di un agente cambia (marcia) n bicicletta_rossa.cambia(2); oggetto vel: 20 ciclista_A 97 FI - Algoritmi e Programmazione Approccio OO n Sono le strutture di dati che svolgono le azioni, non le subroutines Il lavoro è svolto dal server, non dal client “Cos’ è?” “Com’ è fatto?” à Data Oriented “Cosa può fare per me?” à Object Oriented FI - Algoritmi e Programmazione n n FI - Algoritmi e Programmazione n q n q n La programmazione ad oggetti, attraverso l’incapsulazione, consente di: ridurre la dipendenza del codice di alto livello dalla rappresentazione dei dati q riutilizzare del codice di alto livello q sviluppare moduli indipendenti l’uno dall’altro q avere codice utente che dipende dalle interfacce ma non dall’implementazione q non può essere cambiato con faciltà non può essere stimato l’impatto di una modifica Fragilità q 100 Programmazione ad oggetti Rigidità q Programmare per oggetti non velocizza l’esecuzione dei programmi... Programmare per oggetti non ottimizza l’uso della memoria... E allora perchè programmare per oggetti? Programmare per oggetti facilita la progettazione e il mantenimento di sistemi software molto complessi! 99 Caratteristiche del software non mantenibile n 98 Perché programmare per oggetti? n n i parametri informazioni fornite al metodo bicicletta_rossa FI - Algoritmi e Programmazione n metodo marcia: 5 nome: carlo n Il ciclista ciclista_A che vuole cambiare marcia invia il messaggio all’oggetto bicicletta_rossa una modifica singola causa una cascata di modifiche successive i bachi sorgono in aree concettualmente separate dalle aree dove sono avvenute le modifiche Non riusabilità q esistono molte interdipendenze, quindi non è possibile estrarre parti che potrebbero essere comuni FI - Algoritmi e Programmazione 101 FI - Algoritmi e Programmazione 102 17 Metodi di sviluppo del software Metodi di sviluppo del software Un metodo comprende: n Una notazione mezzo comune per esprimere strategie e decisioni n Un processo specifica come deve avvenire lo sviluppo FI - Algoritmi e Programmazione Strategie di sviluppo di un progetto software n n n n n n 104 Modello a cascata Requisiti: cosa l’utente vuole Analisi: la visione dell’informatico dei requisiti Disegno: l’aspetto del sistema software Produzione: codifica Testing: debugging e verifica dei requisiti Mantenimento: installazione del prodotto e Requisiti Analisi Disegno Produzione controllo del funzionamento per il resto della sua vita Testing FI - Algoritmi e Programmazione 105 Modello evoluzionario FI - Algoritmi e Programmazione Confronto fra i modelli di sviluppo Requisiti A cascata Analisi n Testing n n Disegno n Produzione FI - Algoritmi e Programmazione 106 n 107 Evoluzionario Processo lineare (si torna al passo precedente solo in caso di problemi) Confinamento delle attività in ogni fase Facile da gestire (gestione delle scadenze) Difficile da modificare Prodotto utilizzabile solo alla fine del processo n n n n n Processo ciclico (brevi processi completi) Attività distribuite su più fasi Difficile da gestire Facile da modificare e integrare Prototipo utilizzabile fin dal primo ciclo FI - Algoritmi e Programmazione 108 18 Requisiti n n Analisi Definizione delle richieste da parte dell’utente del programma (o di una sua parte) sul sistema Si parla di programmazione per contratto perchè l’utente richiede solamente la definizione del servizio richiesto NON la metodologia seguita per fornirglielo q è possibile delegare parte del lavoro richiesto ad altri q il sistema è indipendente da chi è il suo utente n n Comprensione e razionalizzazione delle richieste dell’utente Costruzione di un modello q q n astrazione (semplificazione delle relazioni) rilevanza (identificazione degli oggetti chiave) Da non trascurare: analisi delle soluzioni esistenti. Può far risparmiare molto tempo!!! INCAPSULAMENTO! FI - Algoritmi e Programmazione 109 Disegno FI - Algoritmi e Programmazione Disegno (2) Definizione di oggetti e classi n Definizione delle interfacce Definizione degli stati e dell’implementazione n n Definizione delle relazioni FI - Algoritmi e Programmazione n n Dopo ogni ciclo bisogna analizzare i rischi, la stabilità del disegno e la complessità delle classi Se una classe è troppo complessa conviene dividerla Ad ogni ciclo il numero di modifiche deve diminuire Architetture troppo complesse devono essere modularizzate 111 Codifica n 110 FI - Algoritmi e Programmazione 112 Testing C’è poco da dire… Non sopravvalutate questa fase: n Debugging: è ovvio… il codice non deve dare n Use cases: specificano il comportamento del n Scenarios: sono esempi concreti di use cases. Per errori. Suddivisione del tempo per il primo ciclo Testing Analisi 20% 30% sistema in una regione. definizione se tutti gli scenari sono soddisfatti correttamente il test è positivo. Codifica 15% Disegno 35% FI - Algoritmi e Programmazione 113 FI - Algoritmi e Programmazione 114 19