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

Представлен релиз языка системного программирования 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;
  • Утечки и падения при использовании замыканий, итераторов и больших объектов.



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

© OpenNet