Programavimas

Kuo iš tikrųjų tinkama „Go“ kalba?

Per devynerius ir daugiau metų laukinėje gamtoje „Google“ kalba, dar žinoma kaip „Golang“, kurios versija nuo 2019 m. Rugsėjo mėn. Buvo įdiegta 1.13, iš alfa geekų smalsumo virto mūšio išbandyta programavimo kalba, kuri buvo svarbiausia pasaulyje į debesį orientuoti projektai.

Kodėl „Go“ pasirinko tokių projektų kaip „Docker“ ir „Kubernetes“ kūrėjai? Kokios yra „Go“ apibūdinamosios savybės, kuo jis skiriasi nuo kitų programavimo kalbų ir kokiems projektams jis yra tinkamiausias statyti? Šiame straipsnyje aptarsime „Go“ funkcijų rinkinį, optimalaus naudojimo atvejus, kalbos praleidimus ir apribojimus bei tai, kur „Go“ gali eiti iš čia.

„Go“ kalba yra maža ir paprasta

„Go“ arba „Golang“, kaip dažnai vadinama, sukūrė „Google“ darbuotojai - daugiausia ilgametis „Unix“ guru ir „Google“ išskirtinis inžinierius Robas Pike'as, tačiau tai nėra griežtai „Google“ projektas. Veikiau „Go“ yra sukurtas kaip bendruomenės vadovaujamas atvirojo kodo projektas, kurio vadovu vadovauja vadovybė, turinti tvirtą nuomonę apie tai, kaip „Go“ reikėtų naudoti ir kokia kryptimi kalba turėtų būti.

„Go“ turi būti lengvai išmokstama, nesudėtinga dirbti ir lengvai skaitoma kitų kūrėjų. „Go“ neturi daug funkcijų rinkinio, ypač lyginant su tokiomis kalbomis kaip C ++. „Go“ savo sintakse primena C, todėl ilgamečiams C kūrėjams tai palyginti lengva išmokti. Be to, daugelis „Go“ funkcijų, ypač lygiagretumas ir funkcinės programavimo funkcijos, atsimena tokias kalbas kaip „Erlang“.

„Go“, kaip „C“ tipo kalba, skirta kurti ir palaikyti įvairiausių platformų verslo programas, turi daug bendro su „Java“. Kaip priemonę greitai sukurti kodą, kuris gali veikti bet kur, galite nubrėžti paralelę tarp „Go“ ir „Python“, nors skirtumai yra kur kas didesni nei panašumų.

„Go“ kalba turi kažką kiekvienam

„Go“ dokumentuose „Go“ apibūdinama kaip „greita, statiškai surinkta, sukompiliuota kalba, kuri jaučiasi kaip dinamiškai įvesta, interpretuota kalba“. Net didelė „Go“ programa bus sukompiliuota per kelias sekundes. Be to, „Go“ išvengia daugybės C stiliaus failų ir bibliotekų pridėtinių išlaidų.

„Go“ palengvina kūrėjo gyvenimą keliais būdais:

  • Patogumas. „Go“ buvo lyginamas su scenarijų kalbomis, tokiomis kaip „Python“, kad jos galėtų patenkinti daugelį įprastų programavimo poreikių. Dalis šios funkcijos yra įmontuota pačioje kalboje, pvz., „Goroutines“, kad būtų galima sutapti ir elgtis pagal gijas, o „Go“ standartiniuose bibliotekos paketuose, pavyzdžiui, „Go“ http pakete, yra papildomų galimybių. Kaip ir „Python“, „Go“ teikia automatinio atminties valdymo galimybes, įskaitant šiukšlių surinkimą.

    Skirtingai nuo scenarijų kalbų, tokių kaip „Python“, „Go“ kodas sukompiliuojamas į greitai veikiantį gimtąjį dvejetainį. Skirtingai nei „C“ arba „C ++“, „Go“ kaupia itin greitai - pakankamai greitai, kad dirbdamas su „Go“ labiau norėtumėte dirbti su scenarijų, o ne su sukompiliuota kalba. Be to, „Go build“ sistema yra mažiau sudėtinga nei kitų sudarytų kalbų. Norint sukurti ir vykdyti „Go“ projektą reikia kelių žingsnių ir mažai buhalterijos.

  • Greitis. „Go binaries“ veikia lėčiau nei jų „C“ analogai, tačiau daugumos programų greičio skirtumas yra nereikšmingas. „Go“ našumas yra toks pat geras kaip C daugumai darbų ir paprastai daug greitesnis nei kitomis kalbomis, žinomomis dėl kūrimo greičio (pvz., „JavaScript“, „Python“ ir „Ruby“).
  • Perkeliamumas. Vykdomieji failai, sukurti naudojant „Go“ įrankių grandinę, gali būti atskiri, be numatytųjų išorinių priklausomybių. „Go“ įrankių grandinė yra prieinama įvairioms operacinėms sistemoms ir aparatinės įrangos platformoms, ir ją galima naudoti sudarant binarius visose platformose.
  • Sąveika. „Go“ pateikia visa tai, kas paminėta, neprarandant prieigos prie pagrindinės sistemos. „Go“ programos gali kalbėtis su išorinėmis C bibliotekomis arba atlikti vietinės sistemos skambučius. Pavyzdžiui, „Docker“ programoje „Go“ sąsajos su žemo lygio „Linux“ funkcijomis, grupėmis ir vardų sritimis veikia talpyklų magija.
  • Parama. „Go“ įrankių grandinė yra laisvai prieinama kaip „Linux“, „MacOS“ ar „Windows“ dvejetainis failas arba kaip „Docker“ konteineris. „Go“ pagal numatytuosius nustatymus įtraukta į daugelį populiarių „Linux“ paskirstymų, tokių kaip „Red Hat Enterprise Linux“ ir „Fedora“, todėl šiek tiek lengviau įdiegti „Go“ šaltinį tose platformose. „Go“ palaikymas taip pat stiprus daugelyje trečiųjų šalių kūrimo aplinkų, pradedant „Microsoft Visual Studio Code“ ir baigiant „ActiveState“ „Komodo IDE“.

Geriausiai veikia „Go Go“ kalba

Nė viena kalba nėra tinkama kiekvienam darbui, tačiau kai kurios kalbos tinka daugiau darbų nei kitos.

„Go“ ryškiausiai šviečia kuriant šiuos programų tipus:

  • Paskirstytos tinklo paslaugos.Tinklo programos gyvuoja ir miršta dėl lygiagretumo, o „Go“ vietinės lygiagretumo funkcijos - daugiausia gorutinos ir kanalai - puikiai tinka tokiam darbui. Todėl daugelis „Go“ projektų skirti tinklui, paskirstytoms funkcijoms ir debesų paslaugoms: API, žiniatinklio serveriams, minimalioms žiniatinklio programų sistemoms ir panašiai.
  • Debesų vystymasis.„Go“ lygiagretumo ir tinklo funkcijos bei didelis jo perkeliamumas leidžia gerai kurti debesyje sukurtas programas. Tiesą sakant, „Go“ buvo naudojama kuriant kelis kertinius „cloud-native“ kompiuterijos pagrindus, įskaitant „Docker“, „Kubernetes“ ir „Istio“.
  • Esamos infrastruktūros pakeitimai.Didelė dalis programinės įrangos, nuo kurios esame priklausomi interneto infrastruktūrai, sensta ir yra išnaudojama. Tokių dalykų perrašymas programoje „Go“ suteikia daug privalumų - geresnį atminties saugumą, lengvesnį įvairių platformų diegimą ir švarų kodų bazę, kad ateityje būtų skatinama priežiūra. Naujas SSH serveris, vadinamas „Teleport“, ir nauja „Network Time Protocol“ versija yra rašomi „Go“ ir siūlomi kaip pakaitalai įprastiems partneriams.
  • Komunalinės paslaugos ir atskiros priemonės.„Go“ programos kaupia dvejetainius failus su minimaliomis išorinėmis priklausomybėmis. Todėl jie idealiai tinka kurti komunalines paslaugas ir kitus įrankius, nes jie greitai paleidžiami ir gali būti lengvai supakuoti perskirstymui.

Pasirinkite kalbos apribojimus

„Go“ vertinamas funkcijų rinkinys sulaukė ir pagyrų, ir kritikos. „Go“ yra klaidingas tuo, kad yra mažas ir lengvai suprantamas, o tam tikros savybės sąmoningai praleistos. Rezultatas yra tas, kad kai kurios funkcijos, kurios yra įprastos kitomis kalbomis, tiesiog nėra „Go“ tikslingai.

Viena iš tokių savybių yra bendrosios, leidžiančios funkcijai priimti daug skirtingų tipų kintamųjų. „Go“ neapima generinių vaistų, o kalbos tvarkytojai priešinasi jų pridėjimui, remdamiesi tuo, kad generikai pakenktų kalbos paprastumui. Galima išspręsti šį apribojimą, tačiau daugeliui kūrėjų vis tiek kyla nenuorama, kad tam tikru būdu į „Go“ būtų įtraukti generiniai vaistai. Buvo pateiktas bent vienas pasiūlymas dėl bendrinių vaistų diegimo „Go“, tačiau niekas nėra akmenyje.

Kitas „Go“ trūkumas yra sugeneruotų dvejetainių failų dydis. Pagal numatytuosius nustatymus „Go binaries“ yra kompaktiškai sukompiliuoti, o tai reiškia, kad viskas, ko reikia vykdymo metu, yra įtraukta į dvejetainį vaizdą. Šis metodas supaprastina kūrimo ir diegimo procesą, tačiau kainuoja paprastas „Sveikas, pasauli!“. sveriantis maždaug 1,5 MB 64 bitų „Windows“. „Go“ komanda stengėsi sumažinti šių dvejetainių failų dydį su kiekvienu paskesniu leidimu. Taip pat galima sumažinti „Go“ dvejetainius failus glaudinant arba pašalinant „Go“ derinimo informaciją. Ši paskutinė parinktis gali geriau veikti atskirose paskirstytose programose nei debesies ar tinklo tarnybose, kur derinimo informacijos naudinga, jei paslauga nepavyksta.

Dar viena reklamuojama „Go“ funkcija, automatinis atminties valdymas, gali būti vertinamas kaip trūkumas, nes šiukšlių surinkimui reikia tam tikro kiekio perdirbimo pridėtinių išlaidų. Pagal konstrukciją „Go“ neteikia rankinio atminties tvarkymo, o „Go“ šiukšlių surinkimas buvo kritikuojamas dėl to, kad jis netinkamai tvarko atminties apkrovas, kurios rodomos įmonės programose. Be to, „Go 1.8“ suteikia daug patobulinimų atminties tvarkymui ir šiukšlių surinkimui, kurie sumažina vėlavimo laiką. Žinoma, „Go“ kūrėjai turi galimybę naudoti rankinį atminties paskirstymą C plėtinyje arba per trečiosios šalies rankinio atminties tvarkymo biblioteką.

Programinės įrangos kultūra aplink kuriant turtingas „Go“ programų GUI, pvz., Darbalaukio programose, vis dar yra išsklaidyta.

Dauguma „Go“ programų yra komandinės eilutės įrankiai arba tinklo paslaugos. Be to, įvairūs projektai siekia sukurti turtingas „Go“ programų GUI. Yra susiejimai GTK ir GTK3 karkasams. Kitas projektas skirtas teikti platformos sąsajas, nors jos remiasi C susiejimais ir nėra parašytos grynai. „Windows“ vartotojai gali išbandyti vaikščiojimą. Tačiau šioje erdvėje neatsirado aiškaus laimėtojo ar saugaus ilgalaikio lažybų, o kai kurie projektai, pavyzdžiui, „Google“ bandymas sukurti kelių platformų GUI biblioteką, praėjo kelyje. Be to, kadangi „Go“ yra nepriklausoma nuo platformos, vargu ar kuri nors iš jų taps standartinio paketo rinkinio dalimi.

Nors „Go“ gali kalbėti su vietinės sistemos funkcijomis, jis nebuvo sukurtas žemo lygio sistemos komponentams, tokiems kaip branduoliai ar įrenginių tvarkyklės, arba įdėtosioms sistemoms kurti. Galų gale „Go“ vykdymo laikas ir „Go“ programų šiukšlių surinkėjas priklauso nuo pagrindinės OS. (Kūrėjai, norintys pažangiausios tokio pobūdžio kalbos, gali pažvelgti į „Rust“ kalbą.)

Eik kalbos ateities

Kitas „Go“ kūrimo etapas gali būti labiau paskatintas jo kūrėjų bazės norų ir poreikių, o „Go“ mąstytojai keičia kalbą, kad geriau pritaikytų šią auditoriją, o ne tik rodytų atkaklų pavyzdį. Kitaip tariant, „Go“ gali įgyti savybių, kurios iš pradžių nebuvo skirtos, pavyzdžiui, generiniai vaistai.

Aišku, kad „Golang“ kūrėjai nori šių dalykų. 2018 m. „Go“ naudotojų apklausoje generiniai vaistai buvo įtraukti į tris svarbiausius iššūkius siekiant platesnio „Go“ pritaikymo, taip pat geresnio priklausomybės ir paketų valdymo. Esamas generinių vaistų „GitHub“ pasiūlymas išlieka aktyvus kaip „Go 2.x“ pasiūlymas. Tokie pakeitimai gali padėti „Go“ užimti svarbesnę vietą įmonės plėtroje, kur šiuo metu karaliauja „Java“, „JavaScript“ ir „Python“.

Net ir be didesnių pakeitimų, galime tikėtis, kad „Go“ bus naudojamas labiau infrastruktūros atstatymo projektams, kaip aprašyta aukščiau aprašytuose SSH ir NTP pakaitaluose, ir kaip daugiakalbių projektų dalis.

Taip pat padaugėjo trečiųjų šalių „Go“ įrankių grandinės. „ActiveState“ „ActiveGo“ teikia komerciškai palaikomą „Go“ kalbos leidimą, o LLVM ir „gccgo“ projektai teikia visiškai licencijuotus atvirojo šaltinio „Go“ diegimus alternatyvių įrankių grandinių būdu.

Galiausiai „Go“ taip pat tapo pagrindu kuriant visiškai naujas kalbas, nors du to pavyzdžiai nustojo aktyviai vystytis. Vienas iš pavyzdžių buvo „Have“ kalba, kuri supaprastino „Go“ sintaksę, savaip įgyvendino kai kurias tas pačias sąvokas ir perkėlė į „Go“, kad būtų lengviau jas vykdyti. Kitas neveikiantis projektas - Odenas - naudojo „Go’s assembler“ ir „toolchain“, kad sudarytų naujai sukurtą kalbą, kuri papildomai įkvėpė tokių kalbų kaip Lisp ir Haskell.

Šis paskutinis projektų rinkinys iliustruoja vieną iš būdų, kaip bet kokia IT naujovė tampa išties revoliucinga - kai žmonės ją išardo ir panaudoja, radę niekada nenumatytų dizainerių. „Go“ kalbos, kaip įsilaužimo, ateitis dar tik prasideda. Tačiau jo, kaip pagrindinės programavimo kalbos, ateitis jau užtikrinta, be abejo, debesyje, kur „Go“ greitis ir paprastumas palengvina keičiamos apimties infrastruktūros, kurią galima išlaikyti ilgainiui, plėtrą.