Zėŋōfōbìå

25 novembre 2009

Google inciampa sul linguaggio GO

Filed under: Linguaggi — Zeno @ 18:19

Google è probabilmente l’azienda che ha rivoluzionato la concezione che abbiamo dei computer, di internet e del business dotcom.

Il motore di ricerca di google ha subito mostrato di essere straordinariamente superiore a tutti i concorrenti, divario che ha saputo mantenere intatto negli anni, il servizio di posta che offre è straordinario, superiore a moltissimi prodotti commericiali, l’ambiente office che regala preoccupa Microsoft, che si sente minare uno dei capisaldi del suo predominio informatico.

Android è un’altra invenzione eccellente, molti produttori di telefoni si stanno muovendo in quella direzione, rinunciando ai sistemi proprietari, snobbando Microsoft Mobile.

Quando ho letto che Google annunciava l’uscita di un nuovo linguaggio, il Go, per l’appunto, mi sono fermato, mi sono seduto comodo e mi sono preparato mentalmente a rinunciare a tutto ciò che so di programmazione in C# per passare a qualcosa che certamente sarebbe stata una pietra miliare nella storia dei linguaggi.

E invece la mia delusione è stata pungente.

Go si presenta come un linguaggio divertente che si compila velocemente.

Ora, io mi chiedo, chi, al giorno d’oggi, si preoccupa davvero della velocità di compilazione di un progetto, tanto da dover sottolineare la cosa all’inizio di ogni presentazione?

Si propone ai programmatori C++ come soluzione più efficace: infatti non ha le classi, né la deallocazione esplicita della memoria, né la programmazione generica, né la function overloading, né i const, che sono notoriamente tutti concetti troppo difficili, per poter essere usati con giudizio.

Linguaggio tipato staticamente, efficiente, memory-safe (ha i puntatori ma non permette di fare aritmetica).

La sintassi e simile al C, solo più confusa, se possible. Le signature delle funzioni sono orrende, ci sono ancora i puntatori.

Punto e virgola e parentesi possono essere messe, ma non sono necessarie. (Allora perché metterle?)

L’unico comando per effettuare cicli è il for del c, abusato oltre la ragionevolezza.

Per inizializzare nuovi elementi ci sono due modi: new e make, a seconda del tipo di elemento che si voglia istanziare (puntatore o riferimento). Ci sono tre operatori uguale, per distinguere l’assegnamento, il binding e il confronto.

Non è un linguaggio ad oggetti, ma nemmeno funzionale: è imperativo. Siamo nel 2009 e Google ha prodotto un nuovo linguaggio imperativo…

Tuttavia al di la delle polemiche generate dalla delusione, qualcosa di buono c’è.

E’ un linguaggio che pone un’attenzione particolare alle problematiche della programmazione parallela in ambienti client server di rete, nasce dall’esigenza di incorporare nel linguaggio stesso tecniche che altrimenti richiederebbero librerie complesse e meccanismi non sempre fluidi e semplici.

Offre così delle primitive del linguaggio (go, appunto) per costruire dei thread leggerissimi che vengono gestiti autonomamente, grazie al garbage collector e alla sincronizzazione fornita dai channels.

Linguaggio noioso, troppo ispirato al C per essere ancora credibile, di certo non innovativo, dispone però di qualche caratteristica interessante: ha le closure, le slice, le map, le gorutines e i channels.

Le slice sono partizioni di liste, con una sintassi molto comoda è possibile estrarre da una lista una fetta, specificando punto di origine e di fine.

Le mappe sono i dizionari di C#, le hashtable di java.

Le gorutines sono dei microthread leggerissimi che si possono invocare con estrema facilità. Non dispongono di sincronia.

I channels sono dei canali sincronizzati che possono essere usati per mettere in comunicazione diverse goroutines. Si possono pensare come a delle pipe unix tipate con un buffer dimensionabile in fase di inizializzazione.

Segue un esempio di codice:

var sem = make(chan int, MaxOutstanding)

func handle(r *Request) {
    sem <- 1;    // Wait for active queue to drain.
    process(r);  // May take a long time.
    <-sem;       // Done; enable next request to run.
}

func Serve(queue chan *Request) {
    for {
        req := <-queue;
        go handle(req);  // Don't wait for handle to finish.
    }
}

la variabile sem è un channel, che viene usato come semaforo, la funzione handle viene invocata da server come goroutine (comando go).

Trovo interessante includere i channels e le goroutines nel linguaggio, siamo ormai immersi nei multicore e nei sistemi multiprocessore, non e’ piu’ possibile ignorarlo.

Pero’ mi chiedo: Perché Google ha impegnato delle risorse per produrre un linguaggio così brutto e già così vecchio?

Questo progetto e’ partito dalla volonta’ di un paio di programmatori di scrivere un linguaggio nuovo, solo un anno dopo hanno potuto dedicarsi a tempo pieno allo sviluppo.    La sensazione che ho e’ che i programmatori che l’hanno definito non siano degli esperti di linguaggi. Ci sono alcune idiosincrasie quasi buffe: iota, per esempio. E’ un artificio per definire le costanti, un  esempio naif di metaprogrammazione. Sarebbe stato meglio fornire un metalinguaggio piu’ articolato, per evitare di incappare nel rischio di dover implementare qualche formadi reflection.  (costosissima in termini di tempi di compilazione! ;)

Certo, e’ un progetto giovane. Non c’e’ una roadmap, non ci sono i generics, ma potrebbero esserci, un giorno. Stessa cosa vale per le eccezioni. Probabilmente,  essendoci le closure, ci potranno essere le funzioni anonime (lambda),  e chissa’ cos’altro.

Il problema e’ che il linguaggio e’ nato sporco, sara’ difficile renderlo elegante.

(EDIT: Scrivevo che avrebbero potuto usare Java, ma JP mi ha fatto notare che anche Java e’ della concorrenza)

Annunci

6 commenti »

  1. Io credo che abbiano definito Go per il semplice motivo che serve a loro.

    Scrivono principalmente software di sistema (server, per lo piu’) e proprio in quel tipo di progetti servono tutte le funzionalita’ integrate in Go.

    I tempi di compilazione, per quanto a te possano sembrare qualcosa di cui non preoccuparsi, evidentmente per loro sono ancora un grosso problema… e Go e’ dannatamente veloce!

    Commento di nexus80 — 26 novembre 2009 @ 10:36

  2. P.S. Se noti tutta la struttura sintattica del linguaggio e’ studiata apposta per rendere la compilazione piu’ rapida possibile, tant’e’ che Go puo’ essere compilato senza una symbol table.

    Commento di nexus80 — 26 novembre 2009 @ 10:38

  3. Sono perplesso, davvero. Cosa devono compilare? Quanto spesso? L’unica cosa folle che mi viene in mente è qualche progetto genetico, ma converrebbe, in quel caso, un linguaggio interpretato.
    Che vogliano compilare su microcontrollori?
    Non so.
    Mi sembra di vedere un linguaggio anni settanta.
    Possibile che il compilatore stia dalla parte del computer e non del programmatore?

    Commento di Fabrizio — 26 novembre 2009 @ 11:47

  4. Ciao Zeno.

    Pensando a Go mi vengono in mente due motivazioni/cause per spiegarne l’introduzione:
    – “accidentale”: è un linguaggio nato prima come progetto durante l’Innovation Time Off di qualcuno e poi assurto al rango di “progetto valido” in Google;
    – “pianificata”: è un linguaggio nato per rimpiazzare internamente il C++, per creare cioè qualcosa di utilizzabile nella nuova infrastruttura che Google sta sviluppando. Go si potrebbe quindi inserirsi a livello di backend e lasciare a Python il ruolo di linguaggio di frontend. In questo caso Google avrebbe tutto in mano sua (Java è di Sun) e moderno/adatto ai suoi scopi (il C++ è vecchiotto e rispetto ad altri linguaggi molto più complicato da usare bene)

    In un caso o nell’altro, a meno di novità significative prossime e venture (Go è appena nato!), non è garantito che si diffonda fuori da Google stessa, nonostante il colosso che l’ha creato e la licenza Open Source…

    Allo stato attuale dello sviluppo, mi pare un po’ bruttino tecnicamente, eccettuata l’integrazione di channel e goroutine, che mi sembra un’idea interessante (viviamo in un’epoca di multicore/multithread dopotutto) per un linguaggio di questo tipo.

    Personalmente, restando sui linguaggi compatti, avrei visto meglio un compilatore nativo per Lua…

    In ogni caso, bel post!

    Ciau! ^^

    Commento di jp — 26 novembre 2009 @ 17:28

  5. Ciao Max, Ciao JP,
    ho provato a leggere in rete un po’ di critiche e sostanzialmente ognuno ha qualcosa da ridire. A tutti appare, per molte ragioni, un linguaggio sporco. Qualcuno lo rifiuta, qualcuno lo accetta. La comunita’ comunque si e’ mossa, la ml del linguaggio e’ gia’ a 160 msg al giorno.
    Vediamo, finita la curva ascendente dell’hype che ne sara’.
    Nel frattempo ho aggiornato la mia Suse 10.2 a 11.2 (liscio liscio) e ho installato il compilatore Go.
    Faro’ qualche esperimento, per vedere se scrivere codice in quel linguaggio mi fa incazzare piu’ o di meno che scrivere in brainfuck. O in C++. ;-)

    Commento di Fabrizio — 27 novembre 2009 @ 8:10

    • Tra i commenti interessanti direi, ce n’e’ uno di MarkCC, uno sviluppatore di Google:
      http://scienceblogs.com/goodmath/2009/11/googles_new_language_go.php

      The overall structure of programs and modules is excellent. But it’s got some ugliness. Some of the ugliness is fixable, and some of it isn’t. On balance, I think it’s a really good language, but it could have been a lot better.

      Mah.
      Sicuramente si puo’ rendere migliore, forse con l’aiuto della comunita’ la versione 2.0 potrebbe diventare molto piu’ pulita, purche’ rinunci alla compatibilita’.

      Commento di Fabrizio — 27 novembre 2009 @ 11:20


RSS feed for comments on this post. TrackBack URI

Rispondi

Effettua il login con uno di questi metodi per inviare il tuo commento:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Blog su WordPress.com.

%d blogger hanno fatto clic su Mi Piace per questo: