Za šta je programski jezik Go zaista dobar?

Shvatite prednosti, slabosti, slučajeve korišćenja i buduće pravce Google-ovog hit programskog jezika.

Autor: Serdar Yegulalp

Tokom svojih deceniju i više godina na slobodi, Google-ov jezik Go, zvani Golang — sa verzijom 1.18 od marta 2022. — evoluirao je od kurioziteta za alfa štrebere u programski jezik testiran u borbi u nekim od najvažnijih svetskih projekata usredsređenih na oblak.

Zašto su Go izabrali programeri takvih projekata kao što su Docker i Kubernetes? Koje su karakteristike Go-a, po čemu se razlikuje od drugih programskih jezika i za izgradnju koje vrste projekata je najpogodniji? U ovom članku ćemo istražiti Go-ov skup funkcija, optimalne slučajeve upotrebe, propuste i ograničenja jezika i kojim putem može Go da krene odavde.

Jezik Go je mali i jednostavan

Go, ili Golang kako ga često nazivaju, razvili su zaposleni u Googlu — uglavnom dugogodišnji guru za Unix i ugledni Google inženjer Rob Pike — ali to nije, striktno govoreći, „Google projekat“. Umesto toga, Go je razvijen kao projekat otvorenog koda koji vodi zajednica, a predvodi mu rukovodstvo koje ima čvrst stav o tome kako Go treba da se koristi i u kom pravcu jezik treba da ide.

Go je zamišljen kao jednostavan za učenje, jednostavan za rad i lak za čitanje za druge programere. Go nema veliki skup funkcija, posebno u poređenju sa jezicima kao što je C++. Go po svojoj sintaksi podseća na C, što ga dugogodišnjim C programerima čini relativno lakim za učenje. Pored toga, mnoge funkcije Go-a, posebno njegove karakteristike paralelnosti i funkcionalnog programiranja, potiču iz jezika kao što je Erlang.

Kao jezik nalik C-u za pravljenje i održavanje višeplatformskih poslovnih aplikacija svih vrsta, Go ima mnogo zajedničkog sa Javom. A kao sredstvo za omogućavanje brzog razvoja koda koji bi mogao da se pokrene bilo gde, mogli biste povući paralelu između Go-a i Python-a, mada su razlike daleko veće nego sličnosti.

Jezik Go ima ponešto za svakoga

Go dokumentacija opisuje Go kao „brz, statički tipiziran, kompajliran jezik koji deluje kao dinamički tipiziran, interpretirani jezik“. Čak i veliki Go program će se kompajlirati za nekoliko sekundi. Plus, Go izbegava veliki deo opterećenja koji potiče od uključivanja fajlova i biblioteka u C stilu.

Go olakšava život programera na više načina.

Go je lagodan

Go se poredi sa skript jezicima kao što je Python po svojoj sposobnosti da zadovolji mnoge uobičajene potrebe programiranja. Neke od ovih funkcionalnosti su ugrađene u sam jezik, kao što su „goroutines“ za konkurentnost i ponašanje poput niti, dok su dodatne mogućnosti dostupne u standardnim bibliotečkim paketima Go -a, kao što je Go-ov http paket. Kao i Python, Go pruža mogućnosti automatskog upravljanja memorijom, uključujući sakupljanje smeća.

Za razliku od jezika za skriptovanje kao što je Python, Go kôd se kompajlira u izvorni binarni fajl koji se brzo izvršava. I za razliku od C ili C++, Go se kompajlira izuzetno brzo — dovoljno brzo da rad sa Go-om izgleda više kao rad sa jezikom za skriptovanje nego sa kompajliranim jezikom. Dalje, Go sistem za gradnju je manje složen od sistema drugih kompajliranih jezika. Potrebno je nekoliko koraka i malo knjigovodstva da biste izgradili i pokrenuli Go projekat.

Go je brz

Go binarni fajlovi rade sporije od svojih C parnjaka, ali je za većinu primena razlika u brzini zanemarljiva. Go performanse su za ogromnu većinu poslova dobre koliko i C, i generalno mnogo brže od drugih jezika poznatih po brzini razvijanja (npr. JavaScript, Python i Ruby).

Go je prenosiv

Izvršni fajlovi kreirani pomoću Go lanca alata mogu biti samostalni, bez podrazumevanih spoljnih zavisnosti. Go lanac alata je dostupan za širok spektar operativnih sistema i hardverskih platformi i može se koristiti za kompajliranje binarnih fajlova na različitim platformama.

Go je interoperabilan

Go isporučuje sve gore navedeno bez žrtvovanja pristupa osnovnom sistemu. Go programi mogu da razgovaraju sa spoljnim C bibliotekama ili da upućuju izvorne sistemske pozive. U Docker-u, na primer, Go se povezuje sa Linux funkcijama niskog nivoa, cgrupama i prostorima imena, da bi koristio kontejnere.

Go je široko podržan

Go lanac alata je besplatno dostupan kao binarni sistem za Linux, MacOS ili Windows ili kao Docker kontejner. Go je podrazumevano uključen u mnoge popularne Linux distribucije, kao što su Red Hat Enterprise Linux i Fedora, što čini donekle lakšim primenu Go izvora na te platforme. Podrška za Go je takođe jaka u mnogim razvojnim okruženjima drugih dobavljača, od Microsoft Visual Studio Code-a do ActiveState-ovog Komodo IDE-a.

Gde jezik Go najbolje funkcioniše

Nijedan jezik nije prikladan baš za svaki posao, ali neki jezici su pogodni za više poslova nego drugi.

Go je najsjajniji za razvoj sledećih tipova aplikacija.

Izvorni razvoj u oblaku

Go-ove funkcije konkurentnosti i umrežavanja, kao i visok stepen prenosivosti, čine ga pogodnim za pravljenje izvornih aplikacija u oblaku. U stvari, Go se koristi za izgradnju nekoliko kamena temeljaca računarstva u oblaku, uključujući Docker, Kubernetes i Istio.

Distribuirane mrežne usluge

Mrežne aplikacije žive i umiru uz konkurentnost, a Go-ove izvorne funkcije konkurentnosti – uglavnom gorutine i kanali – su veoma pogodne za takav rad. Shodno tome, mnogi Go projekti su za umrežavanje, distribuirane funkcije i usluge u oblaku: API-ji, veb serveri, minimalni radni okviri za veb aplikacije i slično.

Uslužni programi i samostalni alati

Go programi se kompajliraju u binarne fajlove sa minimumom spoljnih zavisnosti. To ih čini idealnim za kreiranje uslužnih programa i drugih alata, jer se brzo pokreću i mogu se lako upakovati za ponovnu distribuciju. Jedan primer je pristupni server koji se zove Teleport (između ostalog za SSH). Teleport se može brzo i lako primeniti na servere tako što se kompajlira iz izvora ili preuzme unapred izgrađeni binarni fajl.

Ograničenja jezika Go

Go-ov samostalni skup funkcija izaziva i pohvale i kritike. Go je dizajniran tako da bude mali i lak za razumevanje, pa su određene funkcije namerno izostavljene. Rezultat je da neke funkcije koje su uobičajene na drugim jezicima jednostavno nisu dostupne u Go-u — namerno.

Jedna dugogodišnja pritužba bila je nedostatak generičkih funkcija, koje omogućavaju funkciji da prihvati mnogo različitih tipova varijabli. Godinama se Go-ov razvojni tim protivio dodavanju generika jeziku, iz razloga što su želeli sintaksu i skup ponašanja koji dopunjuju ostatak Go-a. Ali od Go verzije 1.18, objavljene početkom 2022. godine, jezik sada uključuje sintaksu za generike. Zaključak koji treba izvući je da Go retko dodaje glavne karakteristike i to tek nakon mnogo razmatranja, da bi se bolje očuvala široka kompatibilnost među verzijama.

Još jedan potencijalni nedostatak Go-a je veličina generisanih binarnih fajlova. Go binarni fajlovi su podrazumevano statički kompajlirani, što znači da je sve što je potrebno tokom izvršavanja uključeno u binarnu sliku. Ovaj pristup pojednostavljuje proces izgradnje i implementacije, ali po cenu da prosti „Zdravo, svete!“ bude na 64-bitnom Windows-u težak oko 1,5 MB. Go tim je sa svakim uzastopnim izdanjem radio na smanjenju veličine tih binarnih fajlova. Takođe je moguće Go binarne fajlove smanjiti  pomoću kompresije ili uklanjanjem Go informacija za otklanjanje grešaka. Ova poslednja opcija može bolje da funkcioniše za samostalne distribuirane aplikacije nego za usluge u oblaku ili mrežne usluge, gde su informacije za otklanjanje grešaka korisne ako usluga ne uspe.

Još jedna reklamirana karakteristika Go-a, automatsko upravljanje memorijom, može se smatrati nedostatkom, jer sakupljanje smeća zahteva određeno preopterećenje obrade. Po dizajnu, Go ne obezbeđuje ručno upravljanje memorijom, a sakupljanje smeća u Go-u je kritikovano zbog toga što ne izlazi dobro na kraj sa nekim vrstama memorijskog opterećenja koje se pojavljuju u aplikacijama preduzeća.

Ipak, čini se da svaka nova verzija Go-a poboljšava funkcije upravljanja memorijom. Na primer, Go 1.8 je doneo znatno kraće vreme kašnjenja za sakupljanje smeća. Go programeri imaju mogućnost da koriste ručnu alokaciju memorije u jednoj C ekstenziji ili putem biblioteke za ručno upravljanje memorijom drugog dobavljača, ali većina Go programera više voli izvorna rešenja za te probleme.

Kultura softvera oko izgradnje bogatih GUI-ja za Go aplikacije, poput onih u desktop aplikacijama, još uvek je ređa.

Većina Go aplikacija su alati komandne linije ili mrežni servisi. Međutim, različiti projekti rade na tome da pruže bogate grafičke interfejse za Go aplikacije. Postoje povezivanja za radne okvire GTK i GTK3. Još jedan projekat je namenjen da obezbedi korisničke interfejse izvorne na platformi, iako se oni oslanjaju na C vezivanja i nisu napisani u čistom Go-u. Korisnici Windows-a mogu da isprobaju walk. Ali u ovom prostoru se nije pojavio nikakav jasan pobednik ili sigurno dugoročno rešenje, a neki projekti, kao što je jedan Google pokušaj da se izgradi multi-platformska GUI biblioteka, su propali. Takođe, pošto je Go po dizajnu nezavisan od platforme, malo je verovatno da će bilo koji od njih postati deo standardnog paketa.

Iako Go može da komunicira sa izvornim sistemskim funkcijama, on nije dizajniran za kreiranje sistemskih komponenti niskog nivoa, kao što su jezgra ili drajveri uređaja, ili ugrađeni sistemi. Na kraju krajeva, Go izvršno okruženje i sakupljač smeća za Go aplikacije zavise od osnovnog OS-a. (Programeri zainteresovani za najsavremeniji jezik za tu vrstu posla mogli bi da pogledaju jezik Rust.)

Budućnost jezika Go

Go-ov budući razvoj se više okreće željama i potrebama njegove baze programera, pri čemu Go-ovi ljudi menjaju jezik da bi ga bolje prilagodili ovoj publici, umesto da je vode tvrdoglavim primerom. Primer za to su generici, koji su konačno dodati jeziku nakon dugog razmišljanja o najboljem načinu da se to uradi.

Istraživanje Go Developer-a iz 2021. pokazalo je da su korisnici Go-a u celini zadovoljni onim što jezik nudi, ali takođe navode dosta prostora za unapređenje. Najveće oblasti u kojima su korisnici Go-a želeli poboljšanja su upravljanje zavisnostima (stalni izazov u ​​Go-u), dijagnostikovanje grešaka i pouzdanost, sa problemima kao što su memorija, korišćenje CPU-a, binarne veličine i vreme izrade koje je rangirano mnogo niže.

Većina jezika gravitira osnovnom skupu slučajeva korišćenja. Tokom decenije koliko postoji Go, njegova niša su postale mrežne usluge, gde će verovatno nastaviti da širi svoje preimućstvo. Uglavnom, glavni slučaj upotrebe jezika bio je kreiranje API-ja ili RPC usluga (49%), zatim obrada podataka (10%), veb usluge (10%) i CLI aplikacije (8%).

Još jedan znak sve veće privlačnosti jezika Go je koliko se programera odlučuje za njega nakon što ga procene. 75% anketiranih koji su razmišljali o korišćenju Go-a za projekat izabralo je ovaj jezik. Od onih koji nisu izabrali Go, glavne alternative su bile Rust (25%), Python (17%) i Java (12%). Svaki od ovih jezika je našao, ili pronalazi, druge niše: Rust za sigurno i brzo programiranje sistema; Python za izradu prototipa, automatizaciju i sastavljački kod; i Java za dugotrajne poslovne aplikacije.

Ostaje da se vidi dokle će Go-ova brzina i jednostavnost razvoja da ga uvede u druge slučajeve upotrebe, ili koliko će Go duboko da prodre u razvoj preduzeća. Ali budućnost Go-a kao glavnog programskog jezika je već osigurana – svakako u oblaku, gde brzina i jednostavnost Go-a olakšavaju razvoj skalabilne infrastrukture koja može da se održava na duge staze. Izvor: InfoWorld