The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Выпуск языка программирования Nim 2.2.6

03.11.2025 22:19

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

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

Ключевые изменения:

  • Оптимизация move-семантики для полей объектов. Компилятор научился распознавать возможность применения move-операций при возврате полей объектов. Ранее конструкции вида "return obj.field" приводили к копированию данных, теперь компилятор корректно применяет перемещение:
    
       proc getField(obj: MyObject): string =
         return obj.field  # Теперь move вместо copy
    

    Это особенно важно для тяжёлых типов данных (строки, последовательности, объекты с ресурсами), где устранение лишнего копирования даёт заметный прирост производительности без изменения кода.

  • Полная переработка closure-итераторов с обработкой исключений. Механизм трансформации замыканий-итераторов полностью переписан, что кардинально улучшило стабильность async-кода с обработкой исключений. Исправлены критические проблемы, включая SIGSEGV при использовании try/except не на верхнем уровне:
    
       iterator problematicIterator(): int {.closure.} =
         for i in 0..10:
           try:
             if i == 5:
               raise newException(ValueError, "test")
             yield i
           except ValueError:
             discard  # Ранее вызывало SIGSEGV
    

    Также решена проблема с некорректным пробросом исключений в finally-блоках внутри closure-итераторов.

  • Исправления, связанные с управлением памятью
    • Устранена фундаментальная проблема в сборщике мусора при обработке циклических структур данных, которая могла приводить к выводу ошибки "Illegal storage access". Проблема существовала с момента создания языка и проявлялась при сложных графах объектов с взаимными ссылками.
    • Исправлен некорректный порядок уничтожения объектов, который мог приводить к обращению к уже освобождённой памяти:
      
         type
           Resource = object
             data: ptr Data
           Container = object
             resource: Resource
             other: OtherResource
      
         # Теперь деструкторы вызываются в правильном порядке:
         # сначала other, затем resource
      
    • Сборщик ORC ошибочно помечал окружения некоторых замыканий как циклические, что приводило к задержкам освобождения памяти или утечкам. Теперь анализ циклов работает корректно.
    • Исправлена утечка сокетов в asyncnet при ошибках согласования TLS-соединения:
      
         proc handleClient() {.async.} =
           var socket = await server.accept()
           try:
             await socket.setupSSL()  # При ошибке здесь socket теперь корректно закрывается
           except SSLError:
             discard  # Сокет больше не утекает
      
  • Критические исправления в компиляторе.
    • Устранена регрессия, при которой глобальные переменные, объявленные внутри процедур с static-параметрами, переинициализировались при каждом вызове:
      
         proc test[N: static int]() =
           var global {.global.}: array[N, int]
           global[0] += 1
           echo global[0]
      
         test[5]()  # Выводило: 1
         test[5]()  # Должно: 2, но выводило: 1 (было переинициализировано)
      
    • Исправлена генерация кода для глобальных переменных в рекурсивных функциях, которая приводила к неопределённому поведению.
    • Решена древняя проблема генерации некорректного C-кода при использовании конструкторов для глобальных переменных внутри конвертеров:
      
         converter toInt(x: MyType): int =
           let global {.global.} = MyType()  # Генерировал невалидный C-код
           result = global.value
      
    • Устранено падение компилятора при генерации исключений типа Defect и использовании doAssert в определённых контекстах.
  • Улучшения в системе типов
    • Исправлена невозможность возврата lent-значений из case/if выражений:
      
         proc getBest(a, b: string): lent string =
           if a.len > b.len:
             return a  # Ранее: ошибка компиляции
           else:
             return b
      
    • Устранена проблема с некорректным сохранением значений lent-полей в обобщённых типах:
      
         type
           Wrapper[T] = object
             data: lent T
      
         proc process[T](w: Wrapper[T]) =
           echo w.data  # Значение теперь корректно сохраняется
      
    • Восстановлена проверка инициализации переменной result для типов с requiresInit, которая была сломана в версии 2.2: type MustInit {.requiresInit.} = object value: int proc test(): MustInit = discard # Теперь корректно выдаёт ошибку о неинициализированном result
    • Исправлено игнорирование некопируемости (".noCopy") базового типа:
      
         type
           Base {.noCopy.} = object
           Derived = object of Base
      
         var a: Derived
         var b = a  # Теперь корректно запрещено
      
  • Оптимизации производительности
    • Ускорение оператора "@" для тривиальных типов: устранена критическая деградация производительности при создании последовательностей из массивов простых типов:
      
         let arr = [1, 2, 3, 4, 5]
         let s = @arr  # Было крайне медленно, теперь оптимально
      
    • Оптимизация vmgen.sameConstant: значительно ускорена компиляция за счёт оптимизации сравнения констант в виртуальной машине компилятора и сокращения операций выделения памяти.
    • Разыменование результата cast в одиночном выражении больше не вызывает ненужное копирование:
      
         let data = cast[ptr MyType](address)[]  # Теперь без копирования
      
  • Backend-специфичные исправления
    • JavaScript
      • =destroy для не-var типов: исправлена генерация деструкторов, которая ранее приводила к ошибкам компиляции.
      • cast[char] для значений > 255: теперь корректно выполняется усечение, как в C-backend.
      • Концепты в varargs: устранён вывод ошибки "internal error" при передаче концептов в varargs.
    • C++: Восстановлена L-valueness для совместимых типов что было сломано в регрессии между версиями 2.2.2 и 2.2.4:
      
         # nim cpp
         var x: CppCompatibleType
         takeRef(x)  # Снова работает как lvalue
      
    • C (refc)
      • pthread на некоторых платформах: исправлена генерация кода для pthread_mutex_t с использованием .abi;
      • Обобщённые типы с GC-памятью: устранена генерация некорректного C-кода для generic-типов, содержащих управляемую память;
  • Виртуальная машина
    • Глобальные переменные и присваивания: множественные исправления работы с глобальными переменными на этапе компиляции.
    • Case-объекты из compileTime proc: исправлена передача вариантных объектов как static-параметров.
    • repr для длинных строк под refc: устранён RangeDefect при использовании repr.
  • Исправления в стандартной библиотеке
    • В strutils.formatSize исправлена работа с большими значениями, близкими к int64.high:
      
         echo formatSize(9223372036854775807)  # Теперь корректный результат
      
    • В deques восстановлена совместимость поведения итератора items между версиями 2.0.16 и 2.2.0.
    • В lists.SinglyLinkedList.remove устранён AssertionDefect при удалении элементов из односвязного списка.
    • В tables.withValue исправлено условие проверки в макросе withValue для неизменяемых таблиц.
  • Прагмы и области видимости
    • В "{.push raises: [].}" исправлено некорректное игнорирование лексических областей видимости для push-прагм с raises.
    • Устранён эффект «утечки» отключения предупреждений за пределы pragma-блоков:
      
         {.push warning[UnusedImport]: off.}
         import module1
         {.pop.}
         import module2  # Предупреждения теперь корректно включены
      
  • Прочие важные исправления
    • Сравнение cstring: добавлены отсутствовавшие операторы "<" и "cmp" для cstring.
    • Проверка диапазонов float: включена корректная проверка диапазонов для чисел с плавающей точкой
    • filterIt и rvalue: исправлено ошибочное возвращение rvalue вместо lvalue
    • Устранён FieldDefect при сравнении указателей на этапе компиляции.
    • hasCustomPragma после копирования typedesc: восстановлена работоспособность после копирования дескрипторов типов.
    • nim doc и приватные поля: исправлено использование комментариев от приватных полей для публичных.


  1. Главная ссылка к новости (https://nim-lang.org/blog/2025...)
  2. OpenNews: Представлены принципы дизайна компилятора Nimony для будущего Nim 3.0
  3. OpenNews: Для Nim 3.0 развивается новый компиляторный бэкенд на основе формата NIF
  4. OpenNews: Релиз языка программирования Nim 2.0
  5. OpenNews: Выпуск языка программирования Crystal 1.16
  6. OpenNews: Выпуск языка программирования Julia 1.12
Автор новости: User097
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/64173-nim
Ключевые слова: nim
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (29) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 22:51, 03/11/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    > и возможностями метапрограммирования на уровне Lisp
    > Язык компилируется в C, C++ и JavaScript,

    Нужно перестать стесняться и сказать вслух очевидное: нужен Common Lisp, компилируемый в представление на любом мейнстримном языке.

     
     
  • 2.10, ZloySergant (ok), 23:51, 03/11/2025 [^] [^^] [^^^] [ответить]  
  • +/
    >...Common Lisp, компилируемый в представление на любом мейнстримном языке.

    Был такой. ECL, но после самоотвода jjgarcia скатился в унылое.
    До этого gcl, ccl и др.

     
  • 2.19, Кошкажена (?), 01:14, 04/11/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > нужен Common Lisp,

    У него заморожен стандарт. Как же без обновлений? На что выделять деньхи?

     
     
  • 3.21, Аноним (21), 01:35, 04/11/2025 [^] [^^] [^^^] [ответить]  
  • +/
    А что, если создавать новые библиотеки? ... Да ну на! Лучше синтаксис каждые 3 недели ломать!
     
  • 2.29, Аноним (29), 04:09, 04/11/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Common Lisp слишком переусложнен и переполнен всяческой абракатаброй.

    Но вот Scheme - это то, что надо. Простой, понятный, элегантный, продуманный, интуитивно понятный. Первоклашки в схему въезжают буквально за 15 минут, а коммон лисп осиливают долго, да еще и постоянно потом путаются.

     

  • 1.2, Аноним (2), 23:00, 03/11/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Будучи программистом с опытом более 15 лет и комфортной зарплатой, я ничего не понял из описания. Слишком сложно, а значит, не выстрелит.
     
     
  • 2.3, bdrbt (ok), 23:16, 03/11/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Вот если бы ты не программы там всякие 15 лет писал, а каждый раз придумывал почему убогий с/с++/c#/жаба/<ещёчегонибудь> не подходит под высокий полёт твоей мысли, вот тогда бы ты всё понял.
     
     
  • 3.12, Аноним (-), 00:05, 04/11/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Вот если бы ты не программы там всякие 15 лет писал, а каждый раз придумывал
    > почему убогий с/с++/c#/жаба/<ещёчегонибудь> не подходит под высокий полёт
    > твоей мысли, вот тогда бы ты всё понял.

    Да еще синтаксис - очень разный может быть. И в этом смысле никогда не знаешь что получишь на вход. Это конечно по своему забавно - но только не в случае если код поддерживать придется.

     
  • 2.4, Аноним (4), 23:20, 03/11/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    15 лет на 1с?  Это мы уважаем!
     
     
  • 3.6, фишман (?), 23:40, 03/11/2025 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 2.5, Аноним (5), 23:38, 03/11/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Это ок.

    Тут люди с опытом по 30 лет на С, не могут понять, зачем нужен раст. Уже их ошибки на уровне ЦПУ хотят решать, а им невдомек.

     
     
  • 3.13, Аноним (-), 00:07, 04/11/2025 Скрыто ботом-модератором     [к модератору]
  • +1 +/
     
  • 3.23, Аноним (23), 02:04, 04/11/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Выбор корпораций решать си-ошибки на уровне ЦПУ является признанием того, что раст не нужен. Иначе зачем бы им решать си-ошибки на уровне ЦПУ, вместо изучения раста их сотрудниками.
     
  • 3.25, Аноним (-), 02:46, 04/11/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Тут люди с опытом по 30 лет на С, не могут понять, зачем нужен раст. Уже
    > их ошибки на уровне ЦПУ хотят решать, а им невдомек.

    Не беспокойтесь, мы с удовольствием предложим адептам Rust выбросить их старый хлам, точно так же как это делают сейчас они. Ибо долг платежом красен :)

     
  • 2.7, 12yoexpert (ok), 23:41, 03/11/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    это новость про патч-релиз. вопросы по изложению к автору новости
     
     
  • 3.8, Аноним (5), 23:48, 03/11/2025 Скрыто ботом-модератором     [к модератору]
  • +2 +/
     
     
  • 4.9, 12yoexpert (ok), 23:50, 03/11/2025 Скрыто ботом-модератором     [к модератору]
  • –1 +/
     
  • 2.22, Ан333ним (?), 01:51, 04/11/2025 Скрыто ботом-модератором     [к модератору]
  • +3 +/
     

  • 1.11, Медведь (ok), 23:54, 03/11/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Хорошо хотя бы уже то, что вокруг сабжа не вертится толпа фанатиков с остекленевшими глазами, пускающих слюни и скандирующих хором "Наш! Язык! Убийца! Убийц! Мы! Зохватем! Голактеку! Он! Самый! Бизапастный! Он! Самый! Ваще!" Так что пусть будет, может кому-то и пригодится.
     
     
  • 2.14, Аноним (14), 00:07, 04/11/2025 [^] [^^] [^^^] [ответить]  
  • +/
    А ведь язык по факту убийца всего: веб (бекенд и фронтенд), десктоп, мобильные (сыро, но можно), bare metal.
    Да, вот этот вот питоноподобный язык может без проблем работать даже на дохлом avr. Более того, для этого не обязательно вручную работать с памятью – arc/orc работает. Но можно и вручную, без проблем.
     
     
  • 3.15, Медведь (ok), 00:15, 04/11/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > А ведь язык по факту убийца всего

    Судя по количеству свежеисправленных косяков -- очень вряд ли, по крайней мере на данный момент. Но посмотрим, время покажет.

     
     
  • 4.17, Аноним (14), 00:29, 04/11/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Ну, скажем так, язык уже по факту убийца. Но если оценивать готовность к проду, то нет. Автор уже который раз переписывает компилятор.
     
     
  • 5.18, Медведь (ok), 00:37, 04/11/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Ну, скажем так, язык уже по факту убийца.

    Точнее было бы сказать, что он заявлен как убийца. Но в принципе, если он позволит удобно и бесшовно писать замену жабоскриптам с доступом к DOM и прочим веб-API, я сам с удовольствием к нему присмотрюсь.

     
  • 3.27, Аноним (-), 02:53, 04/11/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > А ведь язык по факту убийца всего: веб (бекенд и фронтенд), десктоп, мобильные
    > (сыро, но можно), bare metal.

    И будет как питон? Делает все - и делает это одинаково горбато? Тем более что синтаксис у этой шляпы может весьма варьироваться. И если вон там синтаксис питоноподобный, то там сиобразный, а там чей-то еще.

    А суммарно - вы хрен угадаете что вам рандомный дев на вход подаст. Так что в обломе будут все :). Фанаты сишки проблюются с питона. Фанаты питоносинтаксиса - наоборот. И так далее.

     
  • 2.26, seg (?), 02:49, 04/11/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Он был убийцей убийц когда был простой, но афтор (как всегда это бывает) сошел с ума и теперь нет разницы. Там даже клон есть призванный ввернуть все в зад, но кажется на него забили. Было бы неплохо состояние того клона в новости добавлять.
     
     
  • 3.28, Аноним (-), 03:39, 04/11/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Он был убийцей убийц когда был простой, но афтор (как всегда это бывает) сошел
    > с ума и теперь нет разницы.

    С гвидо примерно то же самое было. Он настолько задолбался что свалил в закат с кресла BDFLа, а это вам не хухры мухры. Т.е. он завонял себя - как мужик пережравший бобов в закрытой комнате. Видимо эта участь достаточно типична для адептов питоносинтаксиса.

     

  • 1.16, Уникум (?), 00:18, 04/11/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Язык на пробелах не нужен
     
     
  • 2.24, Кошкажена (?), 02:44, 04/11/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Правильно. Нужно писать без пробелов, в одну строку желательно.
     

  • 1.20, cheburnator9000 (ok), 01:29, 04/11/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > теперь компилятор корректно применяет перемещение

    Там нет компилятора. Там транспайлер. У них была и до сих пор есть возможность перейти на LLVM для полной поддержки сборки и дебага, вместо костылей.

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2025 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру