Po šesti měsících vývoje byl vydán programovací jazyk Go vyvinutý společností Google za účasti komunity jako verze 1.26. Jazyk kombinuje vysoký výkon kompilovaných jazyků s výhodami skriptovacích jazyků, jako je snadné psaní kódu, vysoká rychlost vývoje a ochrana proti chybám. Kód projektu je distribuován pod licencí BSD.
Syntaxe Go je založena na známých prvcích jazyka C s některými výpůjčkami z jazyka Oberon. Jazyk je poměrně stručný, ale kód je snadno čitelný a srozumitelný. Go kód je kompilován do samostatných binárních spustitelných souborů, které běží nativně, bez použití virtuálního stroje (profilování, ladicí moduly a další subsystémy pro identifikaci problémů za běhu jsou integrovány jako runtime komponenty), což umožňuje výkon srovnatelný s programy C.
Projekt je zpočátku vyvíjen s ohledem na vícevláknové programování a efektivní provoz na vícejádrových systémech. Například na úrovni operátora jsou implementovány nástroje pro organizaci paralelních výpočtů a interakci mezi paralelními metodami. Jazyk také poskytuje vestavěnou ochranu proti přetečení vyrovnávací paměti a funkce garbage collection.
Mezi změny v nové verzi:
- Sběrač odpadků „greenteagc“, určený ke zlepšení výkonu při vytváření a skenování malých objektů, je ve výchozím nastavení povolen. Aplikace, které intenzivně využívají sběrač odpadků, zaznamenaly při použití „greenteagc“ snížení režie sběru odpadků o 10–40 %.
- Vestavěná funkce new(), určená pro vytváření nových proměnných, nyní umožňuje zadat výraz jako operand, který určuje počáteční hodnotu proměnné. Například místo kódu x := int64(300) ptr := &x nyní můžete napsat: ptr := new(int64(300))
- Generické typy se mohou odkazovat samy na sebe jako argument v seznamu parametrů typu (typ můžete předat jeho vlastnímu parametru). V prvním řádku níže uvedeného příkladu již odkaz na sebe sama metodou Adder nezpůsobuje chybu: type Adder[A Adder[A]] interface { Add(A) A } func algo[A Adder[A]](x, y A) A { return x.Add(y) }
- Režie volání funkcí jazyka C z kódu Go pomocí cgo se sníží přibližně o 30 %.
- Běhové prostředí na 64bitových platformách implementuje randomizaci adresního prostoru při spuštění, což komplikuje predikci adres paměti při pokusu o zneužití zranitelností v kódu C, ke kterým se přistupuje přes cgo. Pro zakázání randomizace je k dispozici možnost „GOEXPERIMENT=norandomizedheapbase64“.
- Počet situací, kdy kompilátor alokuje paměť pro segmenty na zásobníku místo na haldě, byl rozšířen, což má pozitivní vliv na výkon.
- Příkaz „go fix“ byl kompletně přepsán s využitím balíčku analysis, který poskytuje funkce statistické analýzy kódu. Byla přidána podpora pro analyzátory dostupné v balíčku modernize, které navrhují zjednodušení kódu na základě nových jazykových a standardních funkcí. Byl přidán „inline“ analyzátor pro inline rozšíření všech volání funkcí označených direktivou „//go:fix inline“.
- Byly přidány nové balíčky crypto/hpke (implementace HPKE — hybridní šifrování s veřejným klíčem), crypto/mlkem/mlkemtest a testing/cryptotest.
- Přidán experimentální balíček simd/archsimd, který poskytuje nízkoúrovňový přístup k provádění vektorových operací pomocí instrukcí SIMD na systémech AMD64.
- Přidán experimentální runtime/secret balíček pro bezpečné vymazání (nulování) dočasné paměti alokované během provádění zadané funkce.
- Do balíčku runtime/pprof byl přidán experimentální profil goroutineleak pro detekci úniků goroutin.
Zdroj: opennet.ru
