Izlaista programmēšanas valodas Go 1.22 versija, ko attīsta uzņēmums Google sadarbībā ar kopienu, kā hibrīdrisinājums, kas apvieno augstu kompilējamu valodu sniegumu ar skriptu valodu priekšrocībām, piemēram, vieglu kodēšanu, ātru izstrādi un kļūdu novēršanu. Projekta kods tiek izplatīts ar BSD licenci.
Go sintakse balstās uz pazīstamiem C valodas elementiem ar atsevišķām aizgūtām daļām no Oberon valodas. Valoda ir samērā lakoniska, taču kods ir viegli lasāms un uztverams. Go valodā uzrakstītais kods tiek kompilēts atsevišķos bināros izpildāmos failos, kas tiek izpildīti natively, neizmantojot virtuālo mašīnu (profilēšanas, atkļūdošanas un citu problēmu noteikšanas apakšsistēmas integrējas kā runtime komponentes), kas ļauj sasniegt veiktspēju, kas līdzinās C valodā rakstītām programmām.
Projekts sākotnēji tiek izstrādāts ar skatījumu uz daudzviedo programmēšanu un efektīvu darbu uz daudzkodolu sistēmām, tostarp nodrošinot līdzekļus, kas īstenoti operatoru līmenī, lai organizētu paralēlos aprēķinus un mijiedarbību starp paralēli izpildītām metodēm. Valoda arī nodrošina iebūvētus līdzekļus aizsardzībai pret pārsniegtajām atmiņas blokiem un nodrošina iespēju izmantot atkritumu savācēju.
Starp jaunumiem jaunajā laidienā:
- Ciklām „for” pievienota atbalsts veselu skaitļu diapazonu noteikšanai, piemēram, lai pārvietotos cauri vērtībām no 0 līdz 9, tagad var izmantot ciklu „for i := range 10 {…}”.
- Ciklām „for” pievienots eksperimentāls (GOEXPERIMENT=rangefunc) atbalsts diapazona funkciju noteikšanai, kas ļauj norādīt funkciju kā itertoru. Piemēram, „for i, x := range slices.Backward(s) {…}”
- Atrisināta senā problēma ar „for” cikliem, kas radīja koplietošanas mainīgās cikla dažādās iterācijās, izsaucot korutīnas (goroutine). Piemēram, kods values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true }() } tagad izvadīs „a”, „b” un „c”, nevis tikai „c”, kā bija iepriekš.
- Veikta atmiņas optimizācija runtime, kas noveda pie veiktspējas uzlabošanās par 1-3% un atmiņas patēriņa samazināšanās lielākajā daļā lietojumprogrammu par 1%.
- Turpināta optimizāciju, balstoties uz koda profilēšanas rezultātiem (PGO — Profile-guided optimization), iekļaušana kompilatorā, kas ļauj ņemt vērā programmas izpildes laikā noteiktās īpašības. Jaunajā versijā kompilatorā tika iestrādāti devirtualizācijas rīki, lai aizstātu netiešos izsaukumus ar detalizētiem inline blokiem.
- Iekļaujot PGO, veiktās izmaiņas ļāva paaugstināt vairuma programmu veiktspēju par 2-14%.
- Kompilatorā pievienota eksperimentāla (GOEXPERIMENT=newinliner) uzlabota izsaukumu attiecību izpildes (inlining) realizācija, kas izmanto heuristiku svarīgu un sekundāru operāciju atdalīšanai.
- Standarta bibliotēkā pievienots pakotne «math/rand/v2», kurā piedāvāts visaptverošāks API un izmantoti ātrāki pseudo-nejaušo skaitļu ģenerēšanas algoritmi.
- Pakotnei net/http.ServeMux pievienota iespēja norādīt metodes un maskas šablonos, piemēram, šablons «GET /static/{id}/» tiks piemērots pieprasījumiem ar HTTP metodi «GET» un saglabās otrā segmenta pieprasītā ceļa vērtību identifikatorā «id».
- Pakotnei database/sql pievienota Null[T] tipa atbalsts, kas ļauj skenēt kolonnas, kurās var būt NULL vērtība. Pakotnei slices pievienota Concat funkcija, lai apvienotu vairākus sīklokus jebkura tipa.
- Komandās darbam ar darba telpām (moduļu kolekcijām) ir izveidota iespēja izmantot «vendor» katalogu, kas satur atkarības no darba telpas satura. Katalogs tiek izveidots, izpildot komandu «go work vendor», un tiek izmantots būvniecības komandās, izmantojot opciju "-mod=vendor" (iekļauts pēc noklusējuma, ja katalogs vendor ir pieejams).
Izmaiņas utilītu darbībā.
- go get vairs netiek atbalstīts ārpus moduļa novecojusi GOPATH režīmā (proti, ar GO111MODULE=off). Citas būvniecības komandas, piemēram, go build un go test, turpinās darboties novecojušām GOPATH programmām noteiktā laikā.
- go mod init vairs nemēģina importēt moduļu prasības no citu piegādātāju konfigurācijas failiem (piemēram, Gopkg.lock).
- go test -cover tagad izdrukā pārskatu par pārklājumu pakotnēm, kurām nav savu testu failu. Līdz Go 1.22 go test -cover šādai pakotnei ziņoja? mymod/mypack [nav testu failu]
un tagad ar Go 1.22 funkcijas pakotnē tiek uzskatītas par nepārklātām: mymod/mypack coverage: 0.0% no paziņojumiem. Lūdzu, ņemiet vērā: ja pakotnē vispār nav izpildāma kodē, mēs nevaram ziņot par jēgpilnu pārklājuma procentu; šādām pakotnēm go test turpinās ziņot par testu failu trūkumu.
- Rīka trace tīmekļa saskarne ir nedaudz atjaunināta, strādājot pie jaunā izsekošanas rīka atbalsta, tika novērstas dažas problēmas un uzlabota dažādu lapu lasāmība. Tīmekļa saskarne tagad atbalsta izsekošanas pētīšanu plūsmā orientētā skatījumā. Izsekošanas rīks tagad arī parāda visu sistēmas izsaukumu kopējo ilgumu. Šie uzlabojumi attiecas tikai uz izsekošanas skatīšanu, ko radījušas programmas, kas izstrādātas Go 1.22 vai jaunākās versijās. Nākamajā laidienā daži no šiem uzlabojumiem tiks iekļauti izsekojumos, ko rada vecākas Go versijas.
- Izpildes vide tagad uzglabā atkritumu savākšanas metadatus, kas pamatojās uz tipu tuvāk katram heap objektam. Šis uzlabojums arī samazina lielākās daļas Go programmu atmiņas izmaksas aptuveni par 1% pateicoties lieko metadatu deduplicei. Dažās programmās uzlabojums var būt mazāks, jo šis uzlabojums koriģē atmiņas sadalītāja izmēra robežu klases, tāpēc daži objekti var tikt pārvietoti uz augstāku izmēra klasi. Šī uzlabojuma sekas ir tādas, ka dažiem objektiem, kuri agrāk vienmēr tika izlīdzināti uz 16 bajtu (vai lielāku) robežas, tagad būs izlīdzinājums tikai uz 8 bajtu robežas. Dažas programmas, kas izmanto assembler instrukcijas, kurām nepieciešami, lai atmiņas adreses būtu izlīdzinātas vairāk nekā 8 bajtu izmēra un paļaujas uz iepriekšējo atmiņas sadalītāja izlīdzināšanas uzvedību, var izkrist no darba, bet mēs sagaidām, ka šādas programmas būs retas. Šādas programmas var tikt izveidotas ar GOEXPERIMENT=noallocheaders ar iespēju atgriezties pie vecā metadatu modeļa un atjaunot iepriekšējo izlīdzināšanas uzvedību, bet iepakojuma īpašniekiem būtu jāatjaunina savs assembler kods, lai izvairītos no izlīdzināšanas pieņēmuma, jo šis apiet var tikt izņemts nākamajā laidienā.
- Kā minēts Go 1.20 izlaiduma piezīmēs, Go 1.22 tagad prasa Go 1.20 vai jaunāku beigu versiju sākotnējai kompilācijai. Mēs sagaidām, ka Go 1.24 prasīs Go 1.22 vai jaunāku beigu versiju sākotnējai kompilācijai.
Oriģināls (go.dev)
Avots: linux.org.ru
