Выпуск языка программирования Go 1.26

После шести месяцев разработки представлен релиз языка программирования Go 1.26, развиваемого компанией Google при участии сообщества. Язык сочетает высокую производительность, свойственную компилируемым языкам, с такими достоинствами скриптовых языков, как простота написания кода, высокая скорость разработки и защита от ошибок. Код проекта распространяется под лицензией BSD.

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

Проект изначально разрабатывается с оглядкой на многопоточное программирование и эффективную работу на многоядерных системах. Например, на уровне операторов реализованы средства для организации параллельных вычислений и взаимодействия между параллельно выполняемыми методами. Язык также предоставляет встроенные средства защиты от выхода за границы буфера и обеспечивает возможность использования сборщика мусора.

Среди изменений в новом выпуске:

  • Включён по умолчанию сборщик мусора «greenteagc», рассчитанный на повышения производительности создания и сканирования мелких объектов. В приложениях, в которых активно применяется сборка мусора, при использовании «greenteagc» отмечается сокращение накладных расходов на сборку мусора на 10–40%.

  • Во встроенной функции new (), предназначенной для создания новых переменных, появилась возможность указания выражения в качестве операнда, определяющего начальное значение переменной. Например, вместо кода
     
       x := int64(300)
       ptr := &x
    

    теперь можно писать:

     
       ptr := new(int64(300))
    
  • В обобщённых типах (generic) разрешено ссылаться на самого себя в качестве аргумента в списке собственных параметров типа (можно передать тип в свой же параметр). В примере ниже ранее ссылка Adder на самого себя в первой строке не допускалась:
       type Adder[A Adder[A]] interface {
           Add(A) A
       }
       func algo[A Adder[A]](x, y A) A {
           return x.Add(y)
       }
    
  • Накладные расходы при вызове функций на языке Си из кода на языке Go при помощи cgo снижены примерно на 30%.

  • На 64-разрядных платформах в runtime при запуске реализована рандомизация адресного пространства, что усложняет предсказание адресов в памяти при попытках эксплуатации уязвимостей в Си-коде, задействованном через cgo. Для отключения рандомизации предложена опция «GOEXPERIMENT=norandomizedheapbase64».

  • Расширено число ситуаций, в которых компилятор выделяет память для слайсов в стеке, а не в куче, что положительно сказывается на производительности.

  • Реализация команды «go fix» полностью переписана с использованием пакета analysis, предоставляющего функциональность для статистического анализа кода. Добавлена поддержка доступных в пакете modernize анализаторов, предлагающих правки для упрощения кода с учётом новых возможностей языка и стандартной библиотеки. Добавлен анализатор «inline» для inline-развёртывания всех вызовов функций, помеченных директивой »//go: fix inline».

  • Добавлены новые пакеты crypto/hpke (реализация HPKE — Hybrid Public Key Encryption), crypto/mlkem/mlkemtest и testing/cryptotest.

  • Добавлен экспериментальный пакет simd/archsimd, предоставляющий низкоуровневый доступ к выполнению векторных операций с использованием инструкций SIMD на системах с архитектурой AMD64.

  • Добавлен экспериментальный пакет runtime/secret для безопасной очистки (обнулению) временной памяти, выделенной при выполнении указанной функции.

  • В пакет runtime/pprof добавлен экспериментальный профиль goroutineleak для выявления утечек сопрограмм (goroutine).



Источник: http://www.opennet.ru/opennews/art.shtml? num=64773

OpenNet прочитано 823 раза