Профиль: Аноним (вход | регистрация) неRU opennet.me  
OpenNET

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

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

29.10.2026 16:26 (MSK)

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

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

Основные изменения:

  • Реализован режим оптимизации коротких строк (SSO, Small-String Optimization), включаемый через опцию "--strings:sso" и приводящий к хранению небольших строк непосредственно в самом объекте, без отдельного выделения памяти в куче. Для эффективного использования этого режима предложен новый низкоуровневый API, в котором вместо синтаксиса "addr myString[offset]" предложены раздельные операции для чтения и записи (readRawData, readRawDataStable, beginStore и endStore). Например, при использовании нового API операции "addr s[i]" и "unsafeAddr s[i]" заменяются на вызов "readRawData(s, i)", а связка "setLen" и "addr s[oldLen]" заменяется на "beginStore(s, newLen, start)" с последующим "endStore(s)".
    
        # До: установка длины и копирование по адресу элемента строки
        result.setLen newLen
        copyMem(addr result[oldLen], buf, buflen)
    
        # После: beginStore устанавливает длину, обеспечивает уникальное
        # владение и возвращает указатель для записи; endStore завершает запись
        copyMem(beginStore(result, newLen, oldLen), buf, buflen)
        endStore(result)
    
  • Реализована поддержка параллельной и инкрементальной сборки, активируемой через опцию "--ic:on". Распараллеливание реализовано на основе многопроцессности, а не многопоточности, поэтому макросы, использующие глобальные переменные ".compileTime", могут потребовать доработки для ускорения сборки. Ускорение наблюдается не только при повторных пересборках, но и при первой сборке за счёт распараллеливания. Например, сборка компилятора Nim на машине с 16 физическими ядрами при использовании опции "--ic:on" сократилась с 31 до 25 секунд.
  • Добавлен новый алгоритм управления памятью YRC, активируемый опцией "--mm:yrc" и обеспечивающий корректную обработку циклических ссылок, пересекающих границы потоков. YRC предоставляет тот же API, что и ORC, но помимо возможностей последнего обеспечивает потокобезопасность. Для ациклических данных применяется атомарный подсчёт ссылок, а для циклических - барьер записи (write barrier), который активируется только при присваивании указателей. При этом в тесте orcbench YRC примерно в два раза медленнее ORC и потребляет вдвое больше памяти.
  • Поддержка типов-сумм (sum types), при объявлении которых применяется сопоставление с образцом.
    
        type
          Node = ref object
            case
            of IntLit: intVal: int
            of FloatLit: floatVal: float
            of StringLit: strVal: string
            of AddOp, SubOp:
              leftOp, rightOp: Node
            of IfStmt:
              condition, thenPart, elsePart: Node
    

    Имя ветви служит конструктором с именованными аргументами:

    
        let n = AddOp(leftOp: IntLit(intVal: 40), rightOp: IntLit(intVal: 2))
    

    Поддерживаются обобщённые типы-сумм (generic), в которых конкретный экземпляр выводится из значений полей или из ожидаемого типа:

    
        type
          Opt[T] = object
            case
            of None: discard
            of Some: val: T
    
        let a = Some(val: "abc")      # Opt[string]
        let b: Opt[int] = None()      # ожидаемый тип выбирает экземпляр
    

    Доступ к полям осуществляется исключительно через сопоставление с образцом, поэтому обращение к полю чужой ветви (FieldDefect) невозможно. Поля привязываются к именам, следующим за именем ветви:

    
        proc eval(n: Node): int =
          case n
          of IntLit(v): v                    # v привязано к intVal
          of AddOp(a, b): eval(a) + eval(b)  # a, b — leftOp, rightOp
          of SubOp(a, b): eval(a) - eval(b)
          else: raiseAssert "not an arithmetic expression"
    
  • Добавлен экспериментальный модификатор "owned" для управления памятью на основе явного владения без использования сборщика мусора, активируемый при указании опции "--experimental:ownedRefs". Типы "owned ref T" и замыкания "owned" гарантируют наличие единственного владельца у объекта. Подобные объекты нельзя копировать и можно только перемещать, а при выходе из области видимости они автоматически уничтожаются.
  • Добавлена прагма "{.cyclic.}" для обработки циклического импорта модулей, ссылающихся друг на друга, которая позволяет связывать модули напрямую без выноса типов в отдельный файл и избавляет от необходимости подбирать строгий порядок объявлений в коде.


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


Обсуждение (33) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.2, Инопланетянин (?), 16:39, 29/10/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/–
    Какой Ним, какой Раст? На Гусе писать надо https://github.com/aardappel/goose Он быстрее плюсов и раста.
     
     
  • 2.4, Аноним (4), 16:44, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/–
    Додо, только удалять элементы из контейнеров не умеет.
     
     
  • 3.10, Инопланетянин (?), 17:08, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    Умеет вроде, но с конца. Вообще надо походы менять.

    > Это фундаментальное архитектурное решение автора языка, Воутера ван Оортмерссена. Так как Goose полностью отказывается от динамической кучи (heap), он заставляет разработчика проектировать структуры данных как монолитные последовательные плоские блоки памяти.

     
     
  • 4.15, Аноним (15), 17:43, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/–
    Ну то есть, не подходит для хоть чего-то, где требуется какая-либо обработка данных, что 99% программ
     
     
  • 5.22, Инопланетянин (?), 18:36, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    > Ну то есть, не подходит для хоть чего-то, где требуется какая-либо обработка
    > данных, что 99% программ

    Примеры посмотрел?

     
  • 4.38, Аноним (38), 23:21, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    > Goose полностью отказывается от динамической кучи (heap), он заставляет разработчика проектировать структуры данных как монолитные последовательные плоские блоки памяти

    Это подходит только для микроконтроллеров.

     
  • 2.6, name (??), 16:50, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    1. Уберите var/let/fn
    2. Напишите на этом хотя бы ядро ОС
    Тогда мы вам проверим.
     
  • 2.32, Anonim (??), 20:48, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    Быстрее аж на минус 50%, дада
     

  • 1.8, Гость (??), 16:56, 29/10/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/–
    вот, даже этот Nim лучше чем rust.

    почему? потому что нет головной боли с указателями и всё просто работает как в питоне или Go.

    если нужна головная боль, то даже C++ лучше чем Rust, и даже тут нужно ещё постараться и специально не юзать удобные умные указатели, чтобы выстрелить себе в ногу.

     
     
  • 2.9, Инопланетянин (?), 17:04, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • –2 +/–
    > почему? потому что нет головной боли с указателями и всё просто работает как в питоне или Go.

    Как понять какой код будет? Как отлаживать? Генеренные исходники си?

     
     
  • 3.40, Аноним (38), 23:25, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    Как всегда: printf() Ну или как там оно в Nim.
     
  • 2.14, Аноним (14), 17:42, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/–
    > C++ [...] нужно ещё постараться и специально не юзать удобные умные указатели, чтобы выстрелить себе в ногу.

    Лол. В C++ запросто отстреливаются ноги даже чисто с использованием ссылок и итераторов - без явного использования кучи и умных указателей для нее.

     
  • 2.26, Боевой Петух (?), 19:07, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/–
    В nim из python только условный хеллоуврот на 100 строк заведется без изменения кода.
     

  • 1.16, Аноним (16), 17:44, 29/10/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/–
    C++ высокоуровневый язык вообще-то.
     
     
  • 2.31, Инопланетянин (?), 19:53, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    > C++ высокоуровневый язык вообще-то.

    высокогрейдовый

     

  • 1.18, Аноним (15), 17:48, 29/10/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • –5 +/–
    Слишком сложен C? Нужен язык безопаснее, чем C++? Ну хорошо, а чем обычный C# не устраивает?
     
     
  • 2.19, Аноним (19), 18:06, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    Требованием CLR, очевидно.
     
     
  • 3.35, aname (ok), 21:46, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    Уже пилят компиляцию в натив
     
     
  • 4.36, Аноним (36), 21:59, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    Ух ты. Интересные ветра задули. Но поздно
     
  • 4.41, Аноним (38), 23:30, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    Ну хорошо, вот тогда и посмотрим, когда M$ на нём, компилируемом в натив, ядро напишет.
     

  • 1.20, Аноним (20), 18:09, 29/10/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/–
    Лучше не смотрите на то, что это генерирует вместо кода на си.
     
     
  • 2.23, Инопланетянин (?), 18:50, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    > Лучше не смотрите на то, что это генерирует вместо кода на си.

    Вот вопрос такой же. Как отлаживают это? То не говорите, что принтами.

     
     
  • 3.27, Боевой Петух (?), 19:09, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/–
    У сабжа есть отладчик для отладки. Впредь не задавайте глупые  провокационные вопросы, а спросите хотя бы у гугло-нейронки.
     
     
  • 4.30, Инопланетянин (?), 19:52, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    > У сабжа есть отладчик для отладки. Впредь не задавайте глупые  провокационные
    > вопросы, а спросите хотя бы у гугло-нейронки.

    Личный опыт есть? ИИ говорит


    3. Где начинаются сложности (Минусы)

    Есть несколько сценариев, когда отладка сгенерированного кода становится запутанной:
    • Макросы и шаблоны (Metaprogramming): Если вы активно используете macro в Nim, код генерируется «на лету». Отладчик покажет вам точку вызова макроса, но не покажет пошагово, как выполнялся сгенерированный им AST-код.
    • Сложные типы данных: Простые типы (int, string, float) видны хорошо. Однако объекты, кортежи и последовательности (seq) внутри C превращаются в структуры с указателями. Чтобы увидеть их содержимое в GDB, приходится «пробиваться» через поля вроде p.data.
    • Сборщик мусора (ARC/ORC): В C-коде будет много автоматических вызовов для управления памятью (nimNew, операции копирования/перемещения). При пошаговой отладке в C-режиме они могут отвлекать.

     
  • 4.42, cheburnator9000 (ok), 23:55, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    транспиленный код не реально толком отлаживать вы врете сами себе.

    единственный правильный способ это быть языком над LLVM https://github.com/arnetheduck/nlvm там есть debug.

     
  • 2.29, вдцлсоцжтфчлыь (ok), 19:14, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/–
    ну так его цель — машинная трансляция в си, не обязательно читабельная.
     

  • 1.24, Боевой Петух (?), 19:04, 29/10/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/–
    Что опять поломали в плане совместимости? Помнится,этот язык прославился именно этим.
     
     
  • 2.34, Аноним (34), 21:40, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    Для малвари как раз хорошо, сигнатуры поменяются
     

  • 1.25, Аноним (25), 19:05, 29/10/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/–
    >Реализован режим оптимизации коротких строк (SSO, Small-String Optimization), включаемый через опцию "--strings:sso" и приводящий к хранению небольших строк непосредственно в самом объекте, без отдельного выделения памяти в куче.

    замечательно, но удар по abi; было бы хорошо так приделывать подобъекты к объекту, но без разделения на полустатику и кучу

     
     
  • 2.28, Боевой Петух (?), 19:10, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/–
    Кому не пофиг на твой abi?
     

  • 1.33, Tron is Whistling (?), 21:14, 29/10/2026 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • +/–
     
  • 1.37, Аноним (37), 22:04, 29/10/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/–
    Где применяется?
     
     
  • 2.39, Аноним (34), 23:23, 29/10/2026 [^] [^^] [^^^] [ответить]  
  • +/–
    Ну как где? В майнерах, в шеллкодиках, в троянчиках
     

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



    XSQUARE
    Inferno Solutions
    Hosting by Hoster.ru
    Хоcтинг: