Za što je stvarno dobar jezik Go?

Tijekom svojih devet i više godina u divljini, Googleov jezik Go, zvani Golang - s verzijom 1.13 koja je izašla od rujna 2019. - evoluirao je od znatiželje za alfa geekove do programskog jezika provjerenog u bitkama iza nekih od najvažnijih svjetskih projekti usmjereni na oblak. 

Zašto su programeri takvih projekata poput Dockera i Kubernetesa odabrali Go? Koje Go definiraju karakteristike, po čemu se razlikuje od ostalih programskih jezika i koje je vrste projekata najprikladnije za izgradnju? U ovom ćemo članku istražiti Goov skup značajki, optimalne slučajeve upotrebe, propuste i ograničenja jezika te kamo Go može ići odavde.

Go jezik je mali i jednostavan

Go, ili Golang, kako ga često nazivaju, razvili su zaposlenici Googlea - uglavnom dugogodišnji Unix guru i Googleov ugledni inženjer Rob Pike - ali to nije strogo rečeno "Googleov projekt". Umjesto toga, Go je razvijen kao projekt otvorenog koda kojeg vode zajednice, a predvodi ga vodstvo koje ima čvrsta mišljenja o tome kako Go treba koristiti i u kojem smjeru jezik treba ići.

Go je namijenjen jednostavnom učenju, jednostavnom radu i čitanju drugim programerima. Go nema velik skup značajki, posebno u usporedbi s jezicima poput C ++. Go svojom sintaksom podsjeća na C, što dugotrajnim programerima C-a relativno olakšava učenje. To je reklo, mnoge značajke Goa, posebno njegove istovremene i funkcionalne programske značajke, vraćene su na jezike kao što je Erlang.

Kao jezik sličan C-u za izgradnju i održavanje svih vrsta različitih platformi za poslovne programe, Go ima mnogo zajedničkog s Javom. A kao sredstvo za omogućavanje brzog razvoja koda koji se može izvoditi bilo gdje, mogli biste povući paralelu između Goa i Pythona, iako su razlike daleko veće od sličnosti.

Go jezik ima ponešto za svakoga

Dokumentacija Go opisuje Goa kao "brzi, statički otkucani, kompilirani jezik koji se osjeća poput dinamički upisanog, protumačenog jezika." Čak će se i veliki Go program sastaviti u nekoliko sekundi. Osim toga, Go izbjegava velik dio troškova u C-stilu, uključujući datoteke i knjižnice.

Go olakšava život programera na nekoliko načina:

  • Pogodnost.  Go se uspoređuje sa skriptnim jezicima poput Pythona po svojoj sposobnosti da zadovolji mnoge uobičajene programske potrebe. Neke od ovih funkcionalnosti ugrađene su u sam jezik, kao što su "goroutine" za istodobnost i ponašanje poput niti, dok su dodatne mogućnosti dostupne u standardnim paketima knjižnica Go, poput Go-ovog http paketa. Kao i Python, Go nudi mogućnosti automatskog upravljanja memorijom, uključujući prikupljanje smeća.

    Za razliku od skriptnih jezika kao što je Python, Go kod se kompajlira u brzi izvorni binarni program. I za razliku od C ili C ++, Go se kompajlira izuzetno brzo - dovoljno brzo da rad s Goom više nalikuje radu sa skriptnim jezikom nego s kompiliranim jezikom. Nadalje, Go build sustav manje je složen od onih ostalih kompajliranih jezika. Potrebno je nekoliko koraka i malo knjigovodstva za izgradnju i pokretanje Go projekta.

  • Ubrzati.  Binarne datoteke Go rade sporije od njihovih kolega C, ali razlika u brzini je zanemariva za većinu aplikacija. Go izvedba je dobra kao i C za veliku većinu posla i općenito puno brža od ostalih jezika poznatih po brzini razvoja (npr. JavaScript, Python i Ruby).
  • Prijenosnost.  Izvršne datoteke stvorene s alatnim nizom Go mogu biti samostalne, bez zadanih vanjskih ovisnosti. Alat Go dostupan je za širok spektar operativnih sustava i hardverskih platformi, a može se koristiti za kompajliranje binarnih datoteka na različitim platformama.
  • Interoperabilnost.  Go isporučuje sve gore navedeno bez odricanja od pristupa osnovnom sustavu. Go programi mogu razgovarati s vanjskim C knjižnicama ili upućivati ​​matične sistemske pozive. Na primjer, u Dockeru, Go sučelje s Linux funkcijama, cgroups i imenskim prostorima niske razine radi magije kontejnera.
  • Podrška.  Alat Go je besplatno dostupan kao binarni sustav Linux, MacOS ili Windows ili kao Docker spremnik. Go je po defaultu uključen u mnoge popularne Linux distribucije, poput Red Hat Enterprise Linuxa i Fedore, što čini nešto lakšim raspoređivanje Go izvora na tim platformama. Podrška za Go također je snažna u mnogim razvojnim okruženjima trećih strana, od Microsoft Visual Studio Code do ActiveState-ovog Komodo IDE-a.

Gdje Go jezik najbolje funkcionira

Nijedan jezik ne odgovara svakom poslu, ali neki jezici odgovaraju većem broju poslova nego drugi.

Go najsjajnije svijetli za razvoj sljedećih vrsta aplikacija:

  • Distribuirane umrežene usluge. Mrežne aplikacije žive i umiru od istodobnosti, a Go-ove izvorne značajke istodobnosti - uglavnom goroutine i kanali - vrlo su pogodne za takav rad. Slijedom toga, mnogi Go projekti su za umrežavanje, distribuirane funkcije i usluge u oblaku: API-ji, web poslužitelji, minimalni okviri za web aplikacije i slično.
  • Izvorni razvoj u oblaku. Go-ove paralelne značajke i značajke umrežavanja te visoki stupanj prenosivosti čine ga izvrsnim za izradu aplikacija u izvornom oblaku. U stvari, Go je korišten za izgradnju nekoliko kamena temeljaca računalstva u izvornom oblaku, uključujući Docker, Kubernetes i Istio.
  • Zamjene za postojeću infrastrukturu. Velik dio softvera o kojem se oslanjamo za internetsku infrastrukturu stari i iskorišten. Prepisivanje takvih stvari u Go pruža brojne prednosti - bolju sigurnost memorije, lakšu implementaciju na više platformi i čistu bazu koda za promicanje budućeg održavanja. Novi SSH poslužitelj pod nazivom Teleport i nova verzija Network Time Protocol napisani su u programu Go i ponuđeni kao zamjena za njihove uobičajene kolege.
  • Uslužni programi i samostalni alati. Go programi se prevode u binarne datoteke s minimalnim vanjskim ovisnostima. To ih čini idealno pogodnima za stvaranje uslužnih programa i ostalog alata, jer se brzo pokreću i lako se pakiraju za ponovnu distribuciju.

Idite na jezična ograničenja

Goov misaoni skup značajki izazvao je i pohvale i kritike. Go je dizajniran tako da pogriješi jer je mali i lako razumljiv, a neke značajke su namjerno izostavljene. Rezultat je to što neke značajke koje su uobičajene u drugim jezicima jednostavno nisu dostupne u programu Go - namjerno.

Jedna od takvih značajki su generički, koji omogućuju funkciji prihvaćanje mnogih različitih vrsta varijabli. Go ne uključuje generičke lijekove, a upravitelji jezika su protiv dodavanja istih, na temelju toga da bi generički lijekovi ugrozili jednostavnost jezika. To je ograničenje moguće zaobići, ali mnogi programeri još uvijek svrbe kad na neki način dodaju generičke lijekove koji su dodani u Go. Podignut je barem jedan prijedlog za primjenu generičkih lijekova u programu Go, ali ništa nije postavljeno.

Još jedan nedostatak Go-a je veličina generiranih binarnih datoteka. Go binarne datoteke statički su sastavljene prema zadanim postavkama, što znači da je sve što je potrebno za vrijeme izvođenja uključeno u binarnu sliku. Ovaj pristup pojednostavljuje postupak izrade i implementacije, ali po cijenu jednostavnog "Zdravo, svijet!" težine oko 1,5 MB na 64-bitnom sustavu Windows. Go tim radi sa smanjenjem veličine tih binarnih datoteka sa svakim uzastopnim izdanjem. Također je moguće smanjiti binarne datoteke Go pomoću kompresije ili uklanjanjem Goovih podataka za otklanjanje pogrešaka. Ova zadnja opcija može bolje funkcionirati za samostalne distribuirane aplikacije nego za usluge u oblaku ili mrežne usluge, gdje je korisno imati informacije o otklanjanju pogrešaka ako usluga ne uspije.

Još jedna reklamirana značajka Goa, automatsko upravljanje memorijom, može se smatrati nedostatkom, jer sakupljanje smeća zahtijeva određenu količinu obrade. Prema dizajnu, Go ne pruža ručno upravljanje memorijom, a prikupljanje smeća u Gou kritizirano je zbog lošeg bavljenja vrstama memorijskih opterećenja koja se pojavljuju u poslovnim aplikacijama. Dobra mu je strana što Go 1.8 donosi mnoga poboljšanja u upravljanju memorijom i prikupljanju smeća koja smanjuju vrijeme zaostajanja. Naravno, programeri Go imaju mogućnost koristiti ručno dodjeljivanje memorije u C ekstenziji ili putem biblioteke za ručno upravljanje memorijom treće strane.

Kultura softvera oko stvaranja bogatih GUI-a za Go aplikacije, poput onih u desktop aplikacijama, još uvijek je raspršena.

Većina Go aplikacija su alati naredbenog retka ili mrežne usluge. Uprkos tome, razni projekti rade na donošenju bogatih GUI-a za Go aplikacije. Postoje vezovi za okvire GTK i GTK3. Sljedeći je projekt namijenjen pružanju korisničkih sučelja s matičnom platformom, premda se oni oslanjaju na C veze i nisu napisani u čistom Go-u. Korisnici Windowsa mogu isprobati šetnju. No, na ovom se prostoru nije pojavio jasan pobjednik ili sigurna dugoročna oklada, a neki su projekti, poput Googleovog pokušaja izgradnje višeplatformne GUI biblioteke, pošli putem. Također, budući da je Go dizajnerski neovisan o platformi, malo je vjerojatno da će ijedan od njih postati dio standardnog paketa.

Iako Go može razgovarati s matičnim funkcijama sustava, nije dizajniran za stvaranje komponenata sustava na niskoj razini, poput jezgri ili upravljačkih programa uređaja ili ugrađenih sustava. Napokon, vrijeme izvođenja Go i sakupljač smeća za Go aplikacije ovise o osnovnom OS-u. (Programeri zainteresirani za najmoderniji jezik za takvu vrstu rada mogli bi potražiti jezik Rust.)

Idi jezične budućnosti

Sljedeću fazu u razvoju Go-a možda će možda više voditi želje i potrebe njegove baze programera, s tim da Go-ovi pametnjakovići mijenjaju jezik kako bi bolje prilagodio ovu publiku, umjesto da samo vode tvrdoglavim primjerom. Drugim riječima, Go može dobiti značajke koje mu izvorno nisu bile namijenjene, poput generičkih lijekova.

Jasno je da programeri Golanga žele ove stvari. Anketa korisnika Go 2018 stavila je generike među prva tri izazova na putu šireg usvajanja Goa, zajedno s boljom ovisnošću i upravljanjem paketima. A postojeći prijedlog za GitHub za generičke lijekove ostaje aktivan kao prijedlog za Go 2.x. Ovakve promjene mogu pomoći Go-u da zauzme centralnije mjesto u razvoju poduzeća, gdje trenutno vladaju Java, JavaScript i Python.

Čak i bez većih promjena, možemo očekivati ​​povećanu upotrebu Go-a za projekte obnove infrastrukture, prema gore opisanim zamjenama za SSH i NTP, i kao dio višejezičnih projekata. 

Proširile su se i implementacije Go toolchain-a trećih strana. ActiveState ActiveGo nudi komercijalno podržano izdanje jezika Go, a projekti LLVM i gccgo nude liberalizirane implementacije Go-a s otvorenim kodom putem alternativnih alatnih lanaca.

Konačno, Go je poslužio i kao osnova za razvijanje potpuno novih jezika, iako su dva primjera toga prestala s aktivnim razvojem. Jedan od primjera bio je jezik Have, koji je pojednostavio sintaksu Go, implementirao neke od istih koncepata na svoj način i preveo u Go za jednostavno izvršenje. Drugi ugasli projekt, Oden, koristio je Goov asembler i lanac alata za sastavljanje novoprojektiranog jezika koji je dodatno nadahnuo jezike poput Lispa i Haskella.

Ovaj posljednji niz projekata ilustrira jedan od načina na koji bilo koja informatička inovacija postaje uistinu revolucionarna - kad je ljudi odvoje i prenamjene, pronalazeći namjene koje njezini dizajneri nikada nisu namjeravali. Budućnost jezika Go kao hakabilnog projekta tek započinje. No, njegova budućnost kao glavnog programskog jezika već je osigurana, zasigurno u oblaku, gdje brzina i jednostavnost Goa olakšavaju razvoj skalabilne infrastrukture koja se može dugoročno održavati.