Вышел Go 1.21

t-vpv1gobsgq680xjeufqihdr0m.png

Состоялся релиз языка программирования Go 1.21. Этот проект развивает компания Google при участии сообщества как гибридное решение, сочетающее высокую производительность компилируемых языков с такими достоинствами скриптовых языков, как лёгкость написания кода, быстрота разработки и защищённость от ошибок. Исходный код языка Go распространяется под открытой лицензией BSD.

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

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

Основные изменения и доработки в выпуске Go 1.21:

  • реализована поддержка оптимизаций на основе результатов профилирования кода (PGO — Profile-guided optimization), учитывающих особенности, определяемые во время выполнения программы. Учёт профиля выполнения при сборке позволяет повысить производительность приложений на 2–7%. Оптимизации автоматически включаются при наличии файла default.pgo во время сборки, подготовленного утилитой pprof. Для выбора другого профиля предусмотрена опция »-pgo»;

  • в утилите go обеспечена прямая и обратная совместимость с другими версиями языка Go, что позволяет использовать старый инструментарий для сборки нового кода и наоборот;

  • добавлены встроенные функции min и max для выбора наименьшего/наибольшего значения, а также функция clear для удаления или обнуления всех элементов в структурах map или slice;

  • улучшен вывод типов в обобщённых функциях (дженериках), предназначенных для работы сразу с несколькими типами;

  • добавлена экспериментальная поддержка новой семантики обработки переменных в циклах, позволяющей избежать типовых ошибок из-за специфичного поведения при использовании замыканий и сопрограмм в итерациях. Новая семантика подразумевает создание для каждой итерации цикла отдельного экземпляра переменной, объявленной в цикле «for» при помощи оператора »:=»;

  • в стандартную библиотеку добавлены новые пакеты: — log/slog — функции для записи структурированных логов. — slices — типовые операции со срезами (slice) любых типов. Например, предложены функции для сортировки, более быстрые и гибкие, чем функции из пакета sort. — maps — полезные операции над отображениями (map) с любыми типами ключей и элементов. — cmp — функции для сравнений упорядоченных значений;

  • компилятор пересобран с включением PGO-оптимизаций, что позволило ускорить сборку программ на 2–4%;

  • проведена оптимизация сборщика мусора, позволившая до 40% уменьшить задержки в некоторых приложениях;

  • снижены накладные расходы при трассировке кода при помощи пакета runtime/trace на системах с архитектурой amd64 и arm64;

  • реализован экспериментальный порт (GOOS=wasip1, GOARCH=wasm) для компиляции в промежуточный код WebAssembly, использующий API WASI (WebAssembly System Interface) для обеспечения обособленного запуска.

© Habrahabr.ru