После четырёх месяцев разработки представлен релиз языка системного программирования 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-исключений.
Источник: https://www.opennet.ru/opennews/art.shtml?num=66237





