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

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

После четырёх месяцев работы представлен Nim 2.2.12 — очередной релиз статически типизированного компилируемого языка, который сочетает Python-подобный синтаксис с мощью метапрограммирования уровня Lisp.

Код транслируется в C, C++ и JavaScript, что позволяет держать производительность на уровне C, сохраняя выразительность высокоуровневых решений. Проект распространяется под лицензией MIT. Среди ключевых возможностей — макросы, работающие с AST на этапе компиляции, обобщённое программирование с концептами, множественная диспетчеризация и детерминированное управление памятью с выбором стратегий (ARC/ORC, refc, mark-and-sweep). Также заявлены встроенные async/await и FFI для интеграции с C/C++/JavaScript. Язык позиционируется как системный — от встраиваемых устройств до веб-серверов — с упором на эффективность, безопасность памяти и удобство разработки.

В новую версию вошло 142 коммита, направленных на исправление ошибок в компиляторе и стандартной библиотеке. В частности, устранены аварийные завершения (SIGSEGV) в ARC/ORC, возникавшие при повторном использовании шаблонов «{.dirty.}», выделении памяти под «seq» и доступе к элементам объектов «case» после операции «move» в сочетании с «GC_fullCollect()» в режиме «refc».

Также починен баг самоприсваивания при копировании памяти в рантайме «refc», из-за которого наблюдался крах на OpenBSD.Исправлена регрессия: флаг «—panics:on» пропускал проверку «nimErr_» после вызова замыкания, что провоцировало ложные срабатывания «OverflowDefect». Некорректная семантика «deepCopy» для non-copyable типов и двойной вызов деструктора с прагмой «{.cursor.}» тоже остались в прошлом.

Устранена ошибка кодогенерации для C++, вызывавшая внутреннюю ошибку компилятора при вызове конструктора «bindSym» внутри макроса. Операция «compareExchange» больше не использует недопустимую семантику «release» при неудачном исходе. В «std/encodings» исправлено скрытое повреждение данных для кодировок с сохранением состояния типа ISO-2022-JP при расширении выходного буфера.

Для JS-бэкенда починена генерация файла «dockhack.js». Отдельно отмечено, что итерация по элементам массива (в отличие от «seq») ранее всегда копировала элементы — теперь это поведение исправлено. Также решена проблема производительности при миграции с «refc» на ORC и при использовании флагов «—mm:refc —exceptions:goto» из-за лишних проверок defect-исключений.

Ссылка на основную публикацию