Programiranje

Za kaj je jezik Go v resnici dober?

V svojih devetih in več letih v divjini se je Googlov jezik Go, imenovan Golang - z različico 1.13 od septembra 2019 - iz radovednosti za alfa geeks razvil v preizkušeni programski jezik, ki stoji za nekaterimi najpomembnejšimi na svetu. projekti, osredotočeni na oblak.

Zakaj so razvijalce projektov, kot sta Docker in Kubernetes, izbrali Go? Katere so značilnosti Go-ja, kako se razlikuje od drugih programskih jezikov in kakšne projekte je najprimernejši za gradnjo? V tem članku bomo raziskali nabor funkcij Go, primere optimalne uporabe, jezikovne opustitve in omejitve ter od kod morda gre Go.

Go jezik je majhen in preprost

Go ali Golang, kot ga pogosto imenujejo, so razvili zaposleni pri Googlu - predvsem dolgoletni guru Unixa in Googlov ugledni inženir Rob Pike - vendar ni strogo rečeno "Googlov projekt". Namesto tega je Go razvit kot odprtokodni projekt, ki ga vodi skupnost in ga vodi vodstvo, ki ima močna mnenja o tem, kako naj se Go uporablja in v katero smer naj jezik zavzame.

Go je mišljen kot enostaven za učenje, enostaven za delo in enostaven za branje drugih razvijalcev. Go nima velikega nabora funkcij, zlasti v primerjavi z jeziki, kot je C ++. Go po svoji sintaksi spominja na C, zato je dolgoletnim razvijalcem C razmeroma enostavno učenje. Kljub temu so številne funkcije Go, zlasti njegove sočasne in funkcionalne programske funkcije, povezane z jeziki, kot je Erlang.

Go kot jezik, podoben jeziku C, za gradnjo in vzdrževanje vseh vrst aplikacij za različne platforme, ima Go veliko skupnega z Javo. In kot sredstvo, ki omogoča hiter razvoj kode, ki se lahko izvaja kjer koli, lahko potegnete vzporednico med Go in Pythonom, čeprav so razlike veliko večje od podobnosti.

Go jezik ima nekaj za vsakogar

Dokumentacija Go opisuje Go kot "hiter, statično natipkan, preveden jezik, ki se počuti kot dinamično natipkan, interpretiran jezik." Tudi velik program Go se bo zbral v nekaj sekundah. Poleg tega se Go izogiba velikemu delu stroškov in datotek in knjižnic v slogu C.

Go olajša življenje razvijalca na več načinov:

  • Priročnost. Go je bil v primerjavi s skriptnimi jeziki, kot je Python, sposoben zadovoljiti številne pogoste programske potrebe. Nekatere od teh funkcij so vgrajene v sam jezik, na primer »goroutine« za sočasnost in vedenje podobnih nitkam, dodatne zmožnosti pa so na voljo v standardnih knjižničnih paketih Go, kot je Goov http paket. Tako kot Python, tudi Go ponuja možnosti samodejnega upravljanja pomnilnika, vključno z zbiranjem smeti.

    Za razliko od skriptnih jezikov, kot je Python, se koda Go prevaja v hitro delujoč domači binarni sistem. In za razliko od C ali C ++, Go prevaja izjemno hitro - dovolj hitro, da je delo z Go bolj podobno delu s skriptnim jezikom kot prevedenim jezikom. Poleg tega je sistem gradnje Go manj zapleten kot sistem drugih prevedenih jezikov. Za izdelavo in vodenje projekta Go je potrebnih nekaj korakov in malo knjigovodstva.

  • Hitrost. Binarni programi Go tečejo počasneje kot njihovi kolegi C, vendar je razlika v hitrosti za večino aplikacij zanemarljiva. Uspešnost Go je za večino dela dobra kot C in na splošno veliko hitrejša od drugih jezikov, znanih po hitrosti razvoja (npr. JavaScript, Python in Ruby).
  • Prenosljivost. Izvedljive datoteke, ustvarjene z orodno verigo Go, so lahko samostojne, brez privzetih zunanjih odvisnosti. Veriga orodij Go je na voljo za najrazličnejše operacijske sisteme in strojne platforme ter se lahko uporablja za sestavljanje binarnih datotek na različnih platformah.
  • Interoperabilnost. Go prinaša vse zgoraj navedeno, ne da bi pri tem žrtvoval dostop do osnovnega sistema. Programi Go se lahko pogovarjajo z zunanjimi knjižnicami C ali izvajajo izvorne sistemske klice. V Dockerju, na primer, vmesniki Go z nizko nivojskimi funkcijami Linuxa, skupinami in imenskimi prostori delujejo s čarovniško posodo.
  • Podpora. Veriga orodij Go je prosto na voljo kot binarni sistem Linux, MacOS ali Windows ali kot vsebnik Docker. Go je privzeto vključen v številne priljubljene distribucije Linuxa, kot sta Red Hat Enterprise Linux in Fedora, kar nekoliko olajša razmestitev vira Go na teh platformah. Podpora za Go je močna tudi v številnih tujih razvojnih okoljih, od Microsoftovega Visual Studio Code-a do ActiveX-ovega Komodo IDE-ja.

Kje jezik Go najbolje deluje

Noben jezik ni primeren za vsako delo, nekateri jeziki pa so primerni za več delovnih mest kot drugi.

Go najbolj sveti za razvoj naslednjih vrst aplikacij:

  • Porazdeljene omrežne storitve.Omrežne aplikacije živijo in umrejo zaradi sočasnosti, Go-ove izvorne funkcije sočasnosti - predvsem goroutine in kanali - pa so zelo primerne za takšno delo. Posledično so številni projekti Go namenjeni mreženju, porazdeljenim funkcijam in storitvam v oblaku: API-ji, spletni strežniki, minimalni okviri za spletne aplikacije in podobno.
  • Razvoj v oblaku.Go-ove sočasne in mrežne funkcije ter visoka stopnja prenosljivosti omogočajo, da je primeren za izdelavo aplikacij v domačem oblaku. Dejansko je bil Go uporabljen za gradnjo več temeljev računalništva v domačem oblaku, vključno z Dockerjem, Kubernetesom in Istiom.
  • Nadomestitve obstoječe infrastrukture.Velik del programske opreme, od katere smo odvisni za internetno infrastrukturo, se stara in pretrese z izkoriščanjem. Prepisovanje takšnih stvari v Go ponuja številne prednosti - boljšo varnost pomnilnika, lažjo uvedbo med različnimi platformami in čisto osnovo za kodo za spodbujanje prihodnjega vzdrževanja. V strežniku Go sta napisana novi SSH strežnik, imenovan Teleport, in nova različica Network Time Protocol, ki sta na voljo kot nadomestek za običajne kolege.
  • Pripomočki in samostojna orodja.Programi go se prevajajo v binarne datoteke z minimalnimi zunanjimi odvisnostmi. Zaradi tega so idealno primerni za ustvarjanje pripomočkov in drugega orodja, saj se hitro zaženejo in jih je mogoče zlahka zapakirati za prerazporeditev.

Pojdi na jezikovne omejitve

Go-jev samozavestni nabor funkcij je povzročil tako pohvale kot kritike. Go je zasnovan tako, da se zmoti, ker je majhen in lahko razumljiv, nekatere funkcije pa namerno izpuščene. Rezultat tega je, da nekatere funkcije, ki so v drugih jezikih običajne, preprosto niso na voljo v programu Go - namenoma.

Ena takih lastnosti so generiki, ki omogočajo, da funkcija sprejme veliko različnih vrst spremenljivk. Go ne vključuje generikov, jezikovni skrbniki pa nasprotujejo njihovemu dodajanju, ker bi generiki ogrozili preprostost jezika. Te omejitve je mogoče rešiti, vendar mnogi razvijalci še vedno srbijo, ko vidijo, da so generiki na nek način dodani v Go. Izpostavil je vsaj en predlog za uvedbo generičnih zdravil v programu Go, vendar nič ni zastavljeno.

Druga slaba stran programa Go je velikost ustvarjenih binarnih datotek. Dvojne datoteke Go so privzeto statično zbrane, kar pomeni, da je vse, kar je potrebno med izvajanjem, vključeno v binarno sliko. Ta pristop poenostavlja postopek gradnje in uvajanja, vendar za ceno preprostega "Hello, world!" tehta približno 1,5 MB v 64-bitnem sistemu Windows. Ekipa Go si z vsako zaporedno izdajo prizadeva zmanjšati velikost teh datotek. Prav tako je mogoče skrčiti binarne datoteke Go s stiskanjem ali tako, da odstranite informacije o odpravljanju napak podjetja Go. Ta zadnja možnost bo morda bolje delovala za samostojne distribuirane aplikacije kot za storitve v oblaku ali omrežne storitve, kjer so informacije o odpravljanju napak koristne, če storitev ne deluje.

Še ena priznana značilnost Go, samodejno upravljanje pomnilnika, je lahko pomanjkljivost, saj zbiranje smeti zahteva določeno količino obdelave. Go po svoji zasnovi ne zagotavlja ročnega upravljanja pomnilnika, zbiranje smeti v Goju pa je bilo kritizirano, ker se slabo ukvarja z vrstami obremenitev pomnilnika, ki se pojavljajo v poslovnih aplikacijah. Pozitivna stran je, da Go 1.8 prinaša številne izboljšave pri upravljanju pomnilnika in zbiranju smeti, ki zmanjšujejo čas zamika. Seveda lahko razvijalci Go uporabljajo ročno dodeljevanje pomnilnika v razširitvi C ali prek ročne knjižnice za upravljanje ročnega pomnilnika.

Kultura programske opreme za ustvarjanje bogatih grafičnih uporabniških vmesnikov za aplikacije Go, na primer v namiznih aplikacijah, je še vedno razpršena.

Večina aplikacij Go je orodje ukazne vrstice ali omrežne storitve. Kljub temu si različni projekti prizadevajo, da bi prinesli bogate grafične vmesnike za aplikacije Go. Obstajajo vezi za ogrodja GTK in GTK3. Namen drugega projekta je zagotoviti uporabniške vmesnike, ki temeljijo na platformi, čeprav se zanašajo na vezi C in niso napisani v čisti Go. Uporabniki sistema Windows lahko preizkusijo hojo. Toda v tem prostoru ni nobenega jasnega zmagovalca ali varne dolgoročne stave, nekateri projekti, kot je Googlov poskus zgraditve medplatformacijske knjižnice GUI, pa so šli mimogrede. Ker je Go po zasnovi neodvisen od platforme, verjetno ni nobeden od njih del standardnega nabora paketov.

Čeprav Go lahko govori z domačimi sistemskimi funkcijami, ni bil zasnovan za ustvarjanje sistemskih komponent na nizki ravni, kot so jedra ali gonilniki naprav ali vdelani sistemi. Navsezadnje sta izvajalno okolje Go in zbiralnik smeti za aplikacije Go odvisna od osnovnega OS. (Razvijalci, ki jih zanima takšen vrhunski jezik za tovrstno delo, se lahko lotijo ​​jezika Rust.)

Pojdi jezikovne prihodnosti

Naslednjo fazo v razvoju Go bodo morda bolj usmerjale želje in potrebe njegove baze razvijalcev, pri čemer bodo Go-jevi možje spremenili jezik, da bo bolje prilagodil to ciljno skupino, ne pa samo voditi s trmastim zgledom. Z drugimi besedami, Go lahko pridobi funkcije, ki mu prvotno niso bile namenjene, na primer generična zdravila.

Jasno je, da si razvijalci Golanga želijo te stvari. Anketa uporabnikov Go 2018 je generike postavila med tri glavne izzive na področju širšega sprejetja Go, skupaj z boljšo odvisnostjo in upravljanjem paketov. Obstoječi predlog za GitHub za generike ostaja aktiven kot predlog za Go 2.x. Takšne spremembe lahko pomagajo, da Go zavzame osrednje mesto v razvoju podjetja, kjer trenutno kraljujejo Java, JavaScript in Python.

Tudi brez večjih sprememb lahko pričakujemo povečano uporabo programa Go za projekte obnove infrastrukture, kot je opisano zgoraj nadomeščanjem za SSH in NTP ter kot del večjezičnih projektov.

Razširile so se tudi implementacije orodja Go, ki jih izvajajo tretje osebe. ActiveGotov ActiveGo ponuja komercialno podprto izdajo jezika Go, projekti LLVM in gccgo pa ponujajo široko licencirane odprtokodne izvedbe Go z alternativnimi orodnimi verigami.

Končno je Go služil tudi kot osnova za razvoj povsem novih jezikov, čeprav sta dva primera tega prenehala aktivno razvijati. Eden od primerov je bil jezik Have, ki je poenostavil sintakso Go, na svoj način implementiral nekatere iste koncepte in ga za enostavno izvedbo prevedel v Go. Drug neaktiven projekt Oden je z Go-jevim zbiralnikom in orodno verigo sestavil novo oblikovan jezik, ki se je dodatno navdihnil pri jezikih, kot sta Lisp in Haskell.

Ta zadnji sklop projektov ponazarja enega od načinov, kako vsaka informacijska inovacija postane resnično revolucionarna - ko jo ljudje razstavijo in prenovijo, odkrijejo uporabe, ki jih njeni oblikovalci nikoli niso predvideli. Prihodnost jezika Go kot vdrljivega projekta se šele začenja. Toda njegova prihodnost kot glavnega programskega jezika je že zagotovljena, zagotovo v oblaku, kjer hitrost in preprostost Go olajšata razvoj razširljive infrastrukture, ki jo je mogoče dolgoročno vzdrževati.