La conferenza GopherCon
Chi scrive ha avuto il piacere di partecipare alla recente GopherCon 2015 (Denver, 7-10 luglio) [1], la conferenza mondiale sul linguaggio di programmazione Go [2]. Quel che è apparso chiaro dai numerosi interventi [3] è che Go è ormai diventato un linguaggio completo per le app mobile.
Infatti, a partire dalla versione 1.5 di Go, che sarà rilasciata ufficialmente in agosto, diventerà possibile includere librerie Go in app sia Android che iOS il che apre una prospettiva rivoluzionaria nel mondo mobile. Si avrà infatti a disposizione un linguaggio moderno e molto “leggero” con il quale sarà possibile sviluppare non solo i webservice, cosa che Go già può fare benissimo, ma anche componenti lato client.
In particolare, sarà possibile usare Go per scrivere l’intero strato di dati lato client (chiamate di rete, elaborazione dati, caching dei dati) e usare questo strato come libreria per entrambe le versioni dell’app, sia Android che iOS. E questo, mantenendo comunque la libertà di scrivere un’interfaccia utente nativa usando Java per Android e Swift per iOS.
Appare chiaro come questo possa nettamente semplificare lo sviluppo di app mobili native: gli sviluppatori mobile potranno concentrarsi semplicemente sull’interfaccia nativa, mentre sarà possibile scrivere la comunicazione client-server e il data model interamente in Go.
Che cosa è Go?
Go (chiamato anche GoLang) è un linguaggio di programmazione realizzato da Google [4]. La progettazione è cominciata nel 2007, tramite il confronto tra tre eminenti dipendenti Google: Ken Thompson, Rob Pike, Robert Griesemer [5]. I primi due sono stati anche tra i creatori del sistema operativo Unix.
Ken Thompson descrive così gli inizi: “Abbiamo cominciato come pura ricerca. Ci eravamo accorti che tutti e tre odiavamo il C++. Fin dall’inizio abbiamo deciso che noi tre dovevamo confrontarci su ogni signolo aspetto del linguaggio, in modo da non inserire per nessuna ragione alcun tipo di spazzatura”.
Il progetto è stato annunciato pubblicamente nel novembre 2009, e la versione 1.0 è uscita nel marzo 2012.
Le caratteristiche di Go
Go è un linguaggio statically-typed, vale a dire che la verifica dei tipi di variabili è effettuata durante la compilazione (come accade per C, Java, Scala e Pascal) e non durante il run-time (come per JavaScript, PHP, Python, Ruby).
Go, linguaggio ideale per i webservices
Go nasce come linguaggio generalista, ma negli ultimi tre anni si è affermato come linguaggio [6] ideale per i webservices. Il motivo di questo successo si deve principalmente a tre aspetti: facilità di deployment, efficienza nell’uso della memoria, gestione della concorrenza. Vediamo di seguito questi punti.
Facilità di deployment
Rispetto ad altri linguaggi, Go permette un server deployment estremamente semplice. Sulla macchina di produzione non è necessario installare alcun webserver (Apache o Nginx), alcuna Virtual Machine (come in Java), alcun tipo di wrapper (come l’WSGI per il Python), e nessuna componente del linguaggio Go. È sufficiente copiare l’eseguibile Go e farlo girare sul server come servizio (per esempio come servizio upstart).
Il file eseguibile Go contiene tutto al suo interno: il codice, il Go runtime, il webserver, eventuali libraries; le dimensioni sono particolarmente ridotte, in genere intorno ai 10 MB. I tempi di compilazione sono tra l’altro immediati, tipicamente meno di 1 secondo, ed è possibile fare cross-compilation da e per qualunque tipo di sistema operativo: Linux, Mac, Windows.
Efficienza nell’utilizzo della memoria
In termini di efficienza nell’utilizzo della memoria, Go è comparabile al linguaggio C, eliminando però molta della complessità tipica del C, utilizzando pattern di programmazione più solidi e intuitivi. Il garbage collector in Go è estremamente performante e, dalla versione 1.5 (già disponibile in beta) ha raggiunto una latenza molto vicina allo zero.
Comparata a quella di Java, l’impronta in memoria di Go è una frazione minuscola. Questo permette alle applicazioni scritte in Go di essere, oltre che semplici da scrivere, anche estremamente performanti, e di richiedere risorse hardware molto ridotte.
Concurrency
Il fiore all’occhiello di Go è necessariamente l’estrema facilità con cui si possono scrivere applicazioni che utilizzano codice concorrente. Ancora una volta, oltre ad essere sintatticamente semplici da scrivere, sono anche estremamente performanti. Nessun altro linguaggio di programmazione si avvicina a Go in questo aspetto.
La concorrenza in Go si può implementare in due modi: tramite i canali, che si ispirano alle teorie CSP (Communicating Sequential Processes) di C. Hoare, e tramite le goroutines, funzioni che possono essere eseguite in modo concorrente anche nell’ordine di molte migliaia.
Go inoltre offre uno strumento molto efficace per identificare eventuali data-race, ossia le situazioni in cui due goroutine accedono alla stessa variabile in modo concorrente e almeno uno dei due accessi è in scrittura.
Go Mobile Revolution
L’evoluzione di Go probabilmente più entusiasmante è il suo ingresso come linguaggio client per le applicazioni mobile. Nato come modulo sperimentale, a partire dalla versione Go 1.5 (in uscita ad agosto 2015) sarà già possibile includere codice Go sia in applicazioni Android che iOS.
Questo apre prospettive rivoluzionarie nell’ambito mobile, in quanto Go, che già è un linguaggio ideale per scrivere webservices, si candida a diventare un linguaggio mobile full-stack.
Diverse possibilità
Come ha spiegato Hana Kim, dipendente Google e membro del Go team che sta sviluppando il modulo mobile, lo scorso 9 luglio alla seconda edizione della conferenza mondiale di Go [7] il Go team sta lavorando su due possibilità:
- mobile apps interamente scritte in Go;
- mobile apps che includono una libreria client
La prima opzione è interessante soprattutto per app di giochi, dove l’interfaccia utente è comunque proprietaria, e quindi non si ha necessità di ricorrere a componenti native Android o iOS.
La seconda opzione è decisamente quella più rivoluzionaria, in quanto permette di riutilizzare una componente Go sia per la versione Android che iOS dell’app. semplificando enormemente il processo di sviluppo di app con interfaccia nativa.
Go è ideale per la componente dati
Tipicamente la componente client ideale da sviluppare in Go è quella dati: network calls, data processing, data caching. Questo permette di scrivere il client data layer una sola volta in Go, e di condividerlo come library sia nell’app Android che nell’app iOS.
Tutta la comunicazione client/server può quindi essere scritta in un unico linguaggio con l’enorme vantaggio di poter riutilizzare le stesse strutture dati sia per la parte client che server.
Lo sviluppo in linguaggio nativo (Java in Android e Swift in iOS) diventa datasource-agnostic e si interfaccia alla client library Go per tutti i dati di cui ha bisogno. È la library Go che decide dove andare a prendere i dati, se fare una chiamata ai webservices oppure utilizzare i dati della cache.
Lo sviluppatore mobile può quindi concentrarsi sulla componente esclusivamente nativa, ossia l’interfaccia utente.
Conclusioni
Abbiamo visto una rapida carrellata sugli aspetti principali di Go, che ha voluto rappresentare soprattutto uno stimolo per i lettori che li spinga ad approfondire l’argomento con le risorse riportate nei riferimenti [8] [9].
A essere onesti, la documentazione al momento è un poco latente, ma David Crawshaw, project manager di Go Mobile, ha promesso di rilasciare una documentazione completa, per l’integrazione sia con Android che iOS, in concomitanza con la release ufficiale di Go 1.5 nelle prossime settimane.
Le premesse per una piccola rivoluzione ci sono tutte: la Go Mobile Revolution, magari un po’ enfatica nei toni, è comunque una solida realtà destinata a lasciare il segno nel mondo della programmazione per i prossimi anni.