Programmazione Avanzata Giuseppe Attardi Introduzione Preoccupazioni per il programmatore del 21 secolo Software complesso come mai Command line non basta più Dati vanno strutturati in DB Un singolo computer non basta Sviluppo di software diventa lavoro di gruppo Requisiti Non si può partire da zero Necessari componenti riusabili OS più librerie non bastano Controllo sull’esecuzione Evitare danni Installare/disinstallare è un incubo Component software? Ambienti RunTime Java Virtual Machine .NET Common Language Runtime Forniscono ambiente virtuale – Espone una struttura organizzata di elementi – Non semplice astrazione risorse fisiche Vantaggi Programmatori – Uso di strumenti e librerie – Minor tempo di integrazione – Maggiore produttività Sviluppatori di tool – Elimina necessità di occuparsi di infrastruttura e interoperabilità Amministratori e utenti – Vantaggio di soluzioni packaged – Indipendenza da processore o OS Common Language Infrastructure Espone tutti elementi in sistema tipi unificato Impacchetta elementi in unità selfdescribing Carica e risolve interdipendenze a runtime Espone informazioni che consentono verifica della type-safety Execution Engine assicura politiche Metadati disponibili a runtime consentono soluzioni dinamiche e estendibili Scopi del corso Capire le tecnologie dei linguaggi di programmazione: – Modelli di esecuzione – Runtime Analizzare metafore di programmazione: – Oggetti – Componenti – Pattern Conoscere tecniche di programmazione avanzate Capire i limiti e come superarli Tecniche Avanzate Programmazione generica – C++ templates – C# Generics – Java Generics Programmazione generativa – Metaprogrammazione – Reflection – Template – Aspect Oriented – Generators Programmazione Web Web Services, SOA Web Frameworks – J2EE – ASP.Net – AJAX Web 2.0 Scripting Languages Perl Python JavaScript PHP Domanda È veramente possibile realizzare un runtime comune a tutti i linguaggi di programmazione? Più in dettaglio Prolog – Come si implementano le variabili logiche? – Si può usare la Warren-AbstractMachine? PHP 3 – Perché l’assegnamento ha un comportanto insolito? LISP – Come si trattano i multiple-values? Prolog example append(X, Y, Z) :append(NIL, Y, Y) :append([A . X], Y, [A . Z] ) :- append(X, Y, Z). :- append([a . b . c], [d . e], R) R = [a . b . c . d . e] Prolog backtrack :- append(X, Y, [a . b]) :- append(X, NIL, [a . b]) X = NIL Y = [a . b] X = [a] Y = [b] X = [a . b] Y = NIL PHP Assignement $str = ‘Ciao.’; $str2 = $str; $str{strlen($str) – 1} = ‘!’; echo $str2; $var = $othervar – Effettua copia del valore di $othervar $var = &$othervar – Assegnamento per reference Controllo Si può implementare la tail-recursion in C? Come si tratta la sincronizzazione? Puntatori a funzione? Come chiamare una funzione arbitraria data la lista dei suoi argomenti? invoke(fun, argn, arglist) { if (n==0) return f(); else if (n==1) return f(arg[0]); else return fun(arg[0], arg[1], .. , arg[n-1]); } Tipi dato elementari Stringhe C, Pascal e C++ sono diverse Array in ordine di riga o di colonna? Language Interoperability C# e Cobol si abbaiano a vicenda C# dog using System; public class Dog { public virtual void RollOver () { Console.WriteLine("Scratch my tummy."); Bark(); } public virtual void Bark () { Console.WriteLine("WOOF WOOF (C#)"); } } Cobol BigDog 000010 CLASS-ID. BigDog INHERITS Dog. 000020 ENVIRONMENT DIVISION. 000040 CONFIGURATION SECTION. 000050 REPOSITORY. 000060 CLASS Dog. 000070 OBJECT. 000080 PROCEDURE DIVISION. 000090 METHOD-ID. Bark OVERRIDE. 000160 PROCEDURE DIVISION. DISPLAY "WOOF WOOF (COBOL)". 000210 END METHOD Bark. 000220 END OBJECT. 000230 END CLASS BigDog. Barfing dogs public class Demo { public static void Main() { Dog d = new Dog(); BigDog b = new BigDog(); d.RollOver(); b.RollOver(); } } Final Paper Scopo di mettere alla prova capacità complessive di concezione e realizzazione di soluzioni articolate Esempi: – Generatore di codice ASP e di matching di espressioni regolari – Implementazione di un DSL per manipolare contenitori di oggetti persistenti – Protocollo SOAP e server SOAP – Generatore di codice per SQL di ricerca su oggetti – Intreprete XPath e XSLT – Linguaggio di generazione di protocolli – Framework AJAX Home Work Proporre una semplice implementazione delle primitive: – void* malloc(size_t size) – void free(void*) Discutere i limiti della soluzione