Confronto tra i principali Linguaggi di Programmazione per Sistemi Mobile Biagini Piero - 000657367 Tesina Programmazione di Sistemi Mobile Anno Accademico 2014-2015 Docente: Prof. Mirko Ravaioli Tutor: Nicolò Sordoni, Andrea Marozzi BIAGINI PIERO 1 Descrizione della tesina In questa tesina si parlerà dei Linguaggi di Programmazione più utilizzati nei Sistemi Mobile, ovvero: • Java (Android) • C# (Windows Phone) • Objective-C e Swift (iOS) Verranno evidenziate somiglianze e differenze riguardanti la sintassi e le funzionalità. Introduzione Java Java è un linguaggio di programmazione orientato agli oggetti progettato per essere indipendente dalla piattaforma su cui viene eseguito. Il progetto nasce nel 1992, inizialmente chiamato Oak poi ribattezzato nell’attuale Java, all’università di Stanford. Lo sviluppo viene poi portato avanti dalla Sun Microsystem, in particolare dal team con a capo James Gosling. La presentazione ufficiale avvenne nel maggio del 1995. La sintassi di base viene mantenuta pressoché identica a quella del C++ per semplificare il passaggio da tale linguaggio, ma alcune delle caratteristiche più complesse (es. aritmetica dei puntatori, ereditarietà multipla, istruzione goto, …) sono state rimosse per rendere l’utilizzo di Java più semplice e sicuro. Il linguaggio viene definito in un documento chiamato The Java Language Specifcation (JLS), pubblicato per la prima volta nel 1996 e in seguito ricevuto e ampliato. Ad oggi la versione più recente è Java SE 8 Edition. Uno dei punti di forza del linguaggio è il fatto che, grazie all’utilizzo del processore virtuale Java Virtual Machine (JVM), il codice “compilato” (bytecode) per una certa piattaforma non deve essere ricompilato per essere eseguito su un’altra (anche se esistono alcune classi che sono specifiche, ad esempio, per il sistema operativo su cui vengono utilizzate). La JVM è inclusa all’interno del Java Runtime Environment (JRE), necessario per l’esecuzione del programma compilato. Java e Android Java è il linguaggio principale utilizzato per la programmazione di applicazioni Android. In particolare il comportamento dell’applicazione viene definito, generalmente, da codice Java, mentre il layout degli oggetti grafici è descritto in XML. BIAGINI PIERO 2 Non viene, tuttavia, utilizzata la classica JVM, ma ne sono state create delle versioni specifiche (in particolare Dalvik Virtual Machine fino alla versione Jelly Bean e ART da KitKat in poi). Il paradigma di programmazione utilizzato per la costruzione delle applicazioni è Event Driven, ovvero non esiste un entry point da cui il programma si avvia, carica ed esegue le sue parti, ma ogni classe è pensata per essere un componente pilotato dagli eventi. Ciò, se i componenti sono sufficientemente indipendenti, permette al SO di ottimizzare l’uso di risorse evitando di caricare componenti non necessari o, allo stesso tempo, permette la condivisione di funzionalità (con un meccanismo chiamato Intent). Le applicazioni per Android vengono distribuite dal Play Store oppure direttamente sotto forma di APK (un pacchetto contenente i codici da compilare). IDE L’IDE di riferimento è Android Studio, un ambiente di sviluppo basato su IntelliJ IDEA (prodotto da JetBrains). Esso ha sostituito il vecchio Eclisse Android Development Tools (ADT) basato su Eclipse. E’ disponibile per tutti i sistemi operativi più diffusi (Windows, Mac OS X e varie distribuzioni di Linux). C# C# è un linguaggio di programmazione orientato agli oggetti sviluppato da Microsoft all’interno della framework .NET. Il progetto nasce nel gennaio 1999, quando Anders Hejlsberg forma un team per lo sviluppo di un nuovo linguaggio di programmazione Object Oriented C-Like (Cool, C-like Object Oriented Language). E’ stato in seguito pubblicato nel luglio del 2000 alla Professional Developers Conference dopo averlo rinominato con il nome attuale e dopo aver riscritto nel nuovo linguaggio le librerie ASP.NET. Inizialmente visto come poco più di una copia di Java, a partire dal 2005 (anno di pubblicazione della seconda versione) ha iniziato sempre più a divergere (se non nei contenuti, nell’implementazione di essi). C# non è definibile pienamente né come linguaggio compilato, né come linguaggio interpretato. In prima istanza il framework converte il programma in un codice intermedio (detto CIL) e al momento dell’esecuzione il CLR, specifico per il SO, converte il CIL in codice macchina secondo una compilazione di tipo JIT. E’ tuttavia possibile adottare anche un tipo di compilazione detto Ngen, che permette di convertire tutto il codice CIL in codice macchina in una volta sola. A differenza di Java, la cui JVM (o altra macchina virtuale) è disponibile per più sistemi operativi diversi, il framework e il CLR sono disponibili solamente per Windows. Esistono tuttavia alcuni progetti open source non ufficiali come Mono e DotGNU. BIAGINI PIERO 3 C#e Windows Phone C# è il principale linguaggio di sviluppo per Windows Phone. Altri linguaggi utilizzati sono Visual Basic, C++ o JavaScript. A differenza di Android, le applicazioni sviluppate per Windows Phone sono universali, ovvero sono in grado di funzionare sia su dispositivi mobili che su computer (nonostante le applicazioni vengano distribuite da due store paralleli, rispettivamente Windows Phone Store e Windows Store). Esse si basano su Windows Runtime. Oltre al C# un altro linguaggio che deve essere necessariamente utilizzato per la creazione delle app, in particolare per la descrizione del layout della varie view,è XAML (eXtensible Application Markup Language), analogo all’XML di Android ma sviluppato da Microsoft. IDE L’IDE di riferimento per la programmazione di applicazioni per Windows è Visual Studio. Esso è disponibile solamente per Windows. E’ inoltre necessario, a causa dell’utilizzo di Windows Runtime, utilizzare la versione di Windows 8.1. Objective-C Objective-C è un linguaggio di programmazione orientato agli oggetti, estensione del precedente linguaggio (non a oggetti) C. Esso è ispirato al linguaggio Smalltalk e ha una logica e una sintassi notevolmente diversa da quella degli altri linguaggi OOP più diffusi (Java e C#), tra cui, per esempio, la gestione dei messaggi tra gli oggetti. Il progetto nasce all’inizio degli anni ’80 da parte di Brad Cox e Tom Love. Essi decisero di modificare un compilatore C aggiungendo alcune caratteristiche prelevate dal linguaggio a oggetti che già conoscevano (Smalltalk) in modo da permettere, tra l’altro, una maggiore riusabilità del codice. Il linguaggio così creato prese il nome di OOPC (Object-Oriented Programming in C) e venne presto dotato di numerose librerie software che consentivano al codice sorgente di essere raccolto in un solo formato multipiattaforma. La pubblicazione avvenne nel 1986 con il nome attuale. Steve Jobs, durante il suo lavoro alle NeXT (fondata dopo Apple) ottenne la licenza dell’Objective-C e fece realizzare il proprio compilatore e le proprie librerie sulle quali basò il sistema operativo NeXTSTEP. Dopo aver comprato NeXT nel 1966 Apple prese come base il SO NeXTStep per sviluppare il sistema operativo Mac OSX. Tutt’ora le principali API di Apple (Cocoa) sono basate sugli oggetti di interfaccia OpenStep. In seguito, con l’uscita sul mercato dei dispositivi mobili, venne creata l’estensione Cocoa Touch. Objective-C è un linguaggio totalmente compilato. BIAGINI PIERO 4 Objective-C e iOS Objective-C è il linguaggio storico per lo sviluppo di applicazioni per iOS (oggi è in via di sostituzione da Swift, il nuovo linguaggio creato ad hoc da Apple di cui parleremo in seguito. Viene utilizzato il framework Foundation Kit. Esso è fedele alle specifiche di OpenStep (clone open source di NeXTStep), contenuto all’interno delle Cocoa Touch API. Cocoa Touch è il framework per costruire l’interfaccia grafica (contiene i set di controlli ed elementi grafici da usare nelle view) e fornisce al programmatore un’astrazione del sistema operativo, permettendo di utilizzare l’hardware presente all’interno degli smartphone e dei tablet Apple. L’architettura su cui si basano le applicazioni per iOS è MVC (Model View Controller). IDE L’unico IDE utilizzabile per programmare applicazioni per iOS utilizzando questo linguaggio è Xcode. Esso è disponibile per le più recenti versioni del sistema operativo di casa Apple (Mac OSX). Swift Swift è il nuovo linguaggio di programmazione per sistemi iOS e OS X presentato da Apple durante il WWDC 2014. E’ un linguaggio di tipo objectoriented progettato per coesistere con Objective-C (linguaggio tipicamente utilizzato per gli stessi scopi), ma rendendo la scrittura del codice più semplice. Il progetto nasce nel 2010, portato avanti da un team guidato da Chris Lattner. Si ispira agli altri linguaggi di programmazione più diffusi, come Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, … La presentazione ufficiale avviene nel 2014, quando viene rilasciata al pubblico la prima app sviluppata in questo linguaggio. Swift è un linguaggio di tipo compilato. Grazie al compilatore LLVM è possibile creare programmi che contengono parti di codice in diversi linguaggi (C, Objective-C, C++ e Swift). Il manuale ufficiale del linguaggio può essere trovato sull’iBook Store. Swift e iOS Swift sta affiancando Objective-C nella programmazione di dispositivi iOS. Esso ha infatti il vantaggio di avere una sintassi e un funzionamento notevolmente più semplici e simili ad altri linguaggi più comuni. Swift non è, tuttavia, completo: alcune funzionalità devono necessariamente essere implementate in Objective-C (es. l’utilizzo delle mappe) in quanto ancora non sono state BIAGINI PIERO 5 scritte librerie adeguate. In questi casi torna utile la possibilità di mescolare moduli scritti in linguaggio diverso. Le restanti considerazioni fatte per Objective-C possono essere considerate valide anche per Swift. IDE Come per Objective-C, l’unico IDE utilizzabile è Xcode. Confronto Organizzazione dei file Linguaggio Descrizione Java Il codice sorgente è contenuto all’interno dei file .java. Di norma si utilizza un file per ogni classe, ma è possibile inserire anche più classi all’interno dello stesso file (lo si fa quando si utilizzano classi anonime o innestate). C# Il codice sorgente è contenuto all'interno dei file .cs. Come in Java, di norma si inserisce un’unica classe o un’unico namespace all’interno dello stesso file, ma è possibile inserire due o più classi o namespace all’interno dello stesso file. Objective-C Il codice sorgente è diviso in più file: • .h: file header, contengono la dichiarazione di classi, tipi, funzioni e costanti. • .m: file sorgente che può contenere codice Objective-C o C. Esso generalmente implementa classi e funzioni dichiarate nel relativo file header. • .mm: file sorgente che può contenere codice C++ oltre che Objective-C e C. Swift Il codice sorgente è contenuto all'interno dei file .swift. Generalmente si consiglia di inserire una sola classe all’interno di ogni file, ma non esistono vincoli particolari. Organizzazione delle classi Linguaggio Descrizione Java Le classi possono essere raggruppate in package. Essi permettono di dividere le classi in base, per esempio, a criteri semantici ed eventualmente di limitare la visibilità delle classi stesse o dei loro metodi o campi. C# Le classi possono essere raggruppate in namespace. Sono praticamente analoghi ai package di Java. Objective-C Non è definito un modo particolare per organizzare le varie classi. Eventualmente i file sorgenti possono essere organizzati per cartella. Swift Non è definito un modo particolare per organizzare le varie classi. Eventualmente i file sorgenti possono essere organizzati per cartella. BIAGINI PIERO 6 Visibilità di metodi, campi e classi Linguaggio Descrizione Java • • • • C# • • • • Objective-C • • • Swift • • • private: l’elemento è visibile solamente all’interno della stessa classe. package: l’elemento è visibile solamente all’interno dello stesso package (visibilità di default) protected: l’elemento è visibile solamente all’interno della classe stessa oppure dalle sue sottoclassi. public: l’elemento è visibile da qualunque parte del codice. private: l’elemento è visibile solamente all’interno della classe stessa. internal: l’elemento è visibile solamente all’interno dello stesso assembly. protected: l’elemento è visibile solamente all’interno della classe stessa oppure dalle sue sottoclassi. public: l’elemento è visibile da qualunque parte del codice. @private: l’elemento è visibile solamente all’interno della classe stessa. @protected: l’elemento è visibile solamente all’interno della classe stessa oppure dalle sue sottoclassi. @public: l’elemento è visibile da qualunque parte del codice. private: l’elemento è visibile solamente all’interno della classe stessa. internal: l’elemento è visibile solamente all’interno dello stesso modulo. public: l’elemento è visibile da qualunque parte del codice. In Java, C# e Swift è sufficiente apporre, prima del nome dell’elemento che si vuole limitare, il tipo di visibilità desiderata. In Objective-C la visibilità va invece specificata nella riga immediatamente prima. Paradigma a oggetti Linguaggio Java Incapsulamento: cia Sì Ereditarietà Polimorfismo Sì, singola Sì C# Sì Sì, singola Sì Objective-C Sì Sì, singola Sì Swift Sì Sì, singola Sì Tipi primitivi Linguaggio Descrizione Java Le variabili dichiarate in questo modo non corrispondono a oggetti e, per questo, non possono avere valore nullo (al momento della dichiarazione, se non inizializzate esplicitamente, assumono un valore di default). I tipi disponibili sono byte, short, int, long, float, double, boolean, char. Ad ogni tipo primitivo corrisponde anche una classe che fa wrapping. Grazie all’autoboxing è possibile assegnare semplicemente un un operatore = il valore dei tipi primitivi alla classe e viceversa. BIAGINI PIERO 7 Linguaggio Descrizione C# Esistono due classi di tipi: Value Types e Reference Types. I primi sono allocati nello stack e contengono direttamente il valore (tipi primitivi) mentre i secondi fanno riferimento a oggetti allocati dinamicamente nello heap (oggetti). Di seguito alcuni esempi di value types: short, int, long, byte, char, float, double, decimal, bool. Objective-C Objective-C utilizza gli stessi tipi primitivi del C, quindi short, int, long, float, double, BOOL, char. Swift Vengono utilizzati gli stessi tipi primitivi di Objective-C: Int, Double, String, … Gestione della memoria Linguaggio Descrizione Java Entrambi i linguaggi utilizzano un Garbage Collector automatico: l’utente non ha possibilità di controllare come viene gestita la memoria ma un sistema automatico controlla a tempo di esecuzione se gli oggetti possono o meno essere cancellati. C# Objective-C Swift I linguaggi per dispositivi Apple utilizzano una funzionalità detta ARC (Automatic Reference Counting). Per ogni oggetto allocato è mantenuto il conteggio dei riferimenti ad esso. Se il riferimento viene cancellato il contatore viene decrementato mentre se il riferimento viene creato il contatore viene incrementato. Una volta che ha raggiunto lo 0 si può supporre che nessuno abbia più riferimenti a tale oggetto e che possa, quindi, essere cancellato. Tale conteggio viene fatto compile-time. Classi e interfacce Linguaggio Descrizione Java Ogni classe dichiarata estende da object, ma è possibile anche estendere altre classi. Per riferirsi a componenti della classe stessa può essere utilizzata la parola chiave this mentre per riferirsi a componenti della superclasse si utilizza la parola chiave super. E’ possibile anche dichiarare classi statiche. Una classe può essere dichiarata con una sintassi analoga alla seguente: public class myClass extends mySuperClass implements myInterface { //fields //methods } C# Ogni classe dichiarata estende da object, ma è possibile anche estendere altre classi. Per riferirsi a componenti della classe stessa può essere utilizzata la parola chiave this mentre per riferirsi a componenti della superclasse si utilizza la parola chiave super. Un metodo o un campo di classe può essere dichiarato utilizzando la keyword static. E’ possibile anche dichiarare classi statiche. Una classe può essere dichiarata con una sintassi analoga alla seguente: public class myClass : mySuperClass, myInterface { //fields //methods } BIAGINI PIERO 8 Linguaggio Descrizione Objective-C Ogni classe dichiarata deve estendere esplicitamente da una classe base detta oggetto root (oggetto che non estende da altri oggetti). L’oggetto root più comune è NSObject. Per riferirsi a componenti della classe stessa può essere utilizzata la parola chiave self mentre per riferirsi a componenti della superclasse si utilizza la parola chiave super. Un metodo di classe viene dichiarato inserendo un segno (+), mentre un metodo d’istanza inserendo un segno (-). Nota particolare per questo linguaggio dev’essere fatta per le interfacce: a differenza degli altri, infatti, l’interfaccia deve essere obbligatoriamente scritta nel file header. Il file sorgente importerà tale file e ne definirà l’implementazione. Una tipica dichiarazione di classe prevede i seguenti costrutti: //NEL FILE myClass.h @interface MyClass : NSObject { //public fields } //methods @end L’implementazione sarà poi presente all’interno del file .m che importa tale file header tramite la direttiva #import. //NEL FILE myClass.m #import “myClass.h” @implementation MyClass { //questa sezione si può omettere //private fields } //methods implementation @end Tramite la tecnica delle categorie è anche possibile aggiungere metodi (ma non campi)a classi già fatte (sia classi create personalmente che classi di libreria). Per utilizzare questo metodo bisogna, al momento dell’importazione, specificare entrambi gli header separandoli con un segno “+” e, nella riga dove si definisce l’implementazione della classe, specificare tra parentesi tonde la categoria che verrà aggiunta. Non esiste un limite al numero di categorie che possono essere aggiunte, ma ognuna deve dichiarare e definire metodi diversi. Swift Ogni classe dichiarata deve estendere esplicitamente da una classe base detta oggetto root (oggetto che non estende da altri oggetti). L’oggetto root più comune è NSObject. Per riferirsi a componenti della classe stessa può essere utilizzata la parola chiave self mentre per riferirsi a componenti della superclasse si utilizza la parola chiave super. Una dichiarazione di classe può essere fatta in questo modo: public class myClass : mySuperClass, myInterface { //fields //methods } BIAGINI PIERO 9 Metodi Linguaggio Descrizione Java La sintassi per la dichiarazione dei metodi è la seguente: public returnType myMethod(type param1, type param2, …) {…} Un metodo di classe può essere dichiarato utilizzando la keyword static. Un metodo può essere richiamato tramite la dot notification (nomeDellOggetto.metodo() per metodi di istanza oppure nomeDellaClasse.metodo() per metodi di classe). C# La sintassi per la dichiarazione dei metodi è la seguente: public returnType myMethod(type param1, type param2, …) {…} Un metodo di classe può essere dichiarato utilizzando la keyword static. Un metodo può essere richiamato tramite la dot notification (nomeDellOggetto.metodo() per metodi di istanza oppure nomeDellaClasse.metodo() per metodi di classe). Objective-C La sintassi per la dichiarazione dei metodi è la seguente: -­‐(returnType)methodNameParam1Label:(type)Param1Name Param2Label:(type)Param2Name; //metodo di istanza +(returnType)methodNameParam1Label:(type)Param1Name Param2Label:(type)Param2Name; //metodo di classe A differenza degli altri linguaggi di programmazione in Objective-C non si chiama un metodo, ma si invia un messaggio. Esso corrisponde alla firma del metodo con, in aggiunta, le informazioni sui parametri. La sintassi è la seguente: [myObject methodNameParam1Label:value Param2Label:value]; Swift La sintassi per la dichiarazione dei metodi è la seguente: public func myFuncName(param1:Type, param2:Type, …) -­‐> ReturnType {…} Un metodo o un campo di classe può essere dichiarato utilizzando la keyword static. Un metodo può essere richiamato tramite la dot notification (nomeDellOggetto.metodo() per metodi di istanza oppure nomeDellaClasse.metodo() per metodi di classe). In Java, C# e Swift è possibile fare overload dei metodi delle classi semplicemente aggiungendo la parola chiave override e riprendendo la signature del metodo di cui si vuole fare overload. Al contrario, Objective-C non supporta pienamente tale funzione, ma si adotta lo stratagemma di modificare il primo argomento. In tutti i linguaggi è inoltre possibile creare classi astratte, ma mentre in Java e in C# non è possibile poi istanziarle a causa di controlli del compilatore, in Objective-C non è presente tale limitazione (non esiste infatti distinzione tra classe astratta o meno). BIAGINI PIERO 10 Dichiarazione di variabili, oggetti e campi Linguaggio Descrizione Java Per i tipi primitivi: type name = initValue; Per gli oggetti: class name = new Class(params); Nel caso si parli di campi è possibile aggiungere diverse parole chiave, tra cui final (valore non più modificabile), volatile (utile nel caso la variabile sia condivisa da più thread, evita inconsistenza), static (campo di classe), … C# Per i tipi primitivi: type name = initValue; Per gli oggetti: class name = new Class(params); Nel caso si parli di campi è possibile aggiungere diverse parole chiave, tra cui final, volatile, static, … Nel caso di dichiarazione e inizializzazione della variabile sulla stessa riga è possibile usare la parola chiave var invece del tipo o della classe. Objective-C Per i tipi primitivi: type name = initValue; Per gli oggetti: class *name = [[Class alloc] init]; E’ necessario ricordarsi che in Objective-C sono presenti i puntatori. E’ possibile dichiarare un puntatore semplicemente apponendo un * prima del nome della variabile. Swift Per i tipi primitivi: var name:myType = initValue; Per gli oggetti: var name:Class = Class(paramName:param…); Oltre alla parola chiave var è presente anche la parola chiave let. La differenza è che con la prima il valore può essere modificato mentre con la seconda no. Nel caso l’inizializzazione avvenga nello stesso momento della dichiarazione della variabile, il tipo di dato può essere omesso. Interfacce e protocolli Le interfacce (Java e C#) o protocolli (Objective-C) consentono di definire un elenco di metodi che le classi che implementano l’interfaccia/protocollo dovranno contenere e implementare. Essi si dichiarano in maniera analoga alle classi ma usando la parola chiave interface o protocol (a seconda del linguaggio che si sta utilizzando). BIAGINI PIERO 11 Proprietà In C# e Objective-C è possibile definire le proprietà, ovvero metodi di accesso ai campi degli oggetti dichiarabili in maniera veloce. Linguaggio Descrizione C# type fieldName { { get; } { set; } } Objective-C @property myType myVariable; All’interno delle parentesi graffe che contengono get e set è possibile specificare delle operazioni che dovranno essere compiute prima di ottenere il dato o prima dell’assegnazione. Non è necessario creare entrambi i metodi di accesso. Tale sintassi è analoga a definire due metodi di accesso, un getter e un setter. Il primo ha nome uguale al campo mentre il secondo prende il nome di setmyVariable:. E’ eventualmente possibile specificare nomi diversi. Dopo essere state dichiarate, le proprietà devono essere implementate tramite la keyword @synthetize. Enumeration Linguaggio Descrizione Java public enum MyEnum { elem1, elem2, … } In Java le Enum vengono dichiarate come classi. I valori possono essere richiamati tramite la dot notification. C# enum MyEnum { elem. = value, elem. = value, … } In C# le Enum possono essere dichiarate all’interno delle classi. E’ possibile assegnare un valore ad ogni elemento. I valori possono essere richiamati tramite la dot notification. Objective-C enum MyEnum { elem1, elem2, … }; E’ poi possibile definire un nuovo tipo di dato per evitare di utilizzare la keyword enum ogni volta. In questo modo i valori possono essere richiamati semplicemente chiamandoli per nome. typedef MyEnumType MyEnum Swift enum MyEnum { elem1, elem2, … } I valori possono essere richiamati tramite dot notification. BIAGINI PIERO 12 Delegate/Closure e Lambda Expression Linguaggio Descrizione Java Il meccanismo dei delegate non è disponibile in Java. Le Lambda Expression sono disponibili a partire dalla versione 8 e possono essere dichiarate con la seguente sintassi: type lambdaName = (list of params) -­‐> { //statement or block of code } C# Entrambe le funzionalità sono disponibili in C#. Per l’utilizzo dei delegate è sufficiente dichiarare una variabile di tipo delegate e assegnare ad essa un metodo tramite l’operatore =: returnType myFunction() {…} … delegate returnType delegateName(params) = myFunction(); Le Lambda Expression hanno una sintassi simile a quella di Java: delegate returnType lambdaName(params) => { //statement or block of code } Objective-C In Objective-C i delegate prendono il nome di Blocchi o Closure. Possono essere dichiarati in questo modo: returnType (^ myBlock)(params); //dichiarazione del prototipo myBlock = ^(params) { //code }; Il blocco così dichiarato può essere utilizzato, utilizzato direttamente o anche passato come parametro. Swift Come in C#, per la creazione di un delegate è sufficiente assegnare ad una variabile un metodo creato in precedenza oppure un metodo anonimo creato con la seguente sintassi: var myClosure = { (parameters) -­‐> returnType in //statements } BIAGINI PIERO 13