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