Versioni i gjuhës së programimit Go 1.22 është publikuar, i cili zhvillohet nga kompania Google me ndihmën e komunitetit si një zgjidhje hibride, duke kombinuar performancën e lartë të gjuhëve të kompiluara me avantazhet e gjuhëve të skriptit, si lehtësia e kodimit, 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 huazime të veçanta nga gjuha Oberon. Gjuha është mjaft e shkurtër, por kodi është lehtësisht i lexueshëm dhe i kuptueshëm. Kodi në gjuhën Go kompilohet në skedarë ekzekutivë binarë të veçante, që ekzekutohen në mënyrë natyrale, pa përdorimin e një makine virtuale (modulet e profilizimit, debugging dhe nën-sistemet e tjera për zbulimin e problemeve integrohen si komponentë runtime), që lejon arritjen e performancës, e cila është e krahasueshme me programet në gjuhën C.
Projekti është zhvilluar fillimisht me një fokus në programimin multithread dhe punimin efikas në sisteme me shumë bërthama, duke ofruar gjithashtu mjete të realizuara në nivelin e operatorëve për organizimin e llogaritjeve paralel dhe ndërlidhjen mes metodave që ekzekutohen paralelisht. Gjuha gjithashtu ofron mjete të integruara për mbrojtjen nga dalja jashtë zonave të lejuara të bllokimeve të memorjes dhe siguron mundësinë e përdorimit të mbledhësit të plehrave.
Ndryshimet në publikimin e ri përfshijnë:
- NĂ« ciklet "for" Ă«shtĂ« shtuar mbĂ«shtetje pĂ«r pĂ«rcaktimin e intervaleve tĂ« numrave tĂ« plota, pĂ«r shembull, pĂ«r tĂ« iteruar vlerat nga 0 nĂ« 9 tani mund tĂ« pĂ«rdorim ciklin "for i := range 10 {âŠ}".
- NĂ« ciklet "for" Ă«shtĂ« shtuar mbĂ«shtetje eksperimentale (GOEXPERIMENT=rangefunc) pĂ«r funksionet e pĂ«rcaktimit tĂ« gamĂ«s, duke lejuar pĂ«rcaktimin e njĂ« funksioni si itereator. PĂ«r shembull, "for i, x := range slices.Backward(s) {âŠ}"
- ĂĂ«shtja e vjetĂ«r me ciklet 'for', e cila shkaktonte ndarjen e variablave tĂ« ciklit nĂ« itera tĂ« ndryshme gjatĂ« thirrjes sĂ« korutinave (goroutine), Ă«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ç ndodhte mĂ« parĂ«.
- ĂshtĂ« optimizuar funksionimi me memorjen nĂ« runtime, çka ka sjellĂ« njĂ« rritje prej 1-3% nĂ« performancĂ« dhe njĂ« ulje tĂ« konsumit tĂ« memorjes nĂ« shumicĂ«n e aplikacioneve me 1%.
- Punët janë vazhduar për aktivizimin e optimizimeve në kompilator bazuar në rezultatet e profilizimit të kodit (PGO - Profile-guided optimization), që lejojnë marrjen parasysh të karakteristikave që përcaktohen gjatë ekzekutimit të programit. Në versionin e ri janë aktivizuar mjete devirtualizimi të cilat zëvendësojnë thirrjet e drejtpërdrejta të metodave të ndryshme me ekzekutimin e bllokëve të zgjeruar inline.
- Me aktivizimin e PGO, ndryshimi i shtuar ka lejuar rritjen e performancës së shumicës së programeve me 2-14%.
- Në kompilator është shtuar një implementim eksperimental (GOEXPERIMENT=newinliner) i përmirësuar i mekanizmit të zhvillimit (inlining) të thirrjeve, i cili përdor heuristika për të ndarë operacionet e rëndësishme nga ato dytësore.
- Në bibliotekën standarde është shtuar paketa 'math/rand/v2', në të cilën ofrohet një API më gjithëpërfshirës dhe janë përdorur algoritme më të shpejtë për gjenerimin e numrave pseudoreal.
- Në paketën net/http.ServeMux është shtuar mundësia e specifikimit të metodave dhe maskave në trajtimet, për shembull, trajtimi 'GET /static/{id}/' do të aplikohet në kërkesat me metodën HTTP 'GET' dhe do të ruajë vlerën e segmentit të dytë të rrugës së kërkuar në identifikuesin 'id'.
- Në paketën database/sql është shtuar mbështetje për tipin Null[T], i cili lejon skanimin e kolonave që mund të pranojnë vlerën NULL. Në paketën slices është shtuar funksioni Concat për kombinimin e disa slice-ve të çdo lloji.
- Në komandat për punimin me hapësirat e punës (koleksionet e modulave) është ofruar mundësia e përdorimit të direktoriumit 'vendor', që përmban varësitë nga përmbajtja e hapësirës së punës. Direktoriumi krijohet kur ekzekutohet komanda 'go work vendor' dhe përdoret në komandat e ndërtimit me opsionin '-mod=vendor' (aktivizohet si standard kur ekziston direktoriumi vendor).
Ndryshime në sjelljen e utiliteteve.
- go get nuk mbështetet më jashtë modulit në modin e vjetëruar GOPATH (dmth me GO111MODULE=off). Komandat e tjera të ndërtimit, si go build dhe go test, do të vazhdojnë të funksionojnë për programet në modin e vjetëruar GOPATH për një kohë të pacaktuar.
- 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 Gopkg.lock).
- go test -cover tani printon përmbledhje të mbulimit për paketat që mbulohen, të cilat nuk kanë skedarë të tyre të testit. Deri në Go 1.22, go test -cover për një paketë të tillë do të raportonte? mymod/mypack [no test files]
dhe tani me Go 1.22 funksionet në paketë konsiderohen të pambuluara: mymod/mypack coverage: 0.0% e deklaratave Vini re: nëse paketa në tërësi nuk përmban kod ekzekutiv, ne nuk mund të raportojmë një përqindje të rëndësishme mbulimi; për këto paketa go test do të vazhdojë të raportojë për mungesën e skedarëve të testeve.
- Ndërfaqja e uebit të mjetit trace është përditësuar pak në kuadër të mbështetjes për gjurmuesin e ri, janë zgjidhur disa probleme dhe është përmirësuar lexueshmëria e faqeve të ndryshme. Ndërfaqja e uebit tani mbështet shqyrtimin e gjurmëve në një pamje të orientuar drejt rrjedhës. Shikuesi i gjurmës tani gjithashtu tregon kohën e plotë të gjitha thirrjeve sistemike. Këto përmirësime janë të aplikueshme vetëm për shikimin e gjurmëve të krijuara nga programet e ndërtuara në Go 1.22 ose më të re. Në versionin e ardhshëm, disa nga këto përmirësime do të përfshihen në gjurmët e krijuara nga versioni i vjetër i Go.
- Mjedisi i ekzekutimit tani ruan metadatën e mbledhjes së mbeturinave në bazë të tipeve më afër çdo objekti në kënd. Ky ndryshim gjithashtu ul kostot e memories së shumicës së programeve Go rreth 1% përmes dedupikimit të metadata-ve të tepërta. Në disa programe, përmirësimi mund të jetë më i vogël, pasi ky ndryshim korrigjon kufijtë e klasës së madhësisë së shpërndarësit të memories, kështu që disa objekte mund të zhvendosen në një klasë madhësie më të lartë. Si pasojë e këtij ndryshimi, adresat e disa objekteve, të cilat më parë janë qenë gjithmonë të përputhura me kufirin 16 byte (ose më lart), tani do të përputhen vetëm me kufirin 8 byte. Disa programe që përdorin instrukcione assembler, të cilat kërkojnë që adresat e memories të jenë të përputhura me një madhësi më shumë se 8 byte dhe mbështeten në sjelljen e mëparshme të përputhjes së shpërndarësit të memories, mund të dështojnë, por ne presim që ato programe të jenë të rralla. Të tilla programe mund të krijohen me GOEXPERIMENT=noallocheaders me mundësinë për të rikthyer modelin e mëparshëm të metadata-ve dhe rikthimin e sjelljes së mëparshme të përputhjes, por pronarët e paketave duhet të përditësojnë kodin e tyre assembler për të shmangur supozimin për përputhjen, pasi ky anashkalim do të hiqet në versionin e ardhshëm.
- Siç u përmend në shënimet e lëshimit të Go 1.20, Go 1.22 tani kërkon versionin përfundimtar të 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 të Go 1.22 ose një version më të ri për ndërtimin fillestar.
Origjinali (go.dev)
Burimi: linux.org.ru
