C on Venuksesta, Go on Marsista



Tällä viikolla Google julkaisi Go-kielestään version 1.0 ensimmäisen julkaisukandidaatin; tuote kulkee tuttavallisesti nimellä Go 1 RC1. Lopullinen 1.0 versio tulee kevään aikana. Optimistisesti voisi sanoa, että Go pääsee versioon 1.0 alle vuoden ikäisenä. Marsilaisen vuoden, nimittäin.

Go tuntuu marsilaisten versiolta C:stä. Olen käyttänyt Gota viime aikoina harrastusohjelmointiin. Vanhakin koira voi oppia uusia ohjelmointikieliä, mutta kyllä se pari kertaa haukkuu oudosti sijoitetuille suluille tai erikoisille vaatimuksille.

Teemu kommentoi tuoreeltaan blogissamme vastasyntynyttä Gota. Hänen analyysinsä keskittyi itse kielen ominaisuuksiin. Parametrisoidut tyypit puuttuvat. Slicet ja mapit käyttäytyvät vieraalla tavalla. Nollaosoitin on sallittu.

Käytännön tasolla en ole kuitenkaan näihin rajoituksiin törmännyt. Jotkin tyypit ovat tasa-arvoisempia kuin toiset, mutta itse sopeuduin siihen ensimmäisen sadan koodirivin jälkeen. Kerran huomasin toivovani lampun hengeltä tyyppiparametreja… mutta hetken pohdinta osoitti tämänkin tarpeettomaksi.

Go:n erikoiset valinnat vaikuttavat käytännön työssä perustelluilta, vaikka ne paperilla pelottaisivatkin. Eniten käytännön työtä rajoitti kehno työkalusetti. Puoli (Maan) vuotta vanhassa stabiilissa versiossa (r60) oli käytössä vielä alkuperäinen gomake/goinstall/gotest -työkalusarja. Nämä olivat hieman kankeita; ne nojasivat määrämuotoisiin Makefileihin, jotka saivat omat karvani pystyyn. En minä Makea vastaan sinällään ole. Boilerplate-Makefile minua ärsyttää! Antakee armoa, C-mestarit!

Go 1 yhdistää tyypilliset työvaiheet go-komennon alle. Makefilet ovat tarpeettomia, sillä go-komento analysoi kooditiedostoja suoraan. Se kääntää, testaa, benchmarkaa, dokumentoi ja asentaa. Eikä siinä vielä kaikki! GOPATH-ympäristömuuttujan kanssa se tarjoaa yksinkertaisen (mutta riittävän) mekanismin projektin kirjastojen isolointiin.

Pieni esimerkki

Go-työkalu odottaa tietynlaisen hakemistorakenteen (GOPATH osoittaa workspace-hakemistoon):

  • workspace/
    • src/
      • paketti1/*.go
      • paketti2/*.go
      • paketti3/alipaketti/*.go
    • pkg/
    • bin/

Ohjelmoijan tarvitsee välittää vain src-hakemistosta. Go-työkalu luo sekä bin- että pkg-hakemistot. Ensin mainittuun asennetaan binäärit ja jälkimmäiseen käännetyt kirjastot.

Näillä oletuksilla testaaminen sujuu komennolla

go test paketti1 paketti2 paketti3/...

Tällöin työkalu kääntää lähdekoodin ja testit ja ajaa syntyneen testibinäärin. Go-kääntäjä on niin nopea, että koodauksen ja testauksen välinen feedback-looppi pysyy tehokkaana.

Pelkkä kääntäminen tapahtuu komennolla

go build <paketti>

Useammin kuitenkin voi suoraan ajaa komennon go install <paketti>, joka kääntää paketit ja asentaa ne bin- ja pkg-hakemistoihin.

Työkalu nojaa pitkälti konventioihin. GOPATH on käytännössä ainoa konfiguraatio, mitä työkalun käyttöön tarvitaan. Erittäin käyttäjäystävällistä!

Muuta miellyttävää

Testauskirjaston mukana tulee yksinkertainen (mutta riittävä) benchmark-työkalu. Suorituskykytestejä on yhtä suoraviivaista tehdä kuin yksikkötestejä. Helppous johtaa siihen, että teen näitä benchmarkkeja, mikä johtaa suorituskyvyn seuraamiseen, mikä johtaa suorituskyvyn parantumiseen. Lordi Kelvinin kuuluisa lause pätee: “Jos asiaa ei voi mitata, sitä ei voi parantaa”.

Rubyn DSL-pohjaisten testityökalujen syntaktiseen eleganssiin Go:n testing-kirjasto ei pääse. Eri XUnit-kirjastojen käyttäjät ovat kuitenkin kuin kotonaan.

Kääntäjä on miellyttävän tosikko. Esimerkiksi käyttämätön muuttuja ei johda varoitukseen, vaan siitä tulee suoraan virhe. Kääntäjän virheilmoitukset ovat pääasiassa ymmärrettäviä ja kohdistuvat oikeille riveille.

Googlen App Engine tarjoaa myös Go-ajoympäristöä. Ympäristö on rajoitettu, kuten kaikki GAE-ympäristöt. Kiusallisimmat rajoitukset koskevat rinnakkaisohjelmoinnin gorutiinien niputtamista yhteen säikeeseen. Tämä tekee gorutiineista hitusen raskaampia kuin mitä niiden pitäisi.

GAE-ympäristön suorituskyvystä on toistaiseksi vielä vaikea löytää numerotietoja. Seuraavat havainnot pohjaavat IRC-anekdootteihin ja sähköpostilistan tarinoihin. Suorituskyky on samalla tasolla Java-ympäristön kanssa. Muistinkäyttö pysyy pienenä ja erityiskehuja annetaan instanssien käynnistysajalle. Uudet instanssit käynnistyvät 50-100 millisekunnissa.

Mutuni vihjaa, että GAE-Go sopisi hyvin SOA-tyyppiseen pienistä palveluista koostuvaan arkkitehtuuriin.

Loppufiilikseni. Go 1 vaikuttaa erittäin lupaavalta. Työkalut ovat käyttökelpoisia. Dokumentaatio on kypsynyt. Windowsiakin tuetaan. Go ei koskaan tule olemaan uusi Java, mutta veikkaan sen valtaavan itselleen muutaman nichen. Jos olet etsinyt tekosyytä kokeilla Gota, kannattaa aloittaa Go 1:stä.

// Kuva: Flickr CC, Cyril Rana.

Tämän artikkelin on kirjoittanut Antti Rasinen ja sitä ovat sittemmin muokanneet muut Codenton työntekijät.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *