Programování

K čemu je jazyk Go opravdu dobrý?

Během devíti let v divočině se jazyk Go společnosti Google, neboli Golang - s verzí 1.13 vydanou v září 2019 - vyvinul z kuriozity pro alfa geeky, aby se stal bitevním programovacím jazykem za některými z nejdůležitějších světových cloudové projekty.

Proč si vývojáři takových projektů jako Docker a Kubernetes vybrali Go? Jaké jsou definující charakteristiky Go, jak se liší od ostatních programovacích jazyků a jaké typy projektů je nejvhodnější pro stavbu? V tomto článku prozkoumáme sadu funkcí Go, optimální případy použití, opomenutí a omezení jazyka a to, odkud může Go odtud jít.

Jazyk Go je malý a jednoduchý

Go, neboli Golang, jak se mu často říká, vyvinuli zaměstnanci společnosti Google - hlavně dlouholetý Unixový guru a význačný inženýr Google Rob Pike - ale nejedná se striktně o „projekt Google“. Go je spíše vyvíjen jako komunitní projekt s otevřeným zdrojovým kódem, v jehož čele stojí vedení, které má silné názory na to, jak by měl být Go používán a jakým směrem by se měl ubírat jazyk.

Go by měl být jednoduchý na učení, přímý na práci a snadno čitelný ostatními vývojáři. Go nemá velkou sadu funkcí, zvláště ve srovnání s jazyky jako C ++. Go ve své syntaxi připomíná C, což umožňuje dlouholetým vývojářům C relativně snadné učení. To znamená, že mnoho funkcí Go, zejména jeho funkce souběžnosti a funkčního programování, se vrací k jazykům, jako je Erlang.

Jako jazyk typu C pro budování a údržbu multiplatformních podnikových aplikací všeho druhu má Go s Java mnoho společného. A jako prostředek umožňující rychlý vývoj kódu, který může běžet kdekoli, můžete nakreslit paralelu mezi Go a Pythonem, i když rozdíly jsou mnohem větší než podobnosti.

Jazyk Go má pro každého něco

Dokumentace Go popisuje Go jako „rychlý, staticky psaný, kompilovaný jazyk, který se cítí jako dynamicky psaný, interpretovaný jazyk.“ Dokonce i velký program Go se zkompiluje během několika sekund. Navíc se Go vyhne velké části režie souborů a knihoven ve stylu C.

Go usnadňuje vývojářům život mnoha způsoby:

  • Pohodlí. Go byl ve srovnání se skriptovacími jazyky, jako je Python, ve své schopnosti uspokojit mnoho běžných programovacích potřeb. Některé z těchto funkcí jsou zabudovány do samotného jazyka, například „goroutines“ pro souběžné chování a chování podobné vláknům, zatímco další funkce jsou k dispozici ve standardních knihovních balíčcích Go, jako je Go balíček http. Stejně jako Python, Go poskytuje funkce automatické správy paměti včetně odvozu odpadu.

    Na rozdíl od skriptovacích jazyků, jako je Python, se kód Go kompiluje do rychle běžícího nativního binárního souboru. A na rozdíl od C nebo C ++ se Go kompiluje extrémně rychle - dostatečně rychle, aby se práce s Go cítila spíše jako práce se skriptovacím jazykem než s kompilovaným jazykem. Systém sestavení Go je dále méně složitý než systémy jiných kompilovaných jazyků. Vytvoření a spuštění projektu Go vyžaduje několik kroků a malé účetnictví.

  • Rychlost. Go binární soubory běží pomaleji než jejich protějšky C, ale rozdíl v rychlosti je u většiny aplikací zanedbatelný. Výkon Go je pro drtivou většinu práce stejně dobrý jako C a obecně mnohem rychlejší než jiné jazyky známé rychlostí vývoje (např. JavaScript, Python a Ruby).
  • Přenosnost. Spustitelné soubory vytvořené pomocí řetězce nástrojů Go mohou stát samostatně, bez výchozích externích závislostí. Řada nástrojů Go je k dispozici pro širokou škálu operačních systémů a hardwarových platforem a lze ji použít ke kompilaci binárních souborů napříč platformami.
  • Interoperabilita. Go poskytuje všechny výše uvedené, aniž by obětoval přístup k základnímu systému. Programy Go mohou komunikovat s externími knihovnami jazyka C nebo provádět nativní systémová volání. V Dockeru například Go rozhraní s nízkoúrovňovými funkcemi Linuxu, cgroups a jmennými prostory, aby fungovalo kouzlo kontejneru.
  • Podpěra, podpora. Řada nástrojů Go je volně dostupná jako binární systém Linux, MacOS nebo Windows nebo jako kontejner Dockeru. Go je ve výchozím nastavení součástí mnoha populárních linuxových distribucí, jako je Red Hat Enterprise Linux a Fedora, což usnadňuje nasazení zdroje Go na tyto platformy. Podpora Go je také silná v mnoha vývojových prostředích třetích stran, od Microsoft Visual Studio Code po ActiveState's Komodo IDE.

Jazyk Where Go funguje nejlépe

Žádný jazyk není vhodný pro každou práci, ale některé jazyky jsou vhodné pro více pracovních míst než jiné.

Go svítí nejjasněji pro vývoj následujících typů aplikací:

  • Distribuované síťové služby.Síťové aplikace žijí a umírají souběžně a nativní funkce souběžnosti Go - zejména goroutiny a kanály - jsou pro takovou práci velmi vhodné. Následkem toho je mnoho projektů Go pro sítě, distribuované funkce a cloudové služby: API, webové servery, minimální rámce pro webové aplikace a podobně.
  • Cloudový nativní vývoj.Díky souběžnosti a síťovým funkcím Go a vysoké míře přenositelnosti je vhodný pro vytváření nativních cloudových aplikací. Ve skutečnosti byl Go použit k vytvoření několika základních kamenů cloudového nativního výpočtu, včetně Docker, Kubernetes a Istio.
  • Náhrady za stávající infrastrukturu.Velká část softwaru, na kterém jsme závislí pro internetovou infrastrukturu, stárne a prochází exploity. Přepisování takových věcí v Go poskytuje mnoho výhod - lepší bezpečnost paměti, snadnější nasazení napříč platformami a čistou kódovou základnu pro podporu budoucí údržby. Nový server SSH s názvem Teleport a nová verze protokolu Network Time Protocol jsou psány v Go a jsou nabízeny jako náhrada za jejich konvenční protějšky.
  • Nástroje a samostatné nástroje.Go programy kompilujte do binárních souborů s minimálními externími závislostmi. Díky tomu jsou ideální pro vytváření nástrojů a dalších nástrojů, protože se spouštějí rychle a lze je snadno zabalit pro další distribuci.

Přejít na jazyková omezení

Goův názorný soubor funkcí přitáhl chválu i kritiku. Go je navržen tak, aby chyboval na straně toho, že je malý a snadno srozumitelný, přičemž některé funkce jsou záměrně vynechány. Výsledkem je, že některé funkce, které jsou v jiných jazycích běžné, jednoduše v Go nejsou záměrně k dispozici.

Jednou z takových funkcí jsou obecné, které umožňují funkci přijímat mnoho různých typů proměnných. Go nezahrnuje generika a správci jazyka jsou proti jejich přidávání na základě toho, že generika by ohrozila jednoduchost jazyka. Toto omezení je možné obejít, ale mnoho vývojářů stále svědí, když vidí, že se do Go přidávají nějakým způsobem generika. Byl vznesen alespoň jeden návrh na implementaci generik v Go, ale nic nebylo vytesáno do kamene.

Další nevýhodou Go je velikost generovaných binárních souborů. Go binární soubory jsou ve výchozím nastavení staticky kompilovány, což znamená, že vše potřebné za běhu je zahrnuto v binárním obrazu. Tento přístup zjednodušuje proces sestavení a nasazení, ale za cenu jednoduchého „Hello, world!“ váží kolem 1,5 MB v 64bitovém systému Windows. Tým Go pracuje na snižování velikosti těchto binárních souborů s každým následným vydáním. Je také možné zmenšit binární soubory Go pomocí komprese nebo odebráním ladicích informací Go. Tato poslední možnost může fungovat lépe pro samostatné distribuované aplikace než pro cloudové nebo síťové služby, kde je užitečné mít informace o ladění, pokud služba selže na místě.

Ještě další nabízenou funkci Go, automatickou správu paměti, lze považovat za nevýhodu, protože sběr odpadu vyžaduje určité množství režie zpracování. Podle návrhu Go neposkytuje manuální správu paměti a sběr odpadu v Go byl kritizován za to, že se nezabýval dobře druhy paměti, které se objevují v podnikových aplikacích. Pozitivní je, že Go 1.8 přináší mnoho vylepšení správy paměti a uvolňování paměti, které snižují časovou prodlevu. Samozřejmě vývojáři Go mají schopnost používat manuální přidělování paměti v rozšíření C nebo prostřednictvím knihovny pro ruční správu paměti od jiného výrobce.

Kultura softwaru kolem vytváření bohatých grafických uživatelských rozhraní pro aplikace Go, například v desktopových aplikacích, je stále rozptýlená.

Většina aplikací Go jsou nástroje příkazového řádku nebo síťové služby. To znamená, že různé projekty se snaží přinést bohaté grafické uživatelské rozhraní pro aplikace Go. Existují vazby pro rámce GTK a GTK3. Další projekt je určen k poskytování uživatelských rozhraní nativních pro platformu, i když se spoléhají na vazby C a nejsou napsány v čistém Go. A uživatelé Windows si mohou vyzkoušet procházky. Ale v tomto prostoru se neobjevil žádný jasný vítěz ani dlouhodobá bezpečná sázka a některé projekty, jako je pokus Google o vybudování knihovny GUI pro různé platformy, šly stranou. Jelikož je Go designově nezávislý na platformě, je nepravděpodobné, že by se některý z nich stal součástí standardní sady balíčků.

Ačkoli Go umí mluvit s nativními systémovými funkcemi, nebyl navržen pro vytváření nízkoúrovňových systémových komponent, jako jsou jádra nebo ovladače zařízení nebo vestavěné systémy. Koneckonců, běhový modul Go a garbage collector pro aplikace Go jsou závislé na základním operačním systému. (Vývojáři, kteří se zajímají o špičkový jazyk pro tento druh práce, by se mohli podívat do jazyka Rust.)

Jděte na jazykové futures

Další fáze vývoje Go může být poháněna spíše potřebami a potřebami jeho vývojářské základny. Myslitelé Go změní jazyk tak, aby lépe vyhovoval tomuto publiku, než aby šli jen tvrdohlavým příkladem. Jinými slovy, Go může získat funkce, které pro něj původně nebyly určeny, například generické.

Je jasné, že vývojáři Golangu tyto věci chtějí. Průzkum uživatelů Go 2018 2018 umístil generika mezi tři hlavní výzvy v cestě širšího přijetí Go spolu s lepší závislostí a správou balíčků. A stávající návrh na GitHubu pro generika zůstává aktivní jako návrh pro Go 2.x. Změny, jako jsou tyto, mohou pomoci Go zaujmout ústřední místo v podnikovém vývoji, kde v současné době vládne Java, JavaScript a Python.

I bez větších změn můžeme očekávat zvýšené využití Go pro projekty přestavby infrastruktury, jak je popsáno výše pro nahrazení SSH a NTP, a jako součást vícejazyčných projektů.

Rozmnožily se také implementace řetězce nástrojů Go od třetích stran. ActiveGate ActiveGate poskytuje komerčně podporované vydání jazyka Go a jak projekty LLVM, tak gccgo poskytují volně licencované open source implementace Go prostřednictvím alternativních nástrojů.

A konečně, Go také sloužil jako základna pro vývoj zcela nových jazyků, ačkoli dva příklady toho přestaly aktivní vývoj. Jedním z příkladů byl jazyk Have, který zjednodušil syntaxi Go, implementoval některé ze stejných konceptů svým vlastním způsobem a přenesl se do Go pro snadné provedení. Další zaniklý projekt Oden pomocí Go's assembleru a toolchainu zkompiloval nově navržený jazyk, který vzal další inspiraci z jazyků jako Lisp a Haskell.

Tato poslední sada projektů ilustruje jeden ze způsobů, jakými se každá inovace v oblasti IT stává skutečně revoluční - když ji lidé rozeberou a znovu použijí, hledání použití jejích návrhářů nikdy nebylo zamýšleno. Budoucnost jazyka Go jako hackovatelného projektu teprve začíná. Ale jeho budoucnost jako hlavního programovacího jazyka je již zajištěna, jistě v cloudu, kde rychlost a jednoduchost Go usnadňují vývoj škálovatelné infrastruktury, kterou lze dlouhodobě udržovat.