Ohjelmointi

Mille Go-kieli on todella hyvä?

Yhdeksän plus vuoden aikana luonnossa, Googlen Go-kieli, alias Golang - versiolla 1.13 syyskuusta 2019 lähtien - on kehittynyt uteliaisuudesta alfa-geekeille taistelutestatuksi ohjelmointikieleksi joidenkin maailman tärkeimpien takana pilvikeskeiset projektit.

Miksi Go valitsivat sellaisten projektien kehittäjät kuten Docker ja Kubernetes? Mitkä ovat Go: n määrittelemät ominaisuudet, miten se eroaa muista ohjelmointikielistä ja minkä tyyppisiä projekteja se soveltuu parhaiten rakentamiseen? Tässä artikkelissa tutkitaan Go-ominaisuusjoukkoa, optimaalisia käyttötapauksia, kielen puutteita ja rajoituksia sekä sitä, mihin Go voi olla menossa täältä.

Go-kieli on pieni ja yksinkertainen

Go tai Golang, kuten sitä usein kutsutaan, ovat Googlen työntekijöiden - lähinnä pitkäaikaisen Unix-gurun ja Googlen arvostetun insinöörin Rob Pikein - kehittämät, mutta se ei tarkoita "Google-projektia". Pikemminkin Go on kehitetty yhteisön johtamana avoimen lähdekoodin projektina, jonka johtajana on johtajuus, jolla on vahvat mielipiteet Go: n käytöstä ja kielen suunnasta.

Go on tarkoitus olla helppo oppia, suoraviivainen työskennellä ja muiden kehittäjien helppo lukea. Go: lla ei ole paljon ominaisuuksia, varsinkin kun verrataan kieliin, kuten C ++. Go muistuttaa C: tä syntaksissaan, joten pitkäaikaisten C-kehittäjien on suhteellisen helppo oppia. Monet Go-ominaisuudet, etenkin sen samanaikaisuus ja toiminnalliset ohjelmointiominaisuudet, palaavat takaisin esimerkiksi Erlangin kieliin.

Go: lla on C-tyyppinen kieli kaikenlaisten yritysten välisten yrityssovellusten rakentamiseen ja ylläpitoon, ja sillä on paljon yhteistä Java: n kanssa. Ja mahdollistamaan koodin nopean kehityksen, joka saattaa toimia missä tahansa, voit vetää rinnakkaisuuden Go: n ja Pythonin välille, vaikka erot ovat paljon suurempia kuin yhtäläisyydet.

Go-kielellä on jokaiselle jotakin

Go-dokumentaatio kuvaa Go: ta "nopeaksi, staattisesti kirjoitetuksi, käännetyksi kieleksi, joka tuntuu dynaamisesti kirjoitetulta, tulkitulta kieleltä". Jopa iso Go-ohjelma kootaan muutamassa sekunnissa. Lisäksi Go välttää suuren osan C-tyylisten tiedostojen ja kirjastojen yleiskustannuksista.

Go tekee kehittäjän elämästä helppoa monin tavoin:

  • Sopivuus. Go: ta on verrattu komentosarjakieliin, kuten Python, sen kyvyllä tyydyttää monia yleisiä ohjelmointitarpeita. Osa toiminnoista on sisäänrakennettu itse kieleen, kuten samanaikaisuuden ja säikeellisen käyttäytymisen "gorutines", kun taas Go-standardikirjastopaketeissa, kuten Go: n http-paketissa, on lisäominaisuuksia. Kuten Python, Go tarjoaa automaattisen muistinhallintaominaisuudet, mukaan lukien roskien keräys.

    Toisin kuin komentosarjakielet, kuten Python, Go-koodi kääntyy nopeasti toimivaan natiivibinaariin. Ja toisin kuin C tai C ++, Go kääntää erittäin nopeasti - riittävän nopeasti, jotta työskentely Go kanssa tuntuu enemmän kuin skripti- kuin käännetty kieli. Lisäksi Go koontijärjestelmä on vähemmän monimutkainen kuin muilla käännetyillä kielillä. Go-projektin rakentaminen ja toteuttaminen vaatii muutaman askeleen ja vähän kirjanpitoa.

  • Nopeus. Go-binaarit kulkevat hitaammin kuin C-analogit, mutta nopeusero on vähäinen useimmissa sovelluksissa. Go-suorituskyky on yhtä hyvä kuin C suurimmalle osalle työtä, ja yleensä paljon nopeampi kuin muut kielet, jotka tunnetaan kehityksen nopeudesta (esim. JavaScript, Python ja Ruby).
  • Siirrettävyys. Go-työkaluketjulla luodut suoritettavat tiedostot voivat olla erillisiä ilman oletusarvoisia ulkoisia riippuvuuksia. Go-työkaluketju on saatavana useille käyttöjärjestelmille ja laitteistoalustoille, ja sitä voidaan käyttää binäärien kokoamiseen eri alustoilla.
  • Yhteentoimivuus. Go tarjoaa kaikki edellä mainitut uhraamatta pääsyä taustajärjestelmään. Go-ohjelmat voivat puhua ulkoisten C-kirjastojen kanssa tai soittaa natiivijärjestelmäpuheluja. Esimerkiksi Dockerissa Go-käyttöliittymät matalan tason Linux-toimintojen, ryhmien ja nimitilojen kanssa työskentelevät konttien taikuuden puolesta.
  • Tuki. Go-työkaluketju on vapaasti saatavana Linux-, MacOS- tai Windows-binaarina tai Docker-säilönä. Go sisältyy oletusarvoisesti moniin suosittuihin Linux-jakeluihin, kuten Red Hat Enterprise Linux ja Fedora, mikä helpottaa Go-lähdekoodin käyttöönottoa näille alustoille. Go-tuki on vahvaa myös monissa kolmansien osapuolten kehitysympäristöissä, Microsoft Visual Studio -koodista ActiveStaten Komodo IDE: hen.

Missä Go-kieli toimii parhaiten

Mikään kieli ei sovi jokaiseen työhön, mutta jotkut kielet soveltuvat useammalle työpaikalle kuin toiset.

Go loistaa kirkkaimmin kehitettäessä seuraavia sovellustyyppejä:

  • Hajautetut verkkopalvelut.Verkkosovellukset elävät ja kuolevat samanaikaisuuden perusteella, ja Go: n alkuperäiset samanaikaisuusominaisuudet - pääasiassa gorutit ja kanavat - sopivat hyvin tällaiseen työhön. Tästä johtuen monet Go-projektit ovat verkottumista, hajautettuja toimintoja ja pilvipalveluja varten: API: t, web-palvelimet, minimaaliset kehykset verkkosovelluksille ja vastaavat.
  • Pilvikohtainen kehitys.Gon samanaikaisuus- ja verkko-ominaisuudet sekä korkea siirrettävyys tekevät siitä sopivan pilvipohjaisten sovellusten rakentamiseen. Itse asiassa Goa käytettiin rakentamaan useita pilvipohjaisen tietojenkäsittelyn kulmakiviä, kuten Docker, Kubernetes ja Istio.
  • Korvaa olemassa olevaa infrastruktuuria.Suuri osa ohjelmistoista, joista olemme riippuvaisia ​​Internet-infrastruktuurista, vanhenee ja ammutaan läpi hyödyntämällä. Tällaisten asioiden uudelleenkirjoittaminen Go-palveluun tarjoaa monia etuja - paremman muistiturvallisuuden, helpomman käyttöympäristön välisen käyttöönoton ja siistin koodipohjan tulevan ylläpidon edistämiseksi. Uusi SSH-palvelin nimeltään Teleport ja uusi verkkoaikaprotokollan versio kirjoitetaan Go-sivustoon ja tarjotaan korvaaviksi tavanomaisille kollegoilleen.
  • Apuohjelmat ja erilliset työkalut.Go-ohjelmat kääntyvät binääreihin, joissa on vähän ulkoisia riippuvuuksia. Se tekee niistä ihanteelliset apuohjelmien ja muiden työkalujen luomiseen, koska ne käynnistyvät nopeasti ja voidaan helposti pakata uudelleenjakamista varten.

Siirry kielirajoituksiin

Go: n mielipide-piirteet ovat herättäneet sekä kiitosta että kritiikkiä. Go on suunniteltu erehtymään pienen ja helpon ymmärrettävyyden puolella, ja tietyt ominaisuudet jätetään tarkoituksellisesti pois. Tuloksena on, että jotkut muilla kielillä yleiset ominaisuudet eivät yksinkertaisesti ole käytettävissä Go - tarkoituksella.

Yksi tällainen ominaisuus on geneeriset aineet, jotka sallivat funktion hyväksyä monia erityyppisiä muuttujia. Go ei sisällä geneerisiä aineita, ja kielen taloudenhoitajat vastustavat niiden lisäämistä sillä perusteella, että geneeriset tuotteet vaarantaisivat kielen yksinkertaisuuden. On mahdollista kiertää tämä rajoitus, mutta monet kehittäjät ovat edelleen epämiellyttäviä nähdessään Goon lisättyjä geneerisiä valmisteita jollakin tavalla. Ainakin yksi ehdotus geneeristen lääkkeiden käyttöönotosta Go: ssa on esitetty, mutta mitään ei ole kivitetty.

Toinen Go-haittapuoli on luotujen binäärien koko. Go binäärit kootaan oletusarvoisesti staattisesti, mikä tarkoittaa, että kaikki ajon aikana tarvittava sisältyy binaarikuvaan. Tämä lähestymistapa yksinkertaistaa rakennus- ja käyttöönottoprosessia, mutta yksinkertaisen "Hello, world!" Kustannuksella. paino noin 1,5 Mt 64-bittisessä Windowsissa. Go-tiimi on pyrkinyt vähentämään näiden binäärien kokoa jokaisella peräkkäisellä julkaisulla. Go-binäärit voidaan myös kutistaa pakkaamalla tai poistamalla Go: n virheenkorjaustiedot. Tämä viimeinen vaihtoehto voi toimia paremmin erillisissä hajautetuissa sovelluksissa kuin pilvi- tai verkkopalveluissa, joissa virheenkorjaustietojen saaminen on hyödyllistä, jos palvelu epäonnistuu.

Vielä yksi Go: n mainostettu ominaisuus, automaattinen muistinhallinta, voidaan nähdä haittana, koska roskien kerääminen vaatii tietyn määrän prosessointikuluja. Suunnittelun mukaan Go ei tarjoa manuaalista muistinhallintaa, ja Go: n roskien keräystä on kritisoitu siitä, että se ei käsittele yritystoiminnan sovelluksissa esiintyviä muistikuormia. Plus-puolella Go 1.8 tuo mukanaan monia parannuksia muistinhallintaan ja roskien keräykseen, mikä lyhentää viivettä. Tietysti Go-kehittäjillä on mahdollisuus käyttää manuaalista muistin allokointia C-laajennuksessa tai kolmannen osapuolen manuaalisen muistinhallintakirjaston kautta.

Ohjelmistokulttuuri Go-sovellusten, kuten työpöytäsovellusten, rikkaiden graafisten käyttöliittymien rakentamisen ympärillä on edelleen hajallaan.

Useimmat Go-sovellukset ovat komentorivityökaluja tai verkkopalveluja. Eli erilaiset projektit pyrkivät tuomaan rikas käyttöliittymät Go-sovelluksiin. GTK- ja GTK3-kehyksille on sidoksia. Toinen projekti on tarkoitettu tarjoamaan käyttöympäristökohtaisia ​​käyttöliittymiä, vaikka ne perustuvat C-sidoksiin eikä niitä ole kirjoitettu puhtaana. Ja Windows-käyttäjät voivat kokeilla kävelyä. Mutta tässä tilassa ei ole selvää voittajaa tai turvallista pitkäaikaista vedonlyöntiä, ja jotkut projektit, kuten Google-yritys rakentaa alustojen välinen GUI-kirjasto, ovat ohittaneet. Koska Go on suunnittelusta riippumaton alustasta riippumaton, on epätodennäköistä, että mikään näistä tulee osaksi vakiopakettisarjaa.

Vaikka Go voi puhua natiivijärjestelmän toimintojen kanssa, sitä ei ole suunniteltu luomaan matalan tason järjestelmäkomponentteja, kuten ytimiä tai laiteajureita, tai upotettuja järjestelmiä. Loppujen lopuksi Go-ajonaika ja Go-sovellusten roskien kerääjä ovat riippuvaisia ​​käyttöjärjestelmästä. (Kehittäjät, jotka ovat kiinnostuneita tämäntyyppisen työn huippuluokan kielestä, saattavat tarkastella Rust-kieltä.)

Mene kielen tulevaisuuteen

Go-kehityksen seuraava vaihe voi hyvinkin johtua enemmän sen kehittäjäpohjan toiveista ja tarpeista.Gon ajattelijat vaihtavat kieltä vastaamaan paremmin tätä yleisöä, eikä vain johda itsepäisellä esimerkillä. Toisin sanoen Go voi saada ominaisuuksia, joita ei alun perin ole tarkoitettu sille, kuten geneeriset lääkkeet.

On selvää, että Golang-kehittäjät haluavat näitä asioita. Vuoden 2018 Go -käyttäjätutkimus asetti geneeriset lääkkeet kolmen parhaan haasteen joukkoon laajemman Go-käyttöönoton sekä paremman riippuvuuden ja pakettien hallinnan kanssa. Ja nykyinen GitHub-ehdotus geneerisille lääkkeille pysyy aktiivisena ehdotuksena Go 2.x: lle. Tällaiset muutokset voivat auttaa Goa ottamaan keskeisemmän sijan yrityskehityksessä, jossa Java, JavaScript ja Python ovat tällä hetkellä hallitsevia.

Jopa ilman suuria muutoksia voimme odottaa Go: n lisääntynyttä käyttöä infrastruktuurin uudelleenrakennushankkeissa yllä kuvattujen SSH: n ja NTP: n korvausten mukaisesti ja osana monikielisiä projekteja.

Myös Go-työkaluketjun kolmannen osapuolen toteutukset ovat lisääntyneet. ActiveStaten ActiveGo tarjoaa kaupallisesti tuetun Go-kielen version, ja sekä LLVM- että gccgo-projektit tarjoavat Go: n vapaasti lisensoituja avoimen lähdekoodin toteutuksia vaihtoehtoisten työkaluketjujen avulla.

Lopuksi, Go on toiminut myös perustana kokonaan uusien kielten kehittämiselle, vaikka kaksi esimerkkiä tästä on lopettanut aktiivisen kehityksen. Yksi esimerkki oli Have-kieli, joka virtaviivaistaa Go-syntaksia, toteutti joitain samoja käsitteitä omalla tavallaan ja siirtyi Go-sovellukseen helppoon suoritukseen. Toinen vanhentunut projekti, Oden, käytti Go: n kokoonpanijaa ja työkaluketjua kootaaan uusi muotoiltu kieli, joka otti lisäinspiraatiota kielistä, kuten Lisp ja Haskell.

Tämä viimeinen projektisarja kuvaa yhtä tapaa, jolla IT-innovaatioista tulee todella vallankumouksellisia - kun ihmiset hajottavat sen ja käyttävät sitä uudelleen, löytävät käyttötarkoitukset, joita sen suunnittelijat eivät ole koskaan käyttäneet. Go-kielen tulevaisuus hakkeroituna projektina on vasta alkamassa. Mutta sen tulevaisuus tärkeänä ohjelmointikielenä on jo taattu, varmasti pilvessä, jossa Go: n nopeus ja yksinkertaisuus helpottavat pitkällä aikavälillä ylläpidettävän skaalautuvan infrastruktuurin kehittämistä.