Progetto per il corso di Linguaggi di Programmazione e Compilatori A.A ML--

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Progetto per il corso di Linguaggi di Programmazione e Compilatori A.A. 2003-2004 ML--"

Transcript

1 Progetto per il corso di Linguaggi di Programmazione e Compilatori A.A ML-- Luca Padovani lpadovan@cs.unibo.it 1 Introduzione Scopo del progetto è scrivere un compilatore per un linguaggio funzionale (in pratica un sottoinsieme di OCaml con pochissime differenze sintattiche). La semantica del linguaggio è sostanzialmente la stessa degli analoghi costrutti presenti in OCaml, in particolare la strategia di valutazione è la call-by-value. Il compilatore deve generare un codice oggetto per la macchina astratta SECD descritta nella sezione 4. Si deve quindi scrivere un interprete per la macchina astratta e verificare la corretta esecuzione dei programmi compilati. In alcuni punti della specifica compaiono dei paragrafi che suggeriscono possibili estensioni al linguaggio e/o alla macchina astratta. Le estensioni sono marcate da uno o più asterischi che ne indicano la difficoltà. Pur non essendo obbligatorio implementarle (è possibile ottenere il massimo del punteggio anche senza implementarne alcuna) i gruppi sono invitati a studiarne le problematiche relative, ed è possibile che in fase di discussione del progetto venga richiesto di ragionare su alcune di esse. La tabella 1 mostra la grammatica del linguaggio completo che il compilatore deve essere in grado di accettare. I token per le costanti (numeri interi, valori booleani, stringhe) e gli identificatori sono definiti esattamente come in OCaml. Il linguaggio ammette commenti che, come in OCaml, sono racchiusi dalle sequenze (* e *). La precedenza e l associatività degli operatori deve essere quella degli operatori analoghi (con lo stesso nome) del linguaggio OCaml. I costrutti presenti al livello del linguaggio completo essere implementati usando un insieme di costrutti più semplici che definiamo linguaggio minimale (tabella 2). È dunque conveniente espandere i costrutti del linguaggio completo in costrutti equivalenti (generalmente più voluminosi ) del linguaggio minimale e definire le regole di tipaggio e di compilazione sul linguaggio minimale in modo da semplificare la struttura del compilatore (e di questa specifica). Alcune delle espansioni non sono ottimali dal punto di vista dell efficienza, ma questi aspetti non sono rilevanti ai fini del progetto e quindi verranno quasi sempre ignorati. Estensione 1 (*) Arrichire la sintassi del linguaggio completo con un costrutto iterativo del tipo: expr ::= for var = expr to expr do expr done Codificare il costrutto senza arricchire il livello del linguaggio minimale e senza modificare la macchina astratta. 2 Dal linguaggio completo al linguaggio minimale Nelle sezioni seguenti descriveremo il processo di espansione (o codifica) dal linguaggio completo al linguaggio minmale. Indicheremo la codifica con il simbolo. Si intende che i passi di codifica debbano essere iterati fin quando possibile. 2.1 Codifica di coppie e liste Nel linguaggio completo una coppia ordinata si costruisce con l operatore virgola: E 1, E 2 (pair E 1 E 2 ) 1

2 Tabella 1: Grammatica del linguaggio completo global ::= #use "string" ;; let [rec] var 0 var 1 var n = expr ;; n 0 expr ;; const ::= int bool string expr ::= const var unop expr expr 1 binop expr 2 expr 1 ; expr 2 fun var 1 var n -> expr n 1 function rule 1 rule n n 1 begin expr end ( expr 1 expr n ) n 0 ( binop ) ( unop ) [ expr 1 expr n ] n 0 let [rec] var 0 var 1 var n = expr 1 in expr 2 n 0 if expr 1 then expr 2 [else expr 3 ] match expr with rule 1 rule n n 1 rule ::= pattern -> expr pattern ::= const () _ var ( pattern ) pattern 1, pattern 2 pattern 1 :: pattern 2 [ pattern 1 pattern n ] n 0 unop ::= not ~- $ write binop ::=, :: ^ + - * / & or && = <> <= < > >= 2

3 Tabella 2: Il linguaggio minimale. const ::= nil unit int bool string expr ::= const var ( unop expr ) ( binop expr 1 expr 2 ) fun var -> expr ( expr 1 expr 2 ) let [rec] var = expr 1 in expr 2 if expr 1 then expr 2 else expr 3 unop ::= first second head tail not to_string write fail binop ::= pair cons concat add sub mul div and or eq ne lt le A differenza di quanto avviene in OCaml, assumeremo che l operatore virgola abbia associatività a destra, cosicché un espressione del tipo E 1,E 2,E 3 stia ad indicare (E 1,(E 2,E 3 )). Una lista ha due possibili costruttori: [] rappresenta la lista vuota, mentre :: è il costruttore che dato un valore v ed una lista l rappresenta la lista v::l. Le espressioni di tipo lista vengono codificate come segue: [] nil E 1 ::E 2 (cons E 1 E 2 ) [E 1 E n ] E 1 :: ::E n ::[] In modo analogo i pattern sulle liste vengono codificati come segue: [] nil [P 1 P n ] P 1 :: ::P n ::[] La codifica dei pattern nel linguaggio minimale è discussa nella sezione 2.7. Estensione 2 (*) Estendere la sintassi delle espressioni e dei pattern in modo che sia possibile usare liste della forma [E 1 E n E n+1 ] che ha il significato di E 1 :: ::E n ::E n Funzioni ed applicazioni generalizzate Le funzioni del linguaggio completo ammettono un numero arbitrario di argomenti. Analogamente, le applicazioni ammettono un numero arbitrario di argomenti. Ecco come funzioni ed applicazioni del linguaggio completo vengono codificate nel linguaggio minimale, dove sia le funzioni che le applicazioni lavorano con un solo argomento: fun V 1 V n -> E fun V 1 -> -> fun V n -> E (E 1 E n ) ( (E 1 E 2 ) E n ) Il costrutto function permette di definire una funzione ad un argomento direttamente per pattern matching. Il costrutto viene codificato come segue: function M 1 M n fun V -> match V with M 1 M n dove V è una variabile fresh, cioè una variabile che non occorre libera in nessun M i. Inoltre, il costrutto di binding let ammette la definizione diretta di funzioni: let [rec] V 0 V 1 V n = E 1 in E 2 let [rec] V 0 = fun V 1 V n -> E 1 in E 2 Estensione 3 (**) Estendere il linguaggio completo in modo da ammettere la definizione simultanea di più valori (non ricorsivi), rimpiazzando la produzione per il costrutto let con: expr ::= let bind 1 and bind n in expr (n 1) bind ::= var 0 var 1 var n = expr (n 0) Assicurarsi che le regole di scoping degli identificatori definiti siano quelle desiderate. 2.3 Il valore unit L espressione E 1 ; E 2 valuta E 1 per prima, scarta il risultato (che per le regole di tipaggio deve essere ()) e poi valuta E 2. Il valore dell intera espressione è il valore di E 2. Nel linguaggio l unico operatore che produce un sideeffect è write, per cui la valutazione sequenziale 3

4 verrà in genere usata in congiunzione con questo operatore che ritorna come valore (): () unit E 1 ; E 2 let V = E 1 in E 2 if E 1 then E 2 if E 1 then E 2 else () dove V è una variabile fresh. 2.4 Operatori currificati Un espressione della forma ( unop ) indica una funzione ad un argomento che applica l operatore unario specificato. Analogamente un espressione della forma ( binop ) indica una funzione a due argomenti. La differenza fondamentale tra un operatore e la sua versione currificata è che quest ultima rappresenta un valore di prima classe che può essere passato come argomento, restituito come risultato, applicato parzialmente. Ad esempio, non è possibile applicare parzialmente l operatore di somma +, come in (+ 1), per indicare la funzione successore. È però possibile farlo con la versione currificata dell operatore (+). In particolare è possibile definire: let succ = ((+) 1) ;; Gli operatori currificati si codificano come segue: ( unop ) fun V -> unop V ( binop ) fun V 1 V 2 -> V 1 binop V Operatori booleani non stretti Gli operatori && e rappresentano le versioni non strette (o lazy) degli operatori & e or rispettivamente, in cui cioè il secondo operando viene valutato solo se necessario. Essi possono essere codificati come segue: E 1 && E 2 if E 1 then E 2 else false E 1 E 2 if E 1 then true else E Altri operatori La macchina astratta non ha istruzioni per eseguire confronti di tipo maggiore-di o maggiore-o-uguale-a, ma queste operazioni si codificano banalmente invertendo l ordine delle espressioni confrontate: E 1 > E 2 E 2 < E 1 E 1 >= E 2 E 2 <= E 1 Analogamente, la macchina astratta non ha un operazione per negare un numero intero: ~- E 0 - E L operatore prefisso $ del linguaggio completo corrisponde a to_string nel linguaggio minimale. 2.7 Codifica del costrutto di pattern match Il costrutto di pattern match lo si codifica come una catena di test della forma M(P, E 1, E 2, E 3 ) il cui significato intuitivo è: valuta l espressione E 1 e confronta il risultato con il pattern P. Se c è corrispondenza tra il valore dell espressione ed il pattern allora valuta E 2, altrimenti valuta E 3 : match E with P 1 -> E 1 P n -> E n M(P 1, E, E 1, ( (M(P n, E, E n, F)) )) Notare che l ultimo test ha in corrispondenza di E 3 un espressione F (fail "No match") mentre M(P, E 1, E 2, E 3 ) è definito per induzione sulla struttura del pattern P come mostrato in tabella 3. Estensione 4 (*) Nella codifica del costrutto di pattern match l espressione da esaminare (indicata con E 1 in tabella 3) viene valutata una volta per ogni pattern di tipo V o k o [], una o tre volte per ogni pattern di tipo P 1 ::P 2, e due volte per ogni pattern di tipo P 1,P 2. Migliorare la codifica in modo che E venga sempre valutata una volta sola per l intero costrutto. Estensione 5 (***) Arricchire la fase di analisi statica del compilatore in modo da determinare se un costrutto di pattern match non è esaustivo (cioè se non copre tutte le possibilità) e se vi sono dei pattern ridondanti (cioè se compaiono dei pattern già coperti da pattern che compaiono prima). In questi casi il compilatore deve emettere un messaggio di avvertimento. Estensione 6 (**) In alcuni casi l espansione del match genera molte copie dell espressione di fallimento E 3. Pensare ad una codifica alternativa che permette di evitare tale ridondanza. Suggerimento: l idea è di usare il costrutto let per definire la continuazione E 3 e al posto 4

5 Tabella 3: Espansione delle regole di pattern-matching. M(V, E 1, E 2, E 3 ) ((fun V -> E 2 ) E 1 ) M(, E 1, E 2, E 3 ) E 2 M(k, E 1, E 2, E 3 ) if (eq k E 1 ) then E 2 else E 3 M((), E 1, E 2, E 3 ) if (eq unit E 1 ) then E 2 else E 3 M([], E 1, E 2, E 3 ) if (eq nil E 1 ) then E 2 else E 3 M(P 1 ::P 2, E 1, E 2, E 3 ) if (eq nil E 1 ) then E 3 else M(P 1, (head E 1 ), M(P 2, (tail E 1 ), E 2, E 3 ), E 3 ) M(P 1,P 2, E 1, E 2, E 3 ) M(P 1, (first E 1 ), M(P 2, (second E 1 ), E 2, E 3 ), E 3 ) delle occorrenze di E 3 si sostituisce la chiamata alla continuazione. Per esempio, l espansione del pattern nel caso di una coppia diventerebbe M (P 1,P 2, E 1, E 2, E 3 ) let C = fun V -> E 3 in M(P 1,P 2, E 1, E 2, (C ())) in cui sia C che V sono identificatori fresh. In questo modo si duplica solo l invocazione della continuazione anziché l intera E 3 che, in generale, può essere molto grande. Un compilatore ottimizzante sarebbe poi in grado di semplificare ulterioremente le applicazioni (C ()), dal momento che il valore passato è () e che la variabile V non compare libera in E Esempio In questa sezione mostriamo un esempio di programma scritto nel linguaggio completo. Il programma definisce l algoritmo quicksort. let rec append l1 l2 = match l1 with [] -> l2 hd::tl -> hd::(append tl l2) ;; let filter f = let rec aux = function [] -> [] hd::tl -> if (f hd) then hd::(aux tl) else (aux tl) in aux ;; let rec quicksort = function [] -> [] hd::tl -> let l1 = (quicksort (filter ((>) hd) tl)) in let l2 = (quicksort (filter ((<=) hd) tl)) in (append l1 (append [hd] l2)) ;; 3 Tipi Presentiamo in questa sezione le regole di tipo dei costrutti del linguaggio minimale. Tali regole verranno usate per implementare l algoritmo di type-checking nella fase di analisi statica del compilatore. I tipi del linguaggio si distinguono in tipi semplici (unit, bool, int, string) e composti (list(t ), T 1 T 2, T 1 T 2 ). In quest ultimo caso list, e si dicono costruttori di tipo in quanto creano un tipo a partire da altri tipi. Possiamo pensare ai tipi semplici come a costruttori di tipo che non dipendono da altri tipi. Useremo lettere maiuscole per denotare tipi, e lettere greche minuscole per denotare variabili di tipo. Useremo la lettera per indicare un contesto, cioè un insieme di associazioni V : T dove V è il nome di una variabile e T è il tipo ad essa associata ed indicheremo con (V ) il tipo associato al simbolo V nel contesto. Il contesto iniziale 0 (tabella 4) contiene le dichiarazioni di tipo degli operatori predefiniti del linguaggio minimale nonché i tipi delle costanti. Si noti come molti operatori siano polimorfi, cioè in grado di operare su valori di qualsiasi tipo. Per esempio abbiamo che 0 (head) = α.list(α) α, ovvero head accetta come argomento una lista di valori di qualsiasi 5

6 Tabella 4: Costanti e operatori definiti nel contesto iniziale 0 del linguaggio minimale. S nil unit false, true n s first second head tail not to_string write fail fix pair cons concat add, sub, mul, div and, or eq, ne, lt, le 0 (S) α.list(α) unit bool int string α. β.α β α α. β.α β β α.list(α) α α.list(α) list(α) bool bool α.α string string unit α. β.α β α.(α α) α α. β.(α, β) α β α.(α, list(α)) list(α) (string, string) string (int, int) int (bool, bool) bool α.(α, α) bool tipo (α) e ritorna un valore di tipo α. Il quantificatore universale all inizio di ogni tipo polimorfo indica che per ogni occorrenza dell operatore si considera una nuova istanza del suo tipo, ovvero le variabili di tipo quantificate universalmente vengono sostituite da variabili fresh, che non compaiono altrove. Il tipo degli operatori binari è indicato come (T 1, T 3 ) T 3 in cui (T 1, T 3 ) sta a significare che l operatore accetta esattamente due argomenti. In particolare (T 1, T 3 ) e T 1 T 2 non sono lo stesso tipo. Il motivo di questa notazione per gli operatori binari diventerà chiaro nella sezione 4 in cui viene presentata la semantica operazionale degli operatori stessi. La tabella 5 mostra le regole di inferenza del linguaggio minimale. In questo senso ogni regola è da leggersi dall alto verso il basso: sopra la riga compaiono le premesse, sotto la riga la conclusione. Per esempio la regola [APP] E 1 : T 1 T 2 E 2 : T 1 (E 1 E 2 ) : T 2 stabilisce che se nel contesto l espressione E 1 ha tipo T 1 T 2 e, nello stesso contesto, l espressione E 2 ha tipo T 1, allora l espressione (E 1 E 2 ) ha tipo T 2. È chiaro che in molti casi il tipo della sorgente di E 1 ed il tipo di E 2 non coincideranno. Imporremo la loro uguaglianza unificandoli, con l algoritmo visto a lezione, e determinando quindi dei vincoli sulle variabili di tipo che compaiono in essi. Ad esempio, se sappiamo che il tipo di E 1 è α list(α) ed il tipo di E 2 è int unificheremo α con int ed il risultato sarà di tipo list(int). L unificazione fallisce in due casi: quando si tentano di unificare tipi incompatibili (es. int con bool oppure list(α) con α β); quando si tenta di unificare una variabile di tipo con un tipo che contiene quella variabile (es. α con α α). Le regole [CONST] e [VAR], che non hanno premesse, costituiscono gli assiomi del sistema di inferenza. Le regole [GEN] e [SPEC], che servono rispettivamente per quantificare le variabili generiche di un tipo e per istanziare un tipo, sono le uniche regole che possono essere applicate in posizioni arbitrarie di una derivazione, indipendentemente dalla forma dell espressione E considerata. Nell algoritmo di type-checking che presentiamo di seguito ammetteremo l impiego di queste due regole in posizioni ben precise. 3.1 Type checking In questa sezione presentiamo in modo informale l algoritmo di type-checking derivato dalle regole della tabella 5. L algoritmo deve calcolare il tipo di un espressione E in base alla struttura dell espressione stessa ed al contesto in cui E si trova. Il contesto determina il tipo di tutte le variabili libere che compaiono in E. Rispetto alla tabella 5 renderemo però espliciti i punti in cui intervengono le operazioni di generalizzazione [GEN] ed istanziazione [SPEC] dei tipi. Ad ogni passo dell algoritmo le informazioni da considerare sono: 1. l espressione di cui vogliamo calcolare il tipo; 2. il contesto che possiamo rappresentare con una lista di coppie nome, tipo in cui la prima occorrenza di una variabile V è l occorrenza visibile nello scope dell espressione considerata; 3. un contesto Γ analogo a ma che contiene solo la lista delle variabili legate da fun e 6

7 Tabella 5: Regole di type-checking per il linguaggio minimale. [CONST] k : (k) [VAR] V : (V ) [UNOP] unop : T 1 T 2 E : T 1 ( unop E) : T 2 [BINOP] binop : (T 1, T 2 ) T 3 E 1 : T 1 E 2 : T 2 ( binop E 1 E 2 ) : T 3 [FUN] + [V : T 1 ] E : T 2 fun V -> E : T 1 T 2 [IF] [APP] E 1 : bool E 2 : T E 3 : T if E 1 then E 2 else E 3 : T E 1 : T 1 T 2 E 2 : T 1 (E 1 E 2 ) : T 2 [GEN] [LET] [LETREC] E 1 : T 1 + [V : T 1 ] E 2 : T 2 let V = E 1 in E 2 : T 2 let V = (fix (fun V -> E 1 )) in E 2 : T let rec V = E 1 in E 1 : T E : T E : α.t (α non è libera in ) [SPEC] E : α.t E : T [β/α] che quindi determina l insieme variabili di tipo non generiche. Una variabile di tipo α è generica nel contesto Γ se α non compare in nessun tipo di alcuna variabile in Γ. Useremo le etichette che compaiono a sinistra delle regole nella tabella 5 come riferimento per la discussione dell algoritmo di type-checking. CONST Una costante k ha tipo 0 (k) come indicato in tabella 4. Notare che nel caso della costante nil il tipo sarà una istanza di α.list(α) ovvero sarà un tipo list(β) in cui β è una variabile di tipo fresh. VAR Il tipo di una variabile V deve essere reperito dal contesto ed istanziato. Più precisamente, siano α 1,..., α n le variabili di tipo che compaiono in (V ) e che sono generiche in Γ. Per ciascuna di esse si determina una istanza β 1,..., β n tale che ogni β i è fresh, ed il tipo di V risulta (V )[β 1 /α 1,, β n /α n ]. Le variabili di tipo non generiche che compaiono in (V ) non vengono istanziate. UNOP In un espressione ( unop E) il tipo di E deve essere unificato con il tipo dell argomento dell operatore unario (determinato dalla tabella 4). In caso l operatore sia polimorfo, il suo tipo deve essere istanziato prima dell unificazione. Il tipo dell intera espressione è il tipo del risultato dell operatore. BINOP In un espressione ( binop E 1 E 2 ) i tipi di E 1 ed E 2 devono essere unificati con i tipi dei due argomenti dell operatore binaro (determinati dalla tabella 4). In caso l operatore sia polimorfo, il suo tipo deve essere istanziato prima dell unificazione. Il tipo dell intera espressione è il tipo del risultato dell operatore. FUN Per calcolare il tipo di un espressione fun V -> E si introduce una variabile di tipo fresh, diciamo α, da associare a V. A questo punto si calcola il tipo T di E nei contesti + [V : α] e Γ + [V : α]. Il tipo dell intera espressione è α T. Si noti che nel calcolo del tipo di E la variabile di tipo α può venire unificata con un tipo più specifico. APP In un espressione (E 1 E 2 ) siano T 1 e T 2 i tipi di E 1 ed E 2 rispettivamente, e sia α una variabile di tipo fresh. Si unifica T 1 con il tipo T 2 α. Il tipo dell espressione è α. IF In un espressione if E 1 then E 2 else E 3 siano T 1, T 2 e T 3 i tipi di E 1, E 2 ed E 3 rispettivamente. Si unifica T 1 con bool e si uni- 7

8 fica T 2 con T 3. Il tipo dell espressione è T 2 (o equivalentemente T 3 ). LET In un espressione let V = E 1 in E 2 si determina innanzi tutto il tipo T 1 di E 1. Il tipo dell espressione è il tipo di E 2 nei contesti + [V : T 1 ] e Γ. Si noti che il contesto Γ rimane invariato: ciò significa che le variabili di tipo presenti in T 1 e che non sono presenti in Γ sono generiche in E 2. LETREC Il tipo di un espressione let rec V = fun V -> E 1 in E 2 viene determinato ottenendo il tipo dell espressione let V = (fix (fun V -> E 1 )) in E 2 che ne costituisce l espansione in cui viene utilizzato un ipotetico operatore di punto fisso fix il cui tipo è α.(α α) α. Si noti che questa espansione è valida solo ai fini del type-checking, mentre per la compilazione di una funzione ricorsiva si farà ricorso ad un operazione ad-hoc della macchina astratta (vedi sezione 5). Si noti inoltre che, per come è definita l espansione, il tipo di V non è polimorfo all interno di E 1, essendo V legata da un fun (vedi regola FUN). Esso può però diventare polimorfo (se contiene variabili di tipo non in Γ) in E 2. 4 La macchina SECD La tabella 6 definisce le istruzioni e la semantica della macchina astratta SECD che verrà usata per l esecuzione dei programmi compilati. 4.1 Valori La macchina astratta lavora con valori di cinque tipi: un valore booleano True o False. Il valore False oltre che rappresentare il valore booleano falso viene usato dal compilatore per rappresentare anche unit e nil. Il fatto che questi tre valori di tipo diverso siano indistinguibili per la macchina astratta non costituisce un problema se il programma compilato è ben tipato; un numero intero Int(n); una stringa di caratteri String(s); una coppia di valori (a, b). Le coppie vengono usate per codificare sia le coppie del linguaggio, ma anche le liste: una lista non vuota è composta da una sequenza di coppie in cui l ultima coppia ha come secondo valore False (la lista vuota). Ad esempio la lista [1 2 3] è rappresentata dal valore (Int(1), (Int(2), (Int(3), False))); una chiusura Closure(c, e). La chiusura rappresenta una funzione in attesa di essere valutata. La lista c è il codice della funzione, mentre la lista e è l ambiente che era attivo al momento di creazione della chiusura e che verrà ripristinato, previa aggiunta dell argomento passato alla funzione, al momento dell applicazione (istruzione APP). Estensione 7 (*) Estendere il livello del linguaggio completo, il livello del linguaggio minimale e la macchina SECD in modo da supportare i riferimenti (il tipo ref di OCaml). 4.2 Componenti Le quattro componenti fondamentali della macchina sono: Stack una pila di valori su cui vengono memorizzati i risultati della valutazione delle espressioni; Environment una lista di valori che rappresentano il valore delle variabili legate nello scope dell espressione che è in corso di valutazione. L accesso all ambiente lo si effettua con l istruzione LD(k) in cui k rappresenta l indice della variabile che si vuole accedere (1 rappresenta l indice della prima variabile, 2 l indice della seconda variabile e così via); Control la lista di istruzioni SECD in corso di esecuzione; Dump uno stack per memorizzare lo stato della macchina al momento dell invocazione di una funzione, in modo che l esecuzione possa riprendere dal punto di interruzione quando la funzione termina; Lo stato della macchina in un particolare istante è completamente descritto da una quadrupla (s, e, c, d). 8

9 4.3 Stato iniziale e terminazione Lo stato iniziale della macchina è costituito dalla quadrupla ([], [], c, []) in cui c è la lista di istruzioni da eseguire. La macchina termina in due casi: Fine calcolo: quando sia la lista di istruzioni da eseguire (componente Control) sia la lista nel Dump sono vuote; Eccezione: subito dopo l esecuzione di una istruzione FAIL o a causa di una divisione per zero. In questo caso la macchina termina con un errore e visualizza il valore in cima allo Stack. Il codice risultante da un programma ben tipato è corretto, nel senso che la macchina astratta non si troverà mai ad eseguire del codice in situazioni diverse da quelle presentate nella tabella 6. Ad esempio, non accadrà mai di eseguire l istruzione APP quando il valore in cima allo stack non è una chiusura. È però possibile che la macchina astratta sollevi un eccezione con l istruzione FAIL, ad esempio perché l insieme di pattern in un costrutto pattern match non è esaustivo. 4.4 Chiusure ricorsive Abbiamo visto che nel λ-calcolo il termine Y λf.((λx.(f (x x))) (λx.(f (x x)))) gode della proprietà (Y E) = (E (Y E)). Avendo a disposizione questo termine è possibile codificare una funzione ricorsiva. Per esempio indicando Y con fix potremmo espandere let rec fact = fun x -> if x = 0 then 1 else x * (fact (x - 1)) in let fact = (fix (fun f -> fun x -> if x = 0 then 1 else x * (f (x - 1)))) Tuttavia il termine Y non può essere usato se la strategia di riduzione è la call-by-value (che è proprio il caso del linguaggio che vogliamo compilare), e comunque la codifica risulterebbe particolarmente inefficiente. Per la macchina SECD ogni funzione diventa una chiusura Closure(c, e) ed e è l ambiente in cui compaiono i valori delle variabili libere riferite dal corpo della funzione. In particolare, se consideriamo l espressione (fix (fun f -> fun x -> if x = 0 then 1 else x * (f (x - 1)))) possiamo pensare che l operatore fix abbia l effetto di creare una chiusura circolare, cioè una chiusura per l espressione fun x -> if x = 0 then 1 else x * (f (x - 1)) in cui il primo valore nell ambiente, corrispondente al valore di f, è la chiusura stessa. In un equazione a = Closure(c, a :: e) In termini operazionali l effetto dell istruzione REC è quello di creare una struttura ciclica di questo tipo. 5 Il compilatore Indichiamo la funzione di compilazione con E l in cui E rappresenta l espressione da compilare e l la lista di variabili legate visibili in E. La funzione di compilazione restituisce una lista di istruzioni per la macchina SECD definita nella sezione 4. Useremo l per indicare la concatenazione di liste, l operatore :: per concatenare oggetti (valori o variabili) a liste (di valori o di variabili, rispettivamente) e [] per indicare la lista vuota. La funzione di compilazione è definita per induzione sulla struttura della espressione da compilare (tabella 7). Notare che il costrutto let rec può essere usato solo per definire funzioni ricorsive. Ogni tentativo di usare il costrutto per definire ricorsivamente ogni altro tipo di valore deve essere segnalato dal compilatore con un errore. La funzione fetch(v, l) ritorna la posizione della variabile V nella lista l, con base 1. Esempio. Il codice della funzione fattoriale ricorsiva è mostrato qui sotto. La sintassi usata è 9

10 Tabella 6: La macchina astratta. Stack Environment Control Dump s e LDC(C) :: c d C :: s e c d s a 1 ::... :: a k :: e LD(k) :: c d a k :: s a 1 ::... :: a k :: e c d s e FUN(c ) :: c d Closure(c, e) :: s e c d Closure(c, e ) :: s e REC :: c d (a = Closure(c, a :: e)) :: s e c d Closure(c, e ) :: a :: s e APP :: c d [] a :: e c (s, e, c) :: d a :: s e [] (s, e, c ) :: d a :: s e c d a :: [] e [] [] L esecuzione termina normalmente e viene stampato il valore a a :: s e FAIL :: c d L esecuzione termina con un errore e viene stampato il valore a b :: a :: s e PAIR :: c d (a, b) :: s e c d (a, b) :: s e FST :: c d a :: s e c d (a, b) :: s e SND :: c d b :: s e c d b 2 :: b 1 :: s e AND :: c d (b 1 and b 2 ) :: s e c d b 2 :: b 1 :: s e OR :: c d (b 1 or b 2 ) :: s e c d b :: s e NOT :: c d (not b) :: s e c d True :: s e SEL(c 1, c 2 ) :: c d [] e c 1 (s, e, c) :: d False :: s e SEL(c 1, c 2 ) :: c d [] e c 2 (s, e, c) :: d Int(n 2 ) :: Int(n 1 ) :: s e ADD :: c d Int(n 1 + n 2 ) :: s e c d Int(n 2 ) :: Int(n 1 ) :: s e SUB :: c d Int(n 1 n 2 ) :: s e c d Int(n 2 ) :: Int(n 1 ) :: s e MUL :: c d Int(n 1 n 2 ) :: s e c d Int(n 2 ) :: Int(n 1 ) :: s e DIV :: c d Int(n 1 /n 2 ) :: s e c d b :: a :: s e LE :: c d (a b) :: s e c d b :: a :: s e LT :: c d (a < b) :: s e c d b :: a :: s e EQ :: c d (a = b) :: s e c d b :: a :: s e NE :: c d (a b) :: s e c d String(b) :: String(a) :: s e CAT :: c d String(ab) :: s e c d a :: s e STR :: c d String(a) :: s e c d String(a) :: s e WRT :: c d False :: s e c d 10

11 Tabella 7: Specifica del compilatore. k l = LDC(k) :: [] V l = LD(fetch(V, l)) :: [] ( unop E) l = E unop ] ( binop E 1 E 2 ) l = E 1 E 2 binop ] fun V -> E l = FUN( E V ::l ) :: [] (E 1 E 2 ) l = E 2 E 1 let V = E 1 in E 2 l = ((fun V -> E 2 ) E 1 ) l = E 1 E 2 V ::l )]@[APP] let rec V = fun V -> E 1 in E 2 l = FUN( E 1 V ::V ::l) :: REC :: FUN( E 2 V ::l ) :: APP :: [] if E 1 then E 2 else E 3 l = E 1 E 2 l, E 3 l )] quella del linguaggio minimale per rendere evidente la corrispondenza con il codice prodotto dal compilatore: [6] L. Cardelli, Compiling a Functional Language, in LISP and Functional Programming, pages , 1984 let rec fact = fun x -> if (eq x 0) then 1 else (mul x (fact (sub x 1))) in (fact 3) ;; Questa espressione viene compilata in una lista c di istruzioni SECD come segue: c = FUN(l 1 ) :: REC :: FUN(l 2 ) :: APP :: [] l 1 = LD(1) :: LDC(0) :: EQ :: SEL(l 3, l 4 ) :: [] l 2 = LDC(3) :: LD(1) :: APP :: [] l 3 = LDC(1) :: [] l 4 = LD(1) :: LD(1) :: LDC(1) :: SUB :: LD(2) :: APP :: MUL :: [] Riferimenti bibliografici [1] The Caml language, [2] X. Leroy et. al., The Objective Caml system: Documentation and user s manual, man/index.html [3] A. V. Aho, R. Sethi, J. D. Ullman, Compilers: Principles, Techniques, and Tools, Addison-Wesley, [4] C. Reade, Elements of Functional Programming, Addison-Wesley, [5] L. Cardelli, Basic Polymorphic Typechecking, Science of Computer Programming 8/2, April

Permutazione degli elementi di una lista

Permutazione degli elementi di una lista Permutazione degli elementi di una lista Luca Padovani padovani@sti.uniurb.it Sommario Prendiamo spunto da un esercizio non banale per fare alcune riflessioni su un approccio strutturato alla risoluzione

Dettagli

Elementi di semantica operazionale

Elementi di semantica operazionale Elementi di semantica operazionale 1 Contenuti sintassi astratta e domini sintattici un frammento di linguaggio imperativo semantica operazionale domini semantici: valori e stato relazioni di transizione

Dettagli

Introduzione alla programmazione in C

Introduzione alla programmazione in C Introduzione alla programmazione in C Testi Consigliati: A. Kelley & I. Pohl C didattica e programmazione B.W. Kernighan & D. M. Ritchie Linguaggio C P. Tosoratti Introduzione all informatica Materiale

Dettagli

Definizione di nuovi tipi

Definizione di nuovi tipi Definizione di nuovi tipi Un tipo è un insieme di valori. Per definire un nuovo tipo occorre specificare: 1 un nome per il tipo 2 come costruire i valori del tipo, cioè quali sono i costruttori del tipo.

Dettagli

4 3 4 = 4 x 10 2 + 3 x 10 1 + 4 x 10 0 aaa 10 2 10 1 10 0

4 3 4 = 4 x 10 2 + 3 x 10 1 + 4 x 10 0 aaa 10 2 10 1 10 0 Rappresentazione dei numeri I numeri che siamo abituati ad utilizzare sono espressi utilizzando il sistema di numerazione decimale, che si chiama così perché utilizza 0 cifre (0,,2,3,4,5,6,7,8,9). Si dice

Dettagli

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto: Tipi primitivi Il linguaggio Java offre alcuni tipi di dato primitivi Una variabile di tipo primitivo può essere utilizzata direttamente. Non è un riferimento e non ha senso tentare di istanziarla mediante

Dettagli

Elementi di semantica denotazionale ed operazionale

Elementi di semantica denotazionale ed operazionale Elementi di semantica denotazionale ed operazionale 1 Contenuti! sintassi astratta e domini sintattici " un frammento di linguaggio imperativo! semantica denotazionale " domini semantici: valori e stato

Dettagli

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi.

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi. Algoritmi 1 Sommario Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi. 2 Informatica Nome Informatica=informazione+automatica. Definizione Scienza che si occupa dell

Dettagli

ISTITUTO TECNICO INDUSTRIALE STATALE LA GESTIONE DEI FILE DI TESTO IN C++

ISTITUTO TECNICO INDUSTRIALE STATALE LA GESTIONE DEI FILE DI TESTO IN C++ ISTITUTO TECNICO INDUSTRIALE STATALE G A L I L E O F E R R A R I S DIISPENSA DII IINFORMATIICA E SIISTEMII AUTOMATIICII LA GESTIONE DEI FILE DI TESTO IN C++ Le classi per la gestione dei file. Il C++ è

Dettagli

Appunti sulla Macchina di Turing. Macchina di Turing

Appunti sulla Macchina di Turing. Macchina di Turing Macchina di Turing Una macchina di Turing è costituita dai seguenti elementi (vedi fig. 1): a) una unità di memoria, detta memoria esterna, consistente in un nastro illimitato in entrambi i sensi e suddiviso

Dettagli

Funzioni in C. Violetta Lonati

Funzioni in C. Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Funzioni - in breve: Funzioni Definizione di funzioni

Dettagli

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA LINGUAGGI DI ALTO LIVELLO Si basano su una macchina virtuale le cui mosse non sono quelle della macchina hardware COS È UN LINGUAGGIO? Un linguaggio è un insieme di parole e di metodi di combinazione delle

Dettagli

Programmazione funzionale

Programmazione funzionale Cognome Nome Matricola Programmazione funzionale 12-09-2014 PROVA SCRITTA 1 2 3 4 5 Somma Il compito ha la durata di 1 ora, per la compilazione attenersi alle seguenti istruzioni: Scrivere in maniera chiara.

Dettagli

Lezione 8. La macchina universale

Lezione 8. La macchina universale Lezione 8 Algoritmi La macchina universale Un elaboratore o computer è una macchina digitale, elettronica, automatica capace di effettuare trasformazioni o elaborazioni su i dati digitale= l informazione

Dettagli

Uso di base delle funzioni in Microsoft Excel

Uso di base delle funzioni in Microsoft Excel Uso di base delle funzioni in Microsoft Excel Le funzioni Una funzione è un operatore che applicato a uno o più argomenti (valori, siano essi numeri con virgola, numeri interi, stringhe di caratteri) restituisce

Dettagli

SECD: esempio di compilazione ed esecuzione

SECD: esempio di compilazione ed esecuzione SECD: esempio di compilazione ed esecuzione Si consideri il λ-termine 2 { }} { (λf. (f 7) } {{ } 3 ((λx.λy.x + y) 5) ) } {{ } 1 dove sono evidenziati i tre redex nell ordine in cui vengono ridotti. Il

Dettagli

STRINGHE di un ALFABETO. Consideriamo un alfabeto di simboli V V è un insieme finito e non vuoto. Alfabeto della lingua inglese I={a,b,c,..

STRINGHE di un ALFABETO. Consideriamo un alfabeto di simboli V V è un insieme finito e non vuoto. Alfabeto della lingua inglese I={a,b,c,.. STRINGHE di un ALFABETO Consideriamo un alfabeto di simboli V V è un insieme finito e non vuoto Alfabeto binario A={0,1} Alfabeto della lingua inglese I={a,b,c,..z} Stringhe o parole Gli elementi di V

Dettagli

Operatori logici e porte logiche

Operatori logici e porte logiche Operatori logici e porte logiche Operatori unari.......................................... 730 Connettivo AND........................................ 730 Connettivo OR..........................................

Dettagli

Lezioni di Matematica 1 - I modulo

Lezioni di Matematica 1 - I modulo Lezioni di Matematica 1 - I modulo Luciano Battaia 16 ottobre 2008 Luciano Battaia - http://www.batmath.it Matematica 1 - I modulo. Lezione del 16/10/2008 1 / 13 L introduzione dei numeri reali si può

Dettagli

Soluzione dell esercizio del 2 Febbraio 2004

Soluzione dell esercizio del 2 Febbraio 2004 Soluzione dell esercizio del 2 Febbraio 2004 1. Casi d uso I casi d uso sono riportati in Figura 1. Figura 1: Diagramma dei casi d uso. E evidenziato un sotto caso di uso. 2. Modello concettuale Osserviamo

Dettagli

ALGEBRA DELLE PROPOSIZIONI

ALGEBRA DELLE PROPOSIZIONI Università di Salerno Fondamenti di Informatica Corso di Laurea Ingegneria Corso B Docente: Ing. Giovanni Secondulfo Anno Accademico 2010-2011 ALGEBRA DELLE PROPOSIZIONI Fondamenti di Informatica Algebra

Dettagli

Introduzione al MATLAB c Parte 2

Introduzione al MATLAB c Parte 2 Introduzione al MATLAB c Parte 2 Lucia Gastaldi Dipartimento di Matematica, http://dm.ing.unibs.it/gastaldi/ 18 gennaio 2008 Outline 1 M-file di tipo Script e Function Script Function 2 Costrutti di programmazione

Dettagli

Introduzione a Dev-C++

Introduzione a Dev-C++ Introduzione a Dev-C++ Università degli Studi di Brescia Docente: Massimiliano Giacomin Elementi di Informatica e Programmazione Università di Brescia 1 Note: Dev-C++ richiede Windows 95/98/NT/2000/XP

Dettagli

Variabili e tipi di dato

Variabili e tipi di dato Variabili e tipi di dato Tutte le variabili devono essere dichiarate, specificandone il tipo La dichiarazione deve precedere l uso Il tipo è un concetto astratto che esprime: L allocazione di spazio per

Dettagli

Tipi di Dato Ricorsivi

Tipi di Dato Ricorsivi Tipi di Dato Ricorsivi Luca Abeni September 2, 2015 1 Tipi di Dato Vari linguaggi di programmazione permettono all utente di definire nuovi tipi di dato definendo per ogni nuovo tipo l insieme dei suoi

Dettagli

x u v(p(x, fx) q(u, v)), e poi

x u v(p(x, fx) q(u, v)), e poi 0.1. Skolemizzazione. Ogni enunciato F (o insieme di enunciati Γ) è equisoddisfacibile ad un enunciato universale (o insieme di enunciati universali) in un linguaggio estensione del linguaggio di F (di

Dettagli

Programmazione I - Laboratorio

Programmazione I - Laboratorio Programmazione I - Laboratorio Esercitazione 2 - Funzioni Gianluca Mezzetti 1 Paolo Milazzo 2 1. Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ mezzetti mezzetti di.unipi.it 2.

Dettagli

APPUNTI SUL LINGUAGGIO DI PROGRAMMAZIONE PASCAL

APPUNTI SUL LINGUAGGIO DI PROGRAMMAZIONE PASCAL APPUNTI SUL LINGUAGGIO DI PROGRAMMAZIONE PASCAL In informatica il Pascal è un linguaggio di programmazione creato da Niklaus Wirth ed é un linguaggio di programmazione strutturata. I linguaggi di programmazione

Dettagli

Algoritmi e strutture dati. Codici di Huffman

Algoritmi e strutture dati. Codici di Huffman Algoritmi e strutture dati Codici di Huffman Memorizzazione dei dati Quando un file viene memorizzato, esso va memorizzato in qualche formato binario Modo più semplice: memorizzare il codice ASCII per

Dettagli

Comparatori. Comparatori di uguaglianza

Comparatori. Comparatori di uguaglianza Comparatori Scopo di un circuito comparatore é il confronto tra due codifiche binarie. Il confronto può essere effettuato per verificare l'uguaglianza oppure una relazione d'ordine del tipo "maggiore",

Dettagli

Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione

Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione Automatizzare i compiti ripetitivi I file batch Anno accademico 2000-01 1 Spesso capita di dover eseguire ripetutatmente una data sequenza di comandi Introdurli uno a uno da tastiera è un processo lento

Dettagli

Corso di Informatica

Corso di Informatica Corso di Informatica Modulo T3 1-Sottoprogrammi 1 Prerequisiti Tecnica top-down Programmazione elementare 2 1 Introduzione Lo scopo di questa Unità è utilizzare la metodologia di progettazione top-down

Dettagli

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE SOMMARIO Coda (queue): Specifica: interfaccia. Implementazione: Strutture indicizzate (array): Array di dimensione variabile. Array circolari. Strutture collegate (nodi). Prestazioni. Strutture Software

Dettagli

Codifica: dal diagramma a blocchi al linguaggio C++

Codifica: dal diagramma a blocchi al linguaggio C++ Codifica: dal diagramma a blocchi al linguaggio C++ E necessario chiarire inizialmente alcuni concetti. La compilazione Il dispositivo del computer addetto all esecuzione dei programmi è la CPU La CPU

Dettagli

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012 Fondamenti di informatica Oggetti e Java ottobre 2012 1 JUnit JUnit è uno strumento per assistere il programmatore Java nel testing JUnit consente di scrivere test di oggetti e classi Java i test sono

Dettagli

Metodologie di programmazione in Fortran 90

Metodologie di programmazione in Fortran 90 Metodologie di programmazione in Fortran 90 Ing. Luca De Santis DIS - Dipartimento di informatica e sistemistica Anno accademico 2007/2008 Fortran 90: Metodologie di programmazione DIS - Dipartimento di

Dettagli

(anno accademico 2008-09)

(anno accademico 2008-09) Calcolo relazionale Prof Alberto Belussi Prof. Alberto Belussi (anno accademico 2008-09) Calcolo relazionale E un linguaggio di interrogazione o e dichiarativo: at specifica le proprietà del risultato

Dettagli

Algebra Booleana ed Espressioni Booleane

Algebra Booleana ed Espressioni Booleane Algebra Booleana ed Espressioni Booleane Che cosa è un Algebra? Dato un insieme E di elementi (qualsiasi, non necessariamente numerico) ed una o più operazioni definite sugli elementi appartenenti a tale

Dettagli

I sistemi di numerazione

I sistemi di numerazione I sistemi di numerazione 01-INFORMAZIONE E SUA RAPPRESENTAZIONE Sia dato un insieme finito di caratteri distinti, che chiameremo alfabeto. Utilizzando anche ripetutamente caratteri di un alfabeto, si possono

Dettagli

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo.

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo. DALLE PESATE ALL ARITMETICA FINITA IN BASE 2 Si è trovato, partendo da un problema concreto, che con la base 2, utilizzando alcune potenze della base, operando con solo addizioni, posso ottenere tutti

Dettagli

Analizzatore lessicale o scanner

Analizzatore lessicale o scanner Analizzatore lessicale o scanner Lo scanner rappresenta un'interfaccia fra il programma sorgente e l'analizzatore sintattico o parser. Lo scanner, attraverso un esame carattere per carattere dell'ingresso,

Dettagli

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti Nascita di Java L uscita di Java, verso la metà degli anni novanta, fu accolta con molto entusiasmo dalla comunità dei programmatori e dei provider di servizi internet perché permetteva agli utenti del

Dettagli

Correttezza. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 10. A. Miola Novembre 2007

Correttezza. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 10. A. Miola Novembre 2007 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1 Dispensa 10 Correttezza A. Miola Novembre 2007 http://www.dia.uniroma3.it/~java/fondinf1/ Correttezza 1 Contenuti Introduzione alla correttezza

Dettagli

GESTIONE INFORMATICA DEI DATI AZIENDALI

GESTIONE INFORMATICA DEI DATI AZIENDALI GESTIONE INFORMATICA DEI DATI AZIENDALI Alberto ZANONI Centro Vito Volterra Università Tor Vergata Via Columbia 2, 00133 Roma, Italy zanoni@volterra.uniroma2.it Rudimenti di programmazione Programming

Dettagli

Realizzazione di una classe con un associazione

Realizzazione di una classe con un associazione Realizzazione di una classe con un associazione Nel realizzare una classe che è coinvolta in un associazione, ci dobbiamo chiedere se la classe ha responsabilità sull associazione. Diciamo che una classe

Dettagli

APPUNTI DI MATEMATICA ALGEBRA \ INSIEMISTICA \ TEORIA DEGLI INSIEMI (1)

APPUNTI DI MATEMATICA ALGEBRA \ INSIEMISTICA \ TEORIA DEGLI INSIEMI (1) ALGEBRA \ INSIEMISTICA \ TEORIA DEGLI INSIEMI (1) Un insieme è una collezione di oggetti. Il concetto di insieme è un concetto primitivo. Deve esistere un criterio chiaro, preciso, non ambiguo, inequivocabile,

Dettagli

Laboratorio di Informatica

Laboratorio di Informatica Laboratorio di Informatica Introduzione a Python Dottore Paolo Parisen Toldin - parisent@cs.unibo.it Argomenti trattati Che cosa è python Variabili Assegnazione Condizionale Iterazione in una lista di

Dettagli

Descrizione di un algoritmo

Descrizione di un algoritmo Descrizione di un algoritmo Un algoritmo descrive due tipi fondamentali di oper: calcoli ottenibili tramite le oper primitive su tipi di dato (valutazione di espressioni) che consistono nella modifica

Dettagli

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti Capitolo 3 L applicazione Java Diagrammi ER Dopo le fasi di analisi, progettazione ed implementazione il software è stato compilato ed ora è pronto all uso; in questo capitolo mostreremo passo passo tutta

Dettagli

DEFINIZIONE DI NUOVI TIPI Un tipo è un insieme di valori.

DEFINIZIONE DI NUOVI TIPI Un tipo è un insieme di valori. 1 DEFINIZIONE DI NUOVI TIPI Un tipo è un insieme di valori. Per definire un nuovo tipo occorre specificare: 1. un nome per il tipo 2. come costruire i valori del tipo, cioè quali sono i costruttori del

Dettagli

AXO Architettura dei Calcolatori e Sistema Operativo. processo di assemblaggio

AXO Architettura dei Calcolatori e Sistema Operativo. processo di assemblaggio AXO Architettura dei Calcolatori e Sistema Operativo processo di assemblaggio linguaggio assembly è il linguaggio simbolico che consente di programmare un calcolatore utilizzando le istruzioni del linguaggio

Dettagli

Strutturazione logica dei dati: i file

Strutturazione logica dei dati: i file Strutturazione logica dei dati: i file Informazioni più complesse possono essere composte a partire da informazioni elementari Esempio di una banca: supponiamo di voler mantenere all'interno di un computer

Dettagli

Abstract Data Type (ADT)

Abstract Data Type (ADT) Abstract Data Type Pag. 1/10 Abstract Data Type (ADT) Iniziamo la nostra trattazione presentando una nozione che ci accompagnerà lungo l intero corso di Laboratorio Algoritmi e Strutture Dati: il Tipo

Dettagli

Ricorsione. (da lucidi di Marco Benedetti)

Ricorsione. (da lucidi di Marco Benedetti) Ricorsione (da lucidi di Marco Benedetti) Funzioni ricorsive Dal punto di vista sintattico, siamo in presenza di una funzione ricorsiva quando all interno della definizione di una funzione compaiono una

Dettagli

EVOLUZIONE DEI LINGUAGGI DI ALTO LIVELLO

EVOLUZIONE DEI LINGUAGGI DI ALTO LIVELLO EVOLUZIONE DEI LINGUAGGI DI ALTO LIVELLO Linguaggi di programmazione classificati in base alle loro caratteristiche fondamentali. Linguaggio macchina, binario e fortemente legato all architettura. Linguaggi

Dettagli

2) Codici univocamente decifrabili e codici a prefisso.

2) Codici univocamente decifrabili e codici a prefisso. Argomenti della Lezione ) Codici di sorgente 2) Codici univocamente decifrabili e codici a prefisso. 3) Disuguaglianza di Kraft 4) Primo Teorema di Shannon 5) Codifica di Huffman Codifica di sorgente Il

Dettagli

Elementi di Algebra Relazionale

Elementi di Algebra Relazionale Note dalle lezioni di INFORMATICA (per gli allievi della classe quinta - indirizzo MERCURIO) Elementi di Algebra Relazionale prof. Stefano D.L.Campanozzi I.T.C. Giulio Cesare Bari - a.s. 2008-2009 1 Introduzione

Dettagli

LABORATORIO DI PROGRAMMAZIONE 2012 2013 EDIZIONE 1, TURNO B

LABORATORIO DI PROGRAMMAZIONE 2012 2013 EDIZIONE 1, TURNO B LABORATORIO DI PROGRAMMAZIONE 2012 2013 EDIZIONE 1, TURNO B 23.XI.2012 VINCENZO MARRA Indice Esercizio 1 1 Menu 1 Tempo: 35 min. 2 Commento 1 2 Esercizio 2 2 Ordinamento e ricerca binaria con la classe

Dettagli

AA 2006-07 LA RICORSIONE

AA 2006-07 LA RICORSIONE PROGRAMMAZIONE AA 2006-07 LA RICORSIONE AA 2006-07 Prof.ssa A. Lanza - DIB 1/18 LA RICORSIONE Il concetto di ricorsione nasce dalla matematica Una funzione matematica è definita ricorsivamente quando nella

Dettagli

LINGUAGGI DI PROGRAMMAZIONE

LINGUAGGI DI PROGRAMMAZIONE LINGUAGGI DI PROGRAMMAZIONE Il potere espressivo di un linguaggio è caratterizzato da: quali tipi di dati consente di rappresentare (direttamente o tramite definizione dell utente) quali istruzioni di

Dettagli

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Dispensa E08 Soluzione Esercizi F. Gasparetti, C. Limongelli Marzo 2008 http://www.dia.uniroma3.it/~java/fondinf1/ Soluzione Esercizi

Dettagli

1. PRIME PROPRIETÀ 2

1. PRIME PROPRIETÀ 2 RELAZIONI 1. Prime proprietà Il significato comune del concetto di relazione è facilmente intuibile: due elementi sono in relazione se c è un legame tra loro descritto da una certa proprietà; ad esempio,

Dettagli

Fondamenti dell Informatica Ricorsione e Iterazione Simona Ronchi Della Rocca (dal testo: Kfoury, Moll and Arbib, cap.5.2)

Fondamenti dell Informatica Ricorsione e Iterazione Simona Ronchi Della Rocca (dal testo: Kfoury, Moll and Arbib, cap.5.2) Fondamenti dell Informatica Ricorsione e Iterazione Simona Ronchi Della Rocca (dal testo: Kfoury, Moll and Arbib, cap.5.2) Definiamo innanzitutto una relazione d ordine tra le funzioni. Siano φ e ψ funzioni

Dettagli

Linguaggi di programmazione

Linguaggi di programmazione Linguaggi di programmazione Un calcolatore basato sul modello di von Neumann permette l esecuzione di un programma, cioè di una sequenza di istruzioni descritte nel linguaggio interpretabile dal calcolatore

Dettagli

Java: Compilatore e Interprete

Java: Compilatore e Interprete Java: Compilatore e Interprete Java Virtual Machine Il bytecode non è Linguaggio Macchina. Per diventarlo, deve subire un ulteriore trasformazione che viene operata dall interprete Java in modalità JIT

Dettagli

Linguaggio C. Fondamenti. Struttura di un programma.

Linguaggio C. Fondamenti. Struttura di un programma. Linguaggio C Fondamenti. Struttura di un programma. 1 La storia del Linguaggio C La nascita del linguaggio C fu dovuta all esigenza di disporre di un Linguaggio ad alto livello adatto alla realizzazione

Dettagli

Fondamenti dei linguaggi di programmazione

Fondamenti dei linguaggi di programmazione Fondamenti dei linguaggi di programmazione Aniello Murano Università degli Studi di Napoli Federico II 1 Riassunto delle lezioni precedenti Prima Lezione: Introduzione e motivazioni del corso; Sintassi

Dettagli

LE SUCCESSIONI 1. COS E UNA SUCCESSIONE

LE SUCCESSIONI 1. COS E UNA SUCCESSIONE LE SUCCESSIONI 1. COS E UNA SUCCESSIONE La sequenza costituisce un esempio di SUCCESSIONE. Ecco un altro esempio di successione: Una successione è dunque una sequenza infinita di numeri reali (ma potrebbe

Dettagli

INFORMATICA GENERALE Prof. Alberto Postiglione Dipartimento Scienze della Comunicazione Università degli Studi di Salerno

INFORMATICA GENERALE Prof. Alberto Postiglione Dipartimento Scienze della Comunicazione Università degli Studi di Salerno INFORMATICA GENERALE Prof. Alberto Postiglione Dipartimento Scienze della Comunicazione Università degli Studi di Salerno UD 3.1b: Costrutti di un Algoritmo Dispense 1.2 I Costrutti di base 13 apr 2010

Dettagli

Corrispondenze e funzioni

Corrispondenze e funzioni Corrispondenze e funzioni L attività fondamentale della mente umana consiste nello stabilire corrispondenze e relazioni tra oggetti; è anche per questo motivo che il concetto di corrispondenza è uno dei

Dettagli

. A primi passi con microsoft a.ccepss SommarIo: i S 1. aprire e chiudere microsoft access Start (o avvio) l i b tutti i pro- grammi

. A primi passi con microsoft a.ccepss SommarIo: i S 1. aprire e chiudere microsoft access Start (o avvio) l i b tutti i pro- grammi Capitolo Terzo Primi passi con Microsoft Access Sommario: 1. Aprire e chiudere Microsoft Access. - 2. Aprire un database esistente. - 3. La barra multifunzione di Microsoft Access 2007. - 4. Creare e salvare

Dettagli

Matematica generale CTF

Matematica generale CTF Successioni numeriche 19 agosto 2015 Definizione di successione Monotonìa e limitatezza Forme indeterminate Successioni infinitesime Comportamento asintotico Criterio del rapporto per le successioni Definizione

Dettagli

Informatica 3. LEZIONE 7: Fondamenti di programmazione orientata agli oggetti (1)

Informatica 3. LEZIONE 7: Fondamenti di programmazione orientata agli oggetti (1) Informatica 3 LEZIONE 7: Fondamenti di programmazione orientata agli oggetti (1) Modulo 1: Introduzione: oggetti e classi Modulo 2: Link e associazioni Modulo 3: Aggregazione Informatica 3 Lezione 7 -

Dettagli

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP) 12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP) Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica,

Dettagli

Risolvere un problema significa individuare un procedimento che permetta di arrivare al risultato partendo dai dati

Risolvere un problema significa individuare un procedimento che permetta di arrivare al risultato partendo dai dati Algoritmi Algoritmi Risolvere un problema significa individuare un procedimento che permetta di arrivare al risultato partendo dai dati Il procedimento (chiamato algoritmo) è composto da passi elementari

Dettagli

E naturale chiedersi alcune cose sulla media campionaria x n

E naturale chiedersi alcune cose sulla media campionaria x n Supponiamo che un fabbricante stia introducendo un nuovo tipo di batteria per un automobile elettrica. La durata osservata x i delle i-esima batteria è la realizzazione (valore assunto) di una variabile

Dettagli

Introduzione ai tipi di dato astratti: applicazione alle liste

Introduzione ai tipi di dato astratti: applicazione alle liste Universitàdegli Studi di L Aquila Facoltàdi Scienze M.F.N. Corso di Laurea in Informatica Corso di Laboratorio di Algoritmi e Strutture Dati A.A. 2005/2006 Introduzione ai tipi di dato astratti: applicazione

Dettagli

Rappresentazione dei numeri in un calcolatore

Rappresentazione dei numeri in un calcolatore Corso di Calcolatori Elettronici I A.A. 2010-2011 Rappresentazione dei numeri in un calcolatore Lezione 2 Università degli Studi di Napoli Federico II Facoltà di Ingegneria Rappresentazione dei numeri

Dettagli

Prova di Laboratorio di Programmazione

Prova di Laboratorio di Programmazione Prova di Laboratorio di Programmazione 6 febbraio 015 ATTENZIONE: Non è possibile usare le classi del package prog.io del libro di testo. Oltre ai metodi richiesti in ciascuna classe, è opportuno implementare

Dettagli

Prestazioni CPU Corso di Calcolatori Elettronici A 2007/2008 Sito Web:http://prometeo.ing.unibs.it/quarella Prof. G. Quarella prof@quarella.

Prestazioni CPU Corso di Calcolatori Elettronici A 2007/2008 Sito Web:http://prometeo.ing.unibs.it/quarella Prof. G. Quarella prof@quarella. Prestazioni CPU Corso di Calcolatori Elettronici A 2007/2008 Sito Web:http://prometeo.ing.unibs.it/quarella Prof. G. Quarella prof@quarella.net Prestazioni Si valutano in maniera diversa a seconda dell

Dettagli

Fondamenti di Informatica PROBLEMI E ALGORITMI. Fondamenti di Informatica - D. Talia - UNICAL 1

Fondamenti di Informatica PROBLEMI E ALGORITMI. Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica PROBLEMI E ALGORITMI Fondamenti di Informatica - D. Talia - UNICAL 1 Specifica di un algoritmo Primo approccio, scrittura diretta del programma: la soluzione coincide con la codifica

Dettagli

Calcolatori: Algebra Booleana e Reti Logiche

Calcolatori: Algebra Booleana e Reti Logiche Calcolatori: Algebra Booleana e Reti Logiche 1 Algebra Booleana e Variabili Logiche I fondamenti dell Algebra Booleana (o Algebra di Boole) furono delineati dal matematico George Boole, in un lavoro pubblicato

Dettagli

Introduzione agli Abstract Data Type (ADT)

Introduzione agli Abstract Data Type (ADT) Introduzione agli Abstract Data Type (ADT) La nozione di tipo di dato astratto Sappiamo già che quando si affrontano problemi complessi è necessario procedere in due fasi: Specifica dell algoritmo Implementazione

Dettagli

1. Le macro in Access 2000/2003

1. Le macro in Access 2000/2003 LIBRERIA WEB 1. Le macro in Access 2000/2003 Per creare una macro, si deve aprire l elenco delle macro dalla finestra principale del database: facendo clic su Nuovo, si presenta la griglia che permette

Dettagli

Alcune nozioni di base di Logica Matematica

Alcune nozioni di base di Logica Matematica Alcune nozioni di base di Logica Matematica Ad uso del corsi di Programmazione I e II Nicola Galesi Dipartimento di Informatica Sapienza Universitá Roma November 1, 2007 Questa é una breve raccolta di

Dettagli

Progetto di simulazione molecolare per il corso di Complementi di algoritmi A.A. 2005-06

Progetto di simulazione molecolare per il corso di Complementi di algoritmi A.A. 2005-06 Progetto di simulazione molecolare per il corso di Complementi di algoritmi A.A. 2005-06 13 febbraio 2006 1 Descrizione Il progetto si compone delle seguenti fasi: 1. caricamento di soluzioni in formato

Dettagli

Capitolo 2. Operazione di limite

Capitolo 2. Operazione di limite Capitolo 2 Operazione di ite In questo capitolo vogliamo occuparci dell operazione di ite, strumento indispensabile per scoprire molte proprietà delle funzioni. D ora in avanti riguarderemo i domini A

Dettagli

Guida all uso di Java Diagrammi ER

Guida all uso di Java Diagrammi ER Guida all uso di Java Diagrammi ER Ver. 1.1 Alessandro Ballini 16/5/2004 Questa guida ha lo scopo di mostrare gli aspetti fondamentali dell utilizzo dell applicazione Java Diagrammi ER. Inizieremo con

Dettagli

Semantica operazionale dei linguaggi di Programmazione

Semantica operazionale dei linguaggi di Programmazione Semantica operazionale dei linguaggi di Programmazione Oggetti sintattici e oggetti semantici Rosario Culmone, Luca Tesei Lucidi tratti dalla dispensa Elementi di Semantica Operazionale R. Barbuti, P.

Dettagli

Corso di Informatica

Corso di Informatica Corso di Informatica Modulo T2 3-Compilatori e interpreti 1 Prerequisiti Principi di programmazione Utilizzo di un compilatore 2 1 Introduzione Una volta progettato un algoritmo codificato in un linguaggio

Dettagli

L espressione torna invece sempre vera (quindi la soluzione originale) se cambiamo contemporaneamente il verso: 1 < 0.

L espressione torna invece sempre vera (quindi la soluzione originale) se cambiamo contemporaneamente il verso: 1 < 0. EQUAZIONI E DISEQUAZIONI Le uguaglianze fra espressioni numeriche si chiamano equazioni. Cercare le soluzioni dell equazione vuol dire cercare quelle combinazioni delle lettere che vi compaiono che la

Dettagli

Lezione 10: Il problema del consumatore: Preferenze e scelta ottimale

Lezione 10: Il problema del consumatore: Preferenze e scelta ottimale Corso di Scienza Economica (Economia Politica) prof. G. Di Bartolomeo Lezione 10: Il problema del consumatore: Preferenze e scelta ottimale Facoltà di Scienze della Comunicazione Università di Teramo Scelta

Dettagli

Informa(ca Appun% dal laboratorio 2

Informa(ca Appun% dal laboratorio 2 Informa(ca Appun% dal laboratorio 2 Conce- fondamentali Esistono programmi, come Microso8 Word oppure Acrobat Reader, che vengono usa% dagli uten% per far eseguire al computer determinate operazioni (come

Dettagli

Algebra Booleana 1 ALGEBRA BOOLEANA: VARIABILI E FUNZIONI LOGICHE

Algebra Booleana 1 ALGEBRA BOOLEANA: VARIABILI E FUNZIONI LOGICHE Algebra Booleana 1 ALGEBRA BOOLEANA: VARIABILI E FUNZIONI LOGICHE Andrea Bobbio Anno Accademico 2000-2001 Algebra Booleana 2 Calcolatore come rete logica Il calcolatore può essere visto come una rete logica

Dettagli

Algebra di Boole ed Elementi di Logica

Algebra di Boole ed Elementi di Logica Algebra di Boole ed Elementi di Logica 53 Cenni all algebra di Boole L algebra di Boole (inventata da G. Boole, britannico, seconda metà 8), o algebra della logica, si basa su operazioni logiche Le operazioni

Dettagli

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2 Dispensa 10 Strutture collegate - 2 A. Miola Febbraio 2008 http://www.dia.uniroma3.it/~java/fondinf2/ Strutture collegate - 2 1 Contenuti!Strutture

Dettagli

INFORMATICA 1 L. Mezzalira

INFORMATICA 1 L. Mezzalira INFORMATICA 1 L. Mezzalira Possibili domande 1 --- Caratteristiche delle macchine tipiche dell informatica Componenti hardware del modello funzionale di sistema informatico Componenti software del modello

Dettagli

Algebra Di Boole. Definiamo ora che esiste un segnale avente valore opposto di quello assunto dalla variabile X.

Algebra Di Boole. Definiamo ora che esiste un segnale avente valore opposto di quello assunto dalla variabile X. Algebra Di Boole L algebra di Boole è un ramo della matematica basato sul calcolo logico a due valori di verità (vero, falso). Con alcune leggi particolari consente di operare su proposizioni allo stesso

Dettagli

Richiesta pagina PHP (es: index.php)

Richiesta pagina PHP (es: index.php) PHP PHP = personal home page SERVER Richiesta pagina PHP (es: index.php) Server Web (Apache) in ascolto sulla porta 80, si accorge che la pagina richiesta è una pagina PHP in base all'estensione o con

Dettagli

I file di dati. Unità didattica D1 1

I file di dati. Unità didattica D1 1 I file di dati Unità didattica D1 1 1) I file sequenziali Utili per la memorizzazione di informazioni testuali Si tratta di strutture organizzate per righe e non per record Non sono adatte per grandi quantità

Dettagli