Выпуск мовы праграмавання Go 1.18

Прадстаўлены рэліз мовы праграмавання Go 1.18, які развіваецца кампаніяй Google пры ўдзеле супольнасці як гібрыднае рашэнне, якое спалучае высокую прадукцыйнасць кампіляваных моў з такімі добрымі якасцямі скрыптовых моў, як лёгкасць напісання кода, шпаркасць распрацоўкі і абароненасць ад памылак. Код праекту распаўсюджваецца пад ліцэнзіяй BSD.

Сінтаксіс Go заснаваны на звыклых элементах мовы Сі з асобнымі запазычаннямі з мовы Python. Мова дастаткова лаканічны, але пры гэтым код лёгка чытаецца і ўспрымаецца. Код на мове Go кампілюецца ў адасобленыя бінарныя выкананыя файлы, выкананыя нативно без выкарыстання віртуальнай машыны (модулі прафілявання, адладкі і іншыя падсістэмы выяўлення праблем на этапе выканання інтэгруюцца ў выглядзе runtime-кампанентаў), што дазваляе дамагчыся прадукцыйнасці, супастаўнай з праграмамі на мове Сі.

Праект першапачаткова распрацоўваецца з аглядкай на шматструменнае праграмаванне і эфектыўную работу на шмат'ядравых сістэмах, у тым ліку даючы рэалізаваныя на ўзроўні аператараў сродкі для арганізацыі паралельных вылічэнняў і ўзаемадзеяння паміж метадамі, якія паралельна выконваюцца. Мова таксама дае ўбудаваныя сродкі абароны ад выхаду за дапушчальныя вобласці выдзеленых блокаў памяці і забяспечвае магчымасць выкарыстання зборшчыка смецця.

У новай версіі дададзена падтрымка абагульненых функцый і тыпаў (джэнерыкаў), пры дапамозе якіх распрацоўшчык можа вызначыць і выкарыстоўваць функцыі, прызначаныя для працы адразу з некалькімі тыпамі. Таксама дадзена магчымасць выкарыстання інтэрфейсаў для стварэння камбінаваных тыпаў, якія ахопліваюць некалькі тыпаў дадзеных. Падтрымка джэнерыкаў рэалізавана без парушэння зваротнай сумяшчальнасці з існуючым кодам. // Сумаванне значэнняў набору, якое працуе для тыпаў int64 і float64 func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V { var s V for _, v := range m { s += v } return s } // Іншы варыянт з абагульненым вызначэннем тыпу: type Number interface { int64 | float64 } func SumNumbers[K comparable, V Number](m map[K]V) V { var s V for _, v := range m { s += v } return s }

Іншыя паляпшэнні:

  • У штатны інструментар інтэграваныя ўтыліты для fuzzing-тэставанні кода. Падчас fuzzing-тэставанні ажыццяўляецца генерацыя струменя разнастайных выпадковых камбінацый уваходных дадзеных і фіксацыя магчымых збояў падчас іх апрацоўкі. Калі нейкая паслядоўнасць прыводзіць да краху ці не адпавядае чаканай рэакцыі, то такія паводзіны з высокай верагоднасцю сведчаць пра памылку ці ўразлівасці.
  • Дададзена падтрымка магомодульных працоўных прастор, якія дазваляюць выконваць каманды адразу для некалькіх модуляў, што дазваляе адначасова збіраць і запускаць код у некалькіх модулях.
  • Праведзена значная аптымізацыя прадукцыйнасці для сістэм на базе працэсараў Apple M1, ARM64 і PowerPC64. Уключана магчымасць выкарыстання рэгістраў замест стэка для перадачы аргументаў у функцыі і вяртання выніку. Палепшана inline-разгортванне цыклаў кампілятарам. Цалкам перароблена праверка тыпаў у кампілятары. У асобных тэстах у параўнанні з мінулым выпускам адзначаецца павышэнне прадукцыйнасці кода на 20%, але сама кампіляцыя стала выконвацца прыкладна на 15% даўжэй.
  • У runtime падвышаная эфектыўнасць вяртання вызваленай памяці аперацыйнай сістэме і палепшаная праца зборшчыка смецця, паводзіны якога сталі больш прадказальнымі.
  • У стандартную бібліятэку дададзены новыя пакеты net/netip і debug/buildinfo. У кліенцкім кодзе па змаўчанні адключаная падтрымка TLS 1.0 і 1.1. У модулі crypto/x509 спынена апрацоўка сертыфікатаў з подпісам на базе хэша SHA-1.
  • Паднятыя патрабаванні да асяроддзя ў Linux, для працы зараз неабходна наяўнасць ядра Linux прынамсі версіі 2.6.32. У наступным выпуску аналагічныя змены чакаюцца для FreeBSD (будзе спынена падтрымка галінкі FreeBSD 11.x) і для рабты запатрабуецца наяўнасць прынамсі FreeBSD 12.2.

Крыніца: opennet.ru

Дадаць каментар