Golang: il linguaggio di programmazione semplice di Google
È ormai risaputo che con il nome “Google” non ci si riferisce più solo a un motore di ricerca. L’assortimento di prodotti comprende servizi web utili come Google Maps, piattaforme di entertainment come YouTube e Google Music, applicazioni di comunicazione come Gmail, soluzioni Office come Google Docs e persino hardware come lo smartphone Pixel, ideato da Google. Inoltre la multinazionale fornisce da anni utili tool per sviluppatori web e software. A partire da marzo 2012 rientra nel portfolio dell’azienda anche il sempre più amato linguaggio di programmazione Go, conosciuto anche con il nome di Golang.
Che cos’è Golang?
A settembre 2017 gli sviluppatori Robert Griesemer, Rob Pike e Ken Thompson, impiegati di Google, hanno formulato i loro obiettivi per un linguaggio di programmazione ottimizzato e semplificato, gettando le basi per Go o Golang. Quello che è iniziato dapprima come un progetto più piccolo, si è trasformato in fretta in un progetto ambizioso, il cui sviluppo Google ha portato volutamente avanti, mettendo a disposizione le risorse necessarie.
Dopo che Go alla fine del 2011 è stato ufficialmente presentato come progetto open source (licenza BSD), sono spuntati velocemente un gran numero di supporter nella community, che contribuiscono ancora oggi allo sviluppo e all’ottimizzazione del linguaggio di programmazione. La release finale della prima versione stabile (1.0) è avvenuta il 28 marzo 2012. A partire dalla versione 1.1, che è seguita un anno dopo, Google ha rilasciato aggiornamenti circa ogni 6 mesi.
La mascotte e il logo di Golang, una particolare specie di roditore del Nord America chiamata Gopher, sono stati ideati da Renée French, la cui creatività ha dato vita anche a Glenda, il coniglio Plan 9. Anche a questo sistema operativo UNIX di Bell Labs, sviluppato negli anni 80, hanno preso parte Rob Pike e Ken Thompson.
La sintassi di Golang è fortemente orientata alla sintassi di base della famiglia C ma mostra anche notevoli influenze provenienti dai linguaggi sviluppati da Niklaus Wirth come Pascal, Modula e Oberon. Inoltre in essa sono confluiti aspetti di linguaggi come Newsqueak e Limbo, a loro volta ispirati dal processo CSP (Communicating Sequential Processes) di Tony Hoares.
Golang è compilabile, anche se si è concentrato sin dall’inizio nel garantire un’elevata velocità di conversione. Inoltre il linguaggio di programmazione dispone di una modalità automatica per la pulizia della memoria (in inglese Garbage Collection o abbreviato in GC), che si occupa in background di una gestione ottimale delle risorse della memoria disponibili e in questo modo impedisce l’insorgere di relativi problemi.
Come si può classificare Golang tra i linguaggi di programmazione?
Sebbene Golang sia relativamente giovane rispetto agli altri linguaggi di programmazione, è stato già sviluppato sufficientemente e risulta così stabile da essere utilizzato dagli sviluppatori di tutto il mondo; persino lo stesso Google ricorre alle possibilità offerte da questo linguaggio di programmazione.
Golang si contraddistingue specialmente per la sua semplicità e multifunzionalità che gli sviluppatori avevano previsto sin dall’inizio. Infatti il nuovo linguaggio di programmazione nasce dall’insoddisfazione provocata dai rappresentanti affermati in questo settore che emergevano per una compilazione del codice efficiente o per una esecuzione veloce o ancora per un processo di programmazione semplice ma senza presentare tutti e tre i vantaggi insieme.
Tramite la combinazione di importanti feature tratte da diverse famiglie linguistiche, Golang dà in questo frangente il buon esempio: così la lingua di Google combina la facilità di programmazione, che contraddistingue il linguaggio interpretato e dinamico, con l’efficienza e la sicurezza di un linguaggio tipizzato e compilato in modo statico. In più la struttura di Go mira a consentire un breve processo di sviluppo che permette di creare anche file grandi ed eseguibili su un singolo computer nel giro di pochi secondi. Alcune delle caratteristiche di markup decisive di Golang, tramite le quali può essere raggiunto questo standard di qualità, sono:
- un sistema di tipi con una forte proprietà di espressione ma leggero per una classificazione e differenziazione ottimale dei diversi oggetti (variabili, funzioni, ecc.);
- la concorrenza (programmazione parallela) per un’esecuzione più veloce del programma;
- la già menzionata pulizia automatica (GC) per garantire un utilizzo ottimale della memoria disponibile e per evitare problemi correlati;
- una specificazione rigida di dipendenze senza una sintassi dichiarativa impegnativa;
- l’uso su tutte le piattaforme, consentendo così di utilizzare le applicazioni sviluppate su tutti i sistemi comuni.
Programmare con Golang: le particolarità
La sintassi di Go si basa sulla classica sintassi di C, ma si differenzia dal linguaggio di programmazione, già sviluppato nel 1972, con una serie di piccoli miglioramenti e una gamma di funzioni notevolmente ridotta. Così, ad esempio, nella programmazione con Golang non è obbligatorio inserire le parentesi tonde nelle condizioni e nei cicli e opzionalmente si può mettere il punto e virgola finale, tipico dei linguaggi della famiglia C.
In aggiunta si può regolare la validità degli identificatori (i nomi degli elementi suddetti) attraverso il modo di scrittura (maiuscolo o minuscolo). Ad esempio se un identificatore deve essere attivo anche al di fuori di un determinato pacchetto Go, è necessario scrivere le prime lettere maiuscole. Di seguito vi elenchiamo altre particolarità della programmazione con Golang:
- Ambiente GOPATH come base: uno dei primi atti d’ufficio nella programmazione con Go consiste nel creare la directory GOPATH, comprensiva delle sottodirectory “src” (file sorgente Go), “pkg” (oggetti del pacchetto Go “package objects”) e “bin” (comandi eseguibili). Tutto il codice Go comprensivo di dipendenze si può gestire tramite questo ambiente di lavoro. La posizione di memorizzazione di questa directory obbligatoria GOPATH si può scegliere liberamente.
- Struttura modulare con i pacchetti GOLANG (packages): i file sorgente su Golang si possono organizzare in modo modulare tramite directory che vengono indicate come packages o pacchetti. Il nome della relativa directory è così allo stesso tempo anche il nome del pacchetto, di cui fanno parte tutti i file sorgente che si trovano in questa cartella. Se le funzioni, i tipi, ecc. dovessero essere applicati tra i diversi pacchetti, va utilizzata la già citata scrittura maiuscola del corrispondente identificatore.
- Formattazione del codice unitaria e consigliata: Golang stabilisce determinate convenzioni per la formattazione del codice, ad esempio per l’intervallo esatto tra i singoli elementi. Quindi chi ha imparato a programmare applicazioni con Golang può anche leggere facilmente il codice di altri sviluppatori senza dover decifrare preventivamente il suo stile di formattazione personale, com’è il caso di molti altri linguaggi. Il formato non deve essere rispettato fin nel più piccolo dettaglio dal redattore: il tool integrato gofmt ottimizza automaticamente il codice Golang, risolvendo formattazioni errate.
- Import relativi come standard: tutti i file e i pacchetti che vengono importati nei progetti di Golang (autonomamente o da parte di terzi) sono sempre relativi alla cartella GOPATH/src rendendo così il processo di importazione molto facile. Inoltre Go non compila gli elementi importati se non vengono effettivamente utilizzati. In questo modo un codice pulito è garantito solo quando i componenti importati non vengono o non sono più utilizzati.
- Valori di ritorno multipli per funzioni e metodi: con Go si possono generare funzioni e metodi che possono restituire più valori. In questo modo Go può ad esempio separare in maniera pulita un risultato valido e un errore inserito alternativamente al momento della restituzione. Invece con C gli errori di scrittura vengono resi tramite un valore numerico negativo, mentre il codice di errore effettivo viene conservato separatamente.
Punti di forza e campi di applicazione di Golang
Molti punti di forza elementari di Golang sono già stati esposti in questo articolo: per via della sua semplicità il linguaggio di Google, rispetto agli altri linguaggi di programmazione, risulta notevolmente meno pesante per gli sviluppatori. Chi ha interiorizzato i fondamenti approfitta del semplice utilizzo e degli innumerevoli automatismi, che comportano un notevole risparmio di tempo.
A questo scopo Go fornisce appositi software come ad esempio gofmt, che agisce autonomamente per l’ottimizzazione automatica del codice, dando anche la risposta perfetta a compiti che diventano sempre più complessi nello sviluppo software. A questo si aggiunge il fatto che il codice Golang è formattato sempre allo stesso modo, cosa che semplifica notevolmente la leggibilità generale e di conseguenza la collaborazione nel team.
Un altro punto di forza che invoglia a programmare con Golang è la buona performance dimostrata da questo linguaggio di programmazione. La velocità di esecuzione delle applicazioni Go convince nel confronto generale con altri linguaggi di compilazione. Così la velocità di compilazione corrisponde ad esempio approssimativamente a quella di Java. Mentre molte applicazioni Java si basano sul framework Spring e hanno perciò bisogno di un certo tempo nel processo di avvio, fino a quando possono essere risolte le richieste HTTP, i servizi di Golang utilizzano le implementazioni già presenti nella libreria standard, cosa che accelera notevolmente il processo di avvio.
Di conseguenza è meno sorprendente che Golang finora venga utilizzato soprattutto in ambienti aziendali e server, dove la stabilità e la performance dei servizi giocano un ruolo importante. In particolare nella virtualizzazione con i container è richiesto questo linguaggio di programmazione giovane, cosa che in ultimo è da ricondurre al fatto che Docker, uno dei maggiori rappresentanti tra le piattaforme container, si basa su Go.
Cosa può ancora imparare dagli altri linguaggi di programmazione?
Nonostante tutti gli elogi rivolti al moderno linguaggio di programmazione di Google, non deve ovviamente passare inosservati anche un paio di punti deboli. Questi sono principalmente da imputare alla semplicità di Golang, che pur essendo da una parte il suo maggiore punto di forza, dall’altra ne determina la mancanza di determinate sfaccettature che alcuni sviluppatori apprezzano negli altri linguaggi di programmazione.
Prima fra tutti è sicuramente da nominare la mancanza di tipi generici nella libreria standard, quindi non si ha la possibilità di inserire parametri personalizzati per i tipi di dati. Chi perciò è un sostenitore della programmazione con i tipi ed è ad esempio abituato all’uso di Generics su Java, per ora deve rinunciare a una feature simile su Go; tuttavia il team di Go non esclude l’implementazione di tipi generici in future versioni del linguaggio.
Molti sviluppatori avranno bisogno di un po’ di tempo per abituarsi alla rinuncia di classi, ereditarietà e costruttori. Un’altra feature di Go non sempre desiderata è rappresentata dalla scomparsa automatica di file di importazione non attivi. Altri linguaggi puntano in questo caso alla possibilità di “commentare” i corrispondenti componenti, di modo da mantenere invariato il codice di programmazione, malgrado l’inattività.
Un altro svantaggio di Golang rispetto ai linguaggi più antichi come C, C++ e simili trova le sue radici nella storia ancora molto recente del linguaggio. Così dispone di un arsenale essenzialmente più piccolo di pacchetti implementati in modo standard e pronti per l’importazione. Inoltre per Go si trovano in rete anche meno manuali, tutorial, ecc. rispetto ai linguaggi di programmazione affermati.
Vantaggi e svantaggi di Golang a confronto
I punti di forza di Golang | I punti deboli di Golang |
Multipiattaforma | Assenza di tipi generici |
Sintassi molto semplificata | Orientata agli oggetti solo parzialmente |
Gestione automatica del processo di memorizzazione (Garbage Collection) | Supporto di IDE (Integrated Development Environments) da potenziare |
Formattazione unitaria del codice | Offerta proporzionalmente ridotta di librerie e pacchetti offerti da terze parti |
Processo di importazione semplice | Passaggio faticoso dai linguaggi di programmazione classici, orientati agli oggetti, come Java e C++ |
Più valori di ritorno per funzioni e metodi | Per ora pochi tutorial, esperti, ecc. |
Correzione del codice automatica (gofmt) | |
Concorrenza | |
Libreria standard ampia (specialmente per HTTP e compiti di rete) |
Conclusione: a chi conviene imparare a utilizzare Golang?
Dopo aver messo in luce i fondamenti e le particolarità di questo linguaggio di programmazione open source in questo articolo, alla fine rimane soprattutto una domanda: chi dovrebbe prendersi la briga di imparare a programmare con Golang? Come spesso accade, anche in questo caso non si può dare una risposta unica e definitiva, poiché Go non si presenta come un sostituto di tutti i linguaggi di programmazione usati finora, ma come una possibile alternativa.
Grazie a un’efficienza e a una performance eccezionale, che si riflette anche nelle applicazioni programmate con questo linguaggio, Go risulta una scelta interessante in particolar modo nell’ambito business e server. Maggiore è il codice da scrivere e compilare, più emergono i suoi vantaggi.
Per i neofiti della programmazione il processo di apprendimento è spesso più semplice, dato che beneficiano della semplicità di questo linguaggio moderno, mentre per gli sviluppatori esperti può risultare frustrante a causa delle similitudini con C, Java e simili. Una volta che sono state superate le difficoltà di orientamento, anche i coder di vecchia data impareranno ad apprezzare i vantaggi di Golang. Visto che il mercato di esperti Go non è ancora così grande, essere competenti nel linguaggio di programmazione di Google dà in ogni caso una grande opportunità, per esempio nel caso di una candidatura per un posto come sviluppatore o per la realizzazione di un nuovo progetto.