Выпуск языка программирования 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
