Релиз языка программирования Nim 2.2.12

После четырёх месяцев разработки представлен релиз языка системного программирования Nim 2.2.12. Nim – статически типизированный компилируемый язык программирования с синтаксисом, вдохновлённым Python, и возможностями метапрограммирования на уровне Lisp. Язык компилируется в C, C++ и JavaScript, обеспечивая производительность на уровне C при выразительности высокоуровневых языков. Код проекта поставляется под лицензией MIT.

Возможности Nim включают систему макросов, работающих на AST во время компиляции, поддержку обобщённого программирования с концептами, множественную диспетчеризацию (multiple dispatch), детерминированное управление памятью с поддержкой нескольких стратегий (ARC/ORC, refc, маркировка-и-подметание), встроенную поддержку async/await для асинхронного программирования и FFI для простой интеграции с C/C++/JavaScript. Nim позиционируется как системный язык, подходящий для разработки от встраиваемых систем до веб-серверов, с акцентом на эффективность, безопасность памяти и удобство разработки.

Выпуск включает 142 коммита, устраняющих ошибки в компиляторе и стандартной библиотеке. Среди исправлений:

  • Устранены несколько аварийных завершений (SIGSEGV) в ARC/ORC, связанных с повторным использованием шаблонов «{.dirty.}» и выделением памяти под «seq», а также возникавших при обращении к элементам объектов «case» после «move» в связке с «GC_fullCollect()» при использовании «refc».
  • Исправлена ошибка самоприсваивания при копировании памяти (self-append) в runtime «refc», приводившая к аварийному завершению на OpenBSD.
  • Устранена регрессия, из-за которой флаг «—panics:on» пропускал проверку «nimErr_» после вызова замыкания, что приводило к ложному срабатыванию проверки «OverflowDefect».
  • Исправлена некорректная семантика «deepCopy» для не копируемых (non-copyable) типов и двойной вызов деструктора при использовании прагмы «{.cursor.}».
  • Устранена ошибка кодогенерации для C++, приводившая к внутренней ошибке компилятора (ICE) при вызове конструктора «bindSym» внутри макроса.
  • Исправлено некорректное поведение «compareExchange», применявшего недопустимую семантику «release» при неудачном исходе операции.
  • Устранена ошибка в «std/encodings», при которой метод «encodings.convert» незаметно повреждал данные для сохраняющих кодировок типа ISO-2022-JP при увеличении выходного буфера.
  • Исправлена регрессия в JS-бэкенде, из-за которой некорректно генерировался файл «dockhack.js».
  • Устранена ошибка, при которой итерация по элементам массива (в отличие от «seq») всегда выполняла их копирование.
  • Исправлена регрессия производительности при переходе с «refc» на ORC либо при использовании флагов «—mm:refc —exceptions:goto», связанная с избыточными проверками defect-исключений.

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