Proč se naučit Go

Gopher: maskot Go

Stará čínská hra Go má jednoduchá pravidla, ale je potřebná mnohem vyšší úroveň strategického myšlění a k výhře vedou miliony cest. V naší kultuře je méně populárnější, než šachy.

Go je i programovací jazyk, za kterým stojí mocný Google, mezi jehož autory jsou i legendární Ken Thompson, nebo Rob Pike. Program v Go jde spustit „interpretovaně“ i kompilovaně, tudíž jej osobně vnímám i jako konkurenta (mého oblíbeného) Pythonu, PHP, Node.js, či Ruby (Ruby on Rails), tj. na místě scriptovacího jazyka, či backendu webových aplikací, ale nejen tam.

Reklama

Rob Pike na videu vysvětluje, proč vytvořili nový jazyk:

Za posledních několik let se vynořilo několik nových programovacích jazyků. Mozilla přišla s jazykem Rust, Google přišel s Dartem (lepším nástupcem obligátního JavaScriptu, s možností kompilace do JS) a nízkoúrovňovým Go. Našel bych i další. Osobně nevidím kolem žádného takovou „hype vlnu“, jaká byla nedávno kolem Ruby.

Go; snadněji se hledá pod jménem golang; je kompilovaný i interpretovaný, imperativní a staticky typovaný jazyk; vytvořený podle potřeb Google a používaný pro psaný psaní serverového software, jenž předtím vyvíjeli v jazycích C++ a Java. Server není jediné místo, kde obstojí, stejně dobře poslouží i pro psaní desktopové aplikace. Na GitHubu je dnes již velmi pestrá nabídka knihoven a nástrojů.

Občas je jazyk popisován jako „nové C“, ale jak jsem napsal výše, tak jej spíše vnímám jako konkurenci jiným jazykům. Syntaxe má něco málo z C, ale mnohem viditelněji mi připomíná jazyk Lua a vidím i silný vliv jazyků Niclause Wirtha (Pascal, Modula a Oberon); stopy formálního jazyka CSP (reálně implementovaného v Squaku, nebo Alefu) pozná asi jen málokdo.

Příznivci jazyků C a C++ prominou, sestavení projektu (který potřebuje knihovny) a jeho následná kompilace je peklo. Go řeší knihovny mnohem elegantnějším způsobem, není potřeba znát další metajazyk (třeba M4). Náročnost kompilace, s přibývajícím počtem includovaných knihoven, roste lineárně, kdežto v C/C++ je závislost nejspíše exponenciální. Ale nehodlám C/C++ hanit, protože na nejnižší úrovni (třeba jádro OS) je snad nenahraditelné.

Striktní styl; interpretovaný i kompilovaný jazyk

Jazyky „C rodiny“, respektive programátoři v nich, mají volné ruce ve způsobu zápisu. Například otevírací složenou závorku bloku někdo píše na stejný řádek, kde je hlavička funkce, nebo podmínka, jiný programátor na samostatný řádek a další oba styly mixuje (pod hlavičku funkce, ale u podmínky/cyklu na stejný řádek). V jazyce Go se píše striktně na stejný řádek, kde končí hlavička funkce, nebo kde je podmínka. Případné nesrovnalosti napraví překladač (go fmt srcname.go).

Oficiální distribuce jazyka umí zkompilovat zdrojové kódy (go build scrname.go), ale umí program spustit i interpretovaně (go run scrname.go). I díky statickému typování je rychlejší, než klasické interpretované/scriptovací jazyky. Dualitu dovoluje maximálně jednoduchý a velmi rychlý kompilátor, bez složitého preprocesoru, maker a složitého pseudokódu intepretovaného před každou kompilací.

Odkazy

  • Učebnice a videokurz (v bootcamp) jazyka Go.
  • „The Go Programming Language“ je učebnice, kterou jednoznačně doporučuji. Není jedinou, jíž mám.
  • Go libraries and apps – rozcestník knihoven a aplikací.
  • Awesome Go – další rozcestník na knihovny a aplikace.
  • Diskusní skupina golang-nuts kde se diskutují začátečnicná i pokročilá témata. Snad jediná opravdu živá diskuse kolem jazyka, kterou jsem našel.
  • Podcast Go Time vychází týdně a vedle zajímavých hostů jsou probírány i novinky uplynulého týdne.

Ano pro Go

  • Není to jazyk objektový, jak je OOP zažité z jiných jazyků, ale autoři jsou „zkušení pardálové“, takže není nutno filosofovat nad správností jejich rozhodnutí.
  • Je dostatek knihoven pro desktopové i serverové aplikace.
  • Je dobře připraven pro paralelizaci (concurrency). Vytvoření vícevláknové aplikace je jednoduché.
  • Funguje jako klasicky kompilovaný jazyk, ale program je možné spustit i bez předchozí kompilace (zkopiluje se při spuštění a dál běží jen zkompilovaná binárka). Mě tak trochu nahrazuje i Bash.
  • Je dobře dokumentovaný a je open source.

Pokud jsem správně zahlédl jména v konferenci golang-nuts tipuji, že je to jeden z jazyků používaných v CZ.NIC.

Mě osobně jazyk Go oslovil a mám pro něj využití.

BTW

Chvíli jsem koketoval s myšlenkou na jazyk Rust, ale nenašel jsem na něco smysluplného, proč radši „neoprášit“ znalosti C/C++. Za sebe bych mohl podepsat kritiku jazyka Rust, jež predikuje „nesmrtelnost“ C/C++.

Pochopitelně jazyky Python, PHP a třeba i Pascal neopouštím, pro každý mám využití.

Komentáře

4 komentáře: „Proč se naučit Go“

  1. Tomáš Dvořák avatar

    Jen k té interpretaci – ‚go run source.go‘ provede nejdříve kompilaci(go build) a pak program spustí. Kompilace je ale tak rychlá, že celá operace působí jako u běžných interpretovaných jazyků.

    Sám vidím pro Golang využití tam, kam bych se dříve snažil natlačit JS/Node.js. Jednoduché API, crawler, CLI aplikace… Kód mi přijde čistší, srozumitelnější a přehlednější. Nástroje kolem Go zas nabízí snadnou cestu k testům, code coverage, dokumentaci, standardnímu formátování, cross kompilaci. Trochu jsem bojoval s managementem závislostí a zakotvil u http://glide.sh/ .

    1. Marek Olšavský avatar

      [Tomáš Dvořák] Nerozebíral jsem, ale asi jsem to nenapsal dost zřejmě. Je to výhodná vlastnost, nemusím 2 kroky. „Build“ pro distribuci, „run“ pro ladění a moje použítí, kde mám Golang nainstalovaný. Jediné co mě trochu štve, je výrazné zaostávání gccgo za go samotným. Pokud chci nechat gcc systémové, tak téměř nemám možnost jej použít pro kompilaci go, přestože pro distribuci je optimalizace lepší.

      Já Golangem nahrazuji část Python scriptů, co běží u zákazníků. Ne že bych nebyl ochoten jim dát přístup do zdrojových kódů, ale nemám chuť se hádat s adminem, že chtěl něco zkusit a šáhnul do src, takže na jejich hw je binárka (ano i Python je možné zkompilovat, ale „auvajs“).

      BTW: Děkuji za tip na Glide.

      1. Tomáš Dvořák avatar

        Jasně, rozumíme si, jen jsem chtěl uvést na pravou míru tu „interpretaci“ 🙂

        Ta distribuce hotových binárek je věc, co by neměla zapadnout a měli bychom ji zdůraznit. Ze zdrojáků na linuxové mašině vygeneruji jeden spustitelný soubor pro windows (nebo linux, mac, linux-arm, https://golang.org/doc/install/source#environment).

        Na cílovém stroji tak není třeba žádné runtime, interpreter, kompilátor, nic. Stačí soubor překopírovat a spustit. To je ohromná úleva oproti javě, pythonu, nodu…

        1. Marek Olšavský avatar

          Ale díky za trknutí, někdy se vyjádřím dost špatně. Osobně mě zatím Go baví. Je poznat zkušená ruka matadorů, kteří mají něco za sebou.

          Jinak náš projekt obnáší web control panel, kde může správce nastavit co potřebuje, čtení a zápis dat přes modbus (měřáky i relátka jsou na RS485), komunikace se vzdáleným serverem přes ftps, nebo scp, a nakonec je na některých lokalitách i ovládání SMSkou (takže GSM modul). Aktuálně je projekt ve dvou binárkách (web a „to ostatní“).