Go - from Google



Let's Go          

Il linguaggio di programmazione Go è stato presentato per la prima volta nel 2009 da parte di un trio di sviluppatori, Robert Griesemer, Rob Pike e Ken Thompson per conto di Google. Il nome del famoso motore di ricerca è uno dei motivi di interesse per questo strumento, oltre ad aver ispirato, un po' banalmente, il nome (che è stato anche al centro di qualche contesa). Le mosse di un simile colosso dell'informatica non possono passare in secondo piano così come avviene per Microsoft, Oracle o Red Hat (che ha recentemente annunciato il suo Ceylon language). Sicuramente la forza del suo promotore ha favorito la diffusione, apprezzamento e la rapida nascita di un certo vivace ecosistema retrostante. Tuttavia questo successo non è dovuto solo dell'interesse determinato dalla importante società che sta, un po' in sordina a dire il vero, dietro al progetto. Go ha alcune caratteristiche molto interessanti già di suo.
Inutile dire che le motivazioni che hanno spinto verso la creazione di un nuovo linguaggio sono sempre le stesse: la non completa soddisfazione verso ciò che già esiste. In particolare la necessità di rinunciare, a seconda delle scelte, alle prestazioni oppure alla semplicità di apprendimento, o alla leggibilità ecc... Secondo gli autori Go si ispira agli aspetti migliori dei linguaggi già esistenti in particolare la produttività dei linguaggi dinamici con l'efficienza di quelli statici (ci sono un po' di luoghi comuni forse qui in mezzo ma tant'è). Niente di nuovo su questo fronte, trovatemi un autore di linguaggi che non dica più o meno le stesse identiche cose :-) (forse solo chi ha creato l'interessante ATS non ha proposto gli stessi concetti). In breve elenchiamo di seguito alcuni dei punto base del linguaggio, ovviamente non è un elenco esaustivo:

Go è un linguaggio compilato, ovvero non ci sono macchine virtuali di mezzo a fare da tramite con sistema operativo, concorrente, quindi supporta e favorisce la programmazione concorrente (parleremo a suo tempo delle goroutines), con esecuzione quindi di processi paralleli e persegue i paradigmi imperativo e strutturato. Al giorno d'oggi a farla da padrone è la programmazione a oggetti per cui ci si potrebbe chiedere che cosa ne è di questo approccio in Go. La risposta è variegata sui vari siti, la risposta migliore è come sempre quella sul sito ufficiale. In pratica Go permette uno stile di programmazione object oriented ma non esiste una vera e propria gerarchia a livello di tipo. Questa mancanza è importante e distingue profondamentel'approccio che abbiamo in Go rispetto a quelli dei linguaggi a oggetti più "estremisti". Sicuramente un approccio non convenzionale. Piacerà? Vedremo. D'altronde ci sono altre peculiarità in questo senso, apprezzeremo  l'importanza delle interfacce, sappiamo che esiste un garbage collector come nei moderni linguaggi object oriented, ma non si può parlare incoraggiamento verso quel paradigma. In questo sta uno dei punti interessanti, se vogliamo, di Go. Aggiungo che uno degli scopi perseguiti in fase di design del linguaggio era la velocità di compilazione, evitando così le tedioe attese tipiche di altri linguaggi quando si compilano programmi di grandi dimensioni.
La tipizzazione è di tipo statico e garantisce la type-safety, ovvero l'impossibilità di compiere azioni scorrette su un certo tipo di dato e la memory safety, quindi la garanzia della coerenza dei dati in memoria. Go è molto solido riguardo a questo aspetto. La stabilità è una delle finalità essenziali del linguaggio e ad essa si affiancano un supporto eccellente per la concorrenza e una particolare efficienza in fase di compilazione, anche su hardware non particolarmente performanti. Quest'ultimo punto, ovvero la velocità di compilazione, è uno dei punti principali nel "manifesto" che ha portato alla nascita di Go. A reggere le fila di tutto un type-system definito dagli autori leggero ed efficiente. Tutte le variabili sono inizializzate di default, così si evitano le criticità relativa a mancate inizializzazioni.
Il tutto oltre che all'efficienza dovrebbe essere ispirato alla semplicità di apprendimento. Come fonti di ispirazione abbiamo parecchi altri linguaggi C/C++ (si usano le graffe anche in Go) Pascal, Python. Giudicherete da soli se questo scopo è stato raggiunto, se avete sempre e solo programmato a oggetti secondo me ci vorrà un po' prima di essere davvero produttivi.
La linea originale scelta da questo linguaggio si può capire nella mancanza di alcune caratteristiche largamente diffuse come la programmazione generica, l'overload dei metodi, l'aritmetica dei puntatori. In origine Go non prevedeva alcun meccansimo per la gestione delle eccezioni ma successivamente furono inserite le keyword panic e recover per la gestione di eventi, appunto, eccezionali, sotto la spinta anche della comunità.

Di solito a questo punto parlo di quello che di un certo linguaggio non (mi) piace. Nel caso di Go direi che non è necessario, le sue caratteristiche si discostano a sufficienza dalla "media" degli altri linguaggi di programmazione in voga. Go piace o non piace, non credo siano possibili mezze misure. Inquesto senso si tratta di un qualche cosa piuttosto originale. Tra i linguaggi recenti solo il già citato ATS mi ha incuriosito di più per le sue peculiarità.

Il target di questo linguaggio è la programmazione di sistema, concorrente e general purpose ma non dubito che il grande fermento che si è avuto dal momento del suo annuncio nel mondo della programmazione, porterà alla nascita di librerie dedicate anche per il Web, la grafica e chissà cosa altro, nel medio periodo.
Il suo livello di adozione sembra ancora piuttosto ristretto, il sito Tiobe, che segue il trend di utilizzo dei linguaggi, lo segnala ancora tra quelli con bassa percentuale, pur avendo avuto alcun comparsate nei mesi scorsi nel top 50. Vedremo in futuro come andranno le cose, la mia sensazione è che ne sentiremo riparlare.

Lo sviluppo iniziale fu fatto dal team di Go inizialmente solo per il mondo *nix mentre un po' snobbato fu Windows (niente di sorprendente visti i rapporti tra Google e Microsoft). Il supporto verso il sistema operativo di casa Redmond fu portato avanti da alcuni volontari (gli sviluppatori di Go dissero che il team era troppo piccolo per curare il porting in quella fase... ma forse non era un'impresa così titanica....) ma ora anche il diffusissimo sistema operativo di Gates e C. può essere utilizzato per sviluppare in Go. Io, ad esempio, sto usando Windows come piattaforma di test. Come tanti linguaggi recenti anche Go è fruibile liberamente con licenza BSD.