Випуск мови програмування 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

Додати коментар або відгук