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

Новости мира unix. Хотите узнать секрет вечного счастья? Откройте страницу 246.
Ответить
acolyte
Аватара пользователя
Сообщения: 1348
Зарегистрирован: 20.08.2022

#

Выпуск языка программирования Nim 2.2.10
Дата публикации:Sat, 25 Apr 2026 09:30:16 +0300

Представлен релиз языка системного программирования Nim 2.2.10. Nim – статически типизированный компилируемый язык программирования с синтаксисом, вдохновлённым Python, и возможностями метапрограммирования на уровне Lisp. Язык компилируется в C, C++ и JavaScript, обеспечивая производительность на уровне C при выразительности высокоуровневых языков. Код проекта поставляется под лицензией MIT.
Возможности Nim включают систему макросов, работающих на AST во время компиляции, поддержку обобщённого программирования с концептами, множественную диспетчеризацию (multiple dispatch), детерминированное управление памятью с поддержкой нескольких стратегий (ARC/ORC, refc, маркировка-и-подметание), встроенную поддержку async/await для асинхронного программирования и FFI для простой интеграции с C/C++/JavaScript. Nim позиционируется как системный язык, подходящий для разработки от встраиваемых систем до веб-серверов, с акцентом на эффективность, безопасность памяти и удобство разработки.
Изменения в языке и компиляторе:
  • Добавлен экспериментальный флаг "--experimental:typeBoundOps", реализующий RFC #380 и повышающий надёжность работы интерфейсов "hash", "$", "==" для именованных типов при непрямых импортах. Пример: import std/hashes type Obj* = object x*, y*: int z*: string proc `==`*(a, b: Obj): bool = a.x == b.x and a.y == b.y proc hash*(a: Obj): Hash = $!(hash(a.x) &! hash(a.y)) # main.nim {.experimental: "typeBoundOps".} from objs import Obj import std/tables var t: Table[Obj, int] t[Obj(x: 3, y: 4, z: "debug")] = 34 echo t[Obj(x: 3, y: 4, z: "ignored")] # 34 Исправлена ошибка, при которой "sizeof(T)" внутри шаблона "typedesc", вызываемого из when-выражения дженерика, приводил к ошибке компиляции.
Основные изменения, влияющие на обратную совместимость:
  • По умолчанию активирован флаг "-d:nimPreviewFloatRoundtrip". Функции "system.addFloat" и оператор "$" теперь используют алгоритм Dragonbox для генерации минимальных строковых представлений чисел с плавающей точкой с гарантиями корректного округления и обратимости преобразования. Для возврата к старому поведению доступен флаг "-d:nimLegacySprintf". Параметр "default" в функции "tables.getOrDefault" переименован в "def" во избежание конфликтов с "system.default". Код, использующий именованные аргументы "getOrDefault(..., default = ...)", требует обновления. При включении флага "-d:nimPreviewCheckedClose" функция "close" в модуле "std/syncio" теперь генерирует исключение при ошибках ввода-вывода. Неизвестные предупреждения и подсказки компилятора теперь генерируют предупреждение "warnUnknownNotes" вместо ошибок. С флагом "-d:nimPreviewAsmSemSymbol" в операторах asm/emit добавлена проверка типов для символов в обратных кавычках. Блок "except:" без указания типа теперь вызывает панику при перехвате "Defect". Для обработки рекомендуется использовать "except Exception:" или "except Defect:". Для миграции предусмотрен флаг "--legacy:noPanicOnExcept". С флагом "-d:nimPreviewCStringComparisons" операторы сравнения ({, >, {=, >=) для "cstring" переключены с семантики ссылок на семантику значений, аналогично "==" и "!=". Модуль std/parsesql вынесен в отдельный nimble-пакет; для установки требуется "nimble install parsesql" или использование менеджера atlas. С флагом "-d:nimPreviewDuplicateModuleError" импорт двух модулей с одинаковым именем становится ошибкой компиляции. Для разрешения коллизий рекомендуется использовать алиасы: "import foo as foo1". Добавлена опция "--mangle:nim|cpp" для выбора стиля манглинга имён при включённой отладочной информации (по умолчанию - cpp). Второй параметр функций succ, pred, inc, dec в модуле system теперь принимает тип "SomeInteger" вместо "Ordinal". Операторы битовых сдвигов (shl, shr, ashr) применяют битовую маску к правому операнду в бэкендах C/C++/VM/JS. Добавлено предупреждение "--warning:ImplicitRangeConversion", обнаруживающее потенциально опасные неявные преобразования к диапазонам меньшего размера (например, int -> range[0..255]), способные вызвать панику времени выполнения.
Нововведения в стандартной библиотеке:
  • В модуль "setutils" добавлены функции "symmetricDifference", оператор "-+-" и инлайн-версия "toggle" для эффективного вычисления симметрической разности битовых множеств. В "strutils.multiReplace" добавлена перегрузка для замены символов из набора за один проход - полезно для санитизации строк. В модуль std/files добавлены процедуры с поддержкой типа Path: getFilePermissions, setFilePermissions, tryRemoveFile, copyFile (с настраиваемым буфером и обработкой ссылок), copyFileWithPermissions, copyFileToDir. Экспортированы типы CopyFlag и FilePermission для тонкого контроля операций с файлами. Модуль std/dirs получил новые процедуры: copyDir и copyDirWithPermissions для рекурсивного копирования каталогов с сохранением атрибутов. В бэкендах refc, JS и VM реализована поддержка функции "system.setLenUninit" для типа "string", позволяющей изменять длину строки без инициализации новой памяти при расширении. В std/parseopt добавлена поддержка нескольких режимов парсинга аргументов командной строки через перечисление CliMode: Nim (по умолчанию), а также экспериментальные Lax и Gnu. В std/math оператор "^" теперь поддерживает вещественные числа в качестве показателя степени. Функции min, max и их аналоги из sequtils для openArray теперь принимают пользовательскую функцию сравнения. Оптимизирована реализация system.substr: при наличии используется copymem (обёртка над C memcpy). Функция system.newStringUninit помечена как свободная от побочных эффектов, что позволяет использовать её с флагом "--experimental:strictFuncs".
Инструменты и документация:
  • В генератор документации добавлен флаг "--raw" для отключения рендеринга разметки в JSON-выводе. Добавлен флаг "--stdinfile" для задания имени файла при запуске кода из stdin (по умолчанию - stdinfile.nim). Флаг "--styleCheck:warning" позволяет трактовать нарушения стилевых проверок как предупреждения, а не ошибки. В руководство добавлена документация по прагме completeStruct.
Исправлено более 30 ошибок, в том числе:
  • Ошибки работы new с ref object и генерации кода для кортежей в массивах; Проблемы с обработкой static-параметров и typedesc; Регрессии в системах управления памятью ORC/refc, включая выравнивание объектов и избыточные вызовы nimZeroMem; Ошибки парсинга в parseopt, parsecfg и генерации кода для бэкенда JavaScript; Утечки и падения при использовании замыканий, итераторов и больших объектов.
Новость позаимствована с opennet.ru
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=65282

Жизнь за Нер'зула!

Ответить