Ekipi i Google ka lançuar versionin 1.22 të gjuhës programuese Go, e cila po zhvillohet si një zgjidhje hibride që kombinon performancën e lartë të gjuhëve të kompilueshme me avantazhet e gjuhëve skriptimi, si lehtësia në kodim, shpejtësia e zhvillimit dhe mbrojtja nga gabimet. Kodi i projektit shpërndahet nën licencën BSD.
Sintaksa e Go është e bazuar në elemente të njohura nga gjuha C, me disa huazime nga gjuha Oberon. Gjuha është mjaft e shkurtër, por kodi lexohet dhe perceptohet lehtësisht. Kodi në gjuhën Go kompiloihet në skedarë të veçantë ekzekutivë, të cilët ekzekutohen natyrisht, pa përdorur makineri virtuale (modulet e profilimit, debugging dhe nën-sistemet e tjera për zbulimin e problemeve integrohen si komponentë runtime), duke lejuar arritjen e performancës së ngjashme me programet në gjuhën C.
Projekti është zhvilluar fillimisht me mendimin për programimin me shumë thirrje dhe funksionimin efikas në sisteme me shumë bërthama, përfshirë ofrimin e mjeteve të realizuara në nivel operatorësh për organizimin e llogaritjeve paralel dhe bashkëpunimin midis metodave që ekzekutohen paralelisht. Gjuha gjithashtu ofron mjete të integruara për mbrojtjen nga dalja në zonat e lejuara të blloqeve të memories të ndara dhe siguron mundësinë e përdorimit të mbledhësit të plehrave.
Mes ndryshimeve në versionin e ri:
- Në ciklet "for" është shtuar mbështetje për përcaktimin e intervaleve nga numrat e plotë, për shembull, për të iteruar vlerat nga 0 në 9 tani mund të përdoret cikli "for i := range 10 {...}".
- Në ciklet "for" është shtuar një mbështetje eksperimentale (GOEXPERIMENT=rangefunc) për funksionet e përcaktimit të intervaleve, duke lejuar caktimin e një funksioni si iterues. Për shembull, "for i, x := range slices.Backward(s) {...}"
- Problemi i gjatë me ciklet "for" që shkaktonte ndarjen e variablave të ciklit të thirrur në bashkëpunime (goroutine) në iteracione të ndryshme është zgjidhur. Për shembull, kodi values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } tani do të printojë "a", "b" dhe "c", dhe jo vetëm "c" si më parë.
- ĂshtĂ« optimizuar puna me memorien nĂ« runtime, e cila ka rezultuar nĂ« njĂ« rritje tĂ« performancĂ«s prej 1-3% dhe njĂ« reduktim tĂ« ndjeshĂ«m tĂ« konsumit tĂ« memories nĂ« shumicĂ«n e aplikacioneve prej 1%.
- Ka punuar për angazhimin në kompajlerin optimizimeve të bazuara në rezultatet e profilizimit të kodit (PGO - optimizimi i udhëhequr nga profili), që lejon të marrë parasysh karakteristikat e përcaktuara gjatë ekzekutimit të programit. Në versionin e ri, kompajleri ka përdorur mjete devirtuazimi për të zëvendësuar thirrjet jo të drejtpërdrejta të mënyrave të ndryshme me ekzekutimin e blloqeve inline të shtrira.
- Me aktivizimin e PGO, ndryshimi i shtuar ka lejuar rritjen e performancës së shumicës së programeve nga 2-14%.
- Kompajleri ka shtuar një zbatim eksperimental (GOEXPERIMENT=newinliner) të përmirësuar të mekanizmit të zhvillimit (inlining) të thirrjeve, duke përdorur heuristikën për të ndarë operacionet e rëndësishme nga ato dytësore.
- Biblioteka standarde ka shtuar paketën 'math/rand/v2', ku është propozuar një API më gjithëpërfshirës dhe janë përdorur algoritme më të shpejta për gjenerimin e numrave pseudo-rastësorë.
- Paketës net/http.ServeMux i është shtuar mundësia për të specificuar metodat dhe maskat në shabllone, për shembull, shablloni 'GET /static/{id}/' do të aplikohet në kërkesat me metodën HTTP 'GET' dhe do të mbajë vlerën e segmentit të dytë të rrugës së kërkuar në identifikuesin 'id'.
- Paketës database/sql i është shtuar mbështetje për tipin Null[T], që lejon skanimin e kolonave që mund të pranojnë vlerën NULL. Paketës slices i është shtuar funksioni Concat për të bashkuar disa slices të çdo tipi.
- Në komandat për punën me hapësirat e punës (koleksione modulash) është ofruar mundësia për përdorimin e katalogut 'vendor', që përmban varësitë për përmbajtjen e hapësirës së punës. Katalogu krijohet gjatë ekzekutimit të komandës 'go work vendor' dhe përdoret në komandat e ndërtimit duke vendosur opsionin '-mod=vendor' (ekskluzivisht kur ka një katalog vendor).
Ndryshimet në sjelljen e utiliteteve.
- go get nuk mbështetet më jashtë modulit në modalitetin e vjetruar GOPATH (dmth me GO111MODULE=off). Komandat e tjera të ndërtimit, si go build dhe go test, do të vazhdojnë të punojnë për programet e vjetra GOPATH për një periudhë të paçaktuar.
- go mod init nuk përpiqet më të importojë kërkesat për modulet nga skedarët e konfigurimit për mjete të tjera ofruesish (siç është Gopkg.lock).
- go test -cover tani tani printon të dhënat përmbledhëse mbi mbulimin për paketat e mbuluara që nuk kanë skedat e tyre të testeve. Para Go 1.22, go test -cover për një paketë të tillë do të raportonte? mymod/mypack [nuk ka skeda testimi]
dhe tani me Go 1.22 funksionet në paketë konsiderohen të pambuluara: mymod/mypack coverage: 0.0% e deklaratave. Vini re: nëse paketa nuk ka kode ekzekutiv, ne nuk mund të raportojmë një përqindje mbulimi të rëndësishme; për paketat e tilla go test do të vazhdojë të raportojë për mungesën e skedarëve të testeve.
- Ndërfaqja web e mjetit trace është përmirësuar pak në kuadër të mbështetjes për ndjekësi të ri, janë zgjidhur disa probleme dhe është përmirësuar lexueshmëria e faqeve të ndryshme. Ndërfaqja web tani mbështet studimin e ndjekjeve në një pamje të orientuar nga rrjedha. Shikuesi i ndjekjes gjithashtu tregon përfundimin e plotë të të gjitha thirrjeve sistemike. Këto përmirësime janë të aplikueshme vetëm për shikimin e ndjekjeve të krijuara nga programet e krijuara në Go 1.22 ose më të reja. Në lëshimin e ardhshëm, disa nga këto përmirësime do të aplikohen në ndjekjet e krijuara nga versionet e vjetra të Go.
- Mjedisi i ekzekutimit tani ruan metadata të mbledhjes së plehrave në bazë të tipeve më afër çdo objekti të heaps. Ky ndryshim gjithashtu zvogëlon kostot e memories për shumicën e aplikacioneve Go me rreth 1% përmes deduplikimit të metadata-ve të tepërta. Në disa aplikacione, përmirësimi mund të jetë më i vogël, pasi ky ndryshim korrigjon kufijtë e klasës së madhësisë së alokuesit të memories, kështu që disa objekte mund të zhvendosen në një klasë madhësie më të madhe. Pasojat e këtij ndryshimi janë se adresat e disa objekteve, të cilat më parë ishin gjithmonë të rregulluara në kufirin 16 byte (ose më lart), tani do të jenë të rregulluara vetëm në kufirin 8 byte. Disa aplikacione që përdorin instrukcione assembler që kërkojnë që adresat e memories të rregullohen në një madhësi më të madhe se 8 byte dhe mbështeten në sjelljen e mëparshme të rregullimit të alokuesit të memories, mund të dështojnë, por ne presim që këto aplikacione të jenë të rralla. Këto aplikacione mund të krijohen me GOEXPERIMENT=noallocheaders me mundësinë e kthimit në modelin e mëparshëm të metadata-s dhe rikthimin e sjelljes së mëparshme të rregullimit, por pronarët e paketave duhet të azhurnojnë kodin e tyre assembler për të shmangur supozimin mbi rregullimin, pasi ky kalim do të hiqet në lëshimin e ardhshëm.
- Siç u përmend në shënimet për lëshimin Go 1.20, Go 1.22 tani kërkon versionin përfundimtar Go 1.20 ose më të ri për ndërtimin fillestar. Ne presim që Go 1.24 do të kërkojë versionin përfundimtar Go 1.22 ose një version më të ri për ndërtimin fillestar.
Origjinali (go.dev)
Burimi: linux.org.ru
