Перейти к основному содержимому

Nim — итоги

Разработчику Аналитику Тестировщику Архитектору Инженеру

Кратко — что стоит унести из раздела "Nim". Если пункт кажется туманным — откройте указанную главу или оглавление.


FAQ — Часто задаваемые вопросы

Типичные сбои и ситуации, с которыми сталкиваются новички после раздела. Здесь — что делать и где копать в главах; определения терминов — в оглавлении и профильных статьях.

Вопрос. nim не находится в терминале после установки с сайта.

Ответ. Добавьте каталог с nim.exe (или bin/nim) в PATH и перезапустите терминал. На Windows chocho/winget иногда ставит в нестандартный путь — найдите nim.exe и пропишите вручную. Подробнее здесь — первая программа.

Вопрос. nim c hello.nim падает с "cannot find compiler: gcc".

Ответ. Nim генерирует C и вызывает GCC, Clang или MSVC. Установите MinGW-w64 (Windows), Xcode CLI (macOS) или build-essential (Linux). Проверьте gcc --version. Подробнее здесь — первая программа, архитектура компиляции.

Вопрос. Скопировал пример с отступами из PDF — "Indentation doesn't match".

Ответ. Nim, как Python, использует отступы для блоков; табы и пробелы нельзя смешивать. Переведите файл на 2 пробела (стандарт Nim). Подробнее здесь — основы.

Вопрос. nim c -r script.nim создаёт кучу файлов в nimcache — можно удалить?

Ответ. Каталог nimcache — промежуточный C-код и объектники; его можно удалить, Nim пересоберёт. Для чистой сборки используйте nim c --forceBuild:on. Подробнее здесь — архитектура компиляции.

Вопрос. randomize() забыл — пароль при каждом запуске одинаковый.

Ответ. Без randomize() генератор даёт предсказуемую последовательность. Вызовите один раз в when isMainModule перед rand. Подробнее здесь — простые приложения.

Вопрос. var s = "hello" — строка не меняется через s[0] = 'H'.

Ответ. Индексация string возвращает char; для изменения используйте s[0] = 'H' только если s объявлена как var, или собирайте через add. Подробнее здесь — типы данных.

Вопрос. let vs const vs var — компилятор ругается на присваивание.

Ответ. let — однократная инициализация, значение неизменно; var — изменяемая переменная; const — compile-time константа. Подробнее здесь — типы данных.

Вопрос. seq[int] передал в proc — снаружи исходный список тоже изменился.

Ответ. seq передаётся по ссылке (copy-on-write до мутации). Для копии используйте @s clone или s.toSeq() в зависимости от контекста. Подробнее здесь — типы данных, функции.

Вопрос. Table — KeyError при обращении к отсутствующему ключу.

Ответ. Оператор table[key] бросает исключение, если ключа нет. Безопаснее table.getOrDefault(key) или if key in table. Подробнее здесь — типы данных, простые приложения.

Вопрос. import json%* макрос не работает в моей версии.

Ответ. Убедитесь в Nim 2.x и модуле std/json. Литерал %*{ "a": 1 } требует правильного импорта и кавычек в ключах. Подробнее здесь — простые приложения.

Вопрос. JSON из файла — parseJson падает на комментарии внутри.

Ответ. Стандартный JSON не допускает комментарии. Удалите // из файла или используйте JSON5-парсер из nimble, если формат осознанно нестрогий. Подробнее здесь — простые приложения.

Вопрос. httpclient.getContent зависает на минуты без ошибки.

Ответ. Задайте client.timeout в миллисекундах и закройте клиент через defer: client.close(). Проверьте DNS и прокси. Подробнее здесь — простые приложения.

Вопрос. HTTPS-запрос падает с ошибкой SSL на Windows.

Ответ. Toolchain Nim должен быть собран с поддержкой OpenSSL или schannel. Переустановите официальный бинарник или укажите путь к DLL OpenSSL. Подробнее здесь — архитектура компиляции.

Вопрос. when isMainModule — код не выполняется при import mymodule.

Ответ. Это ожидаемо: блок только при прямом запуске файла. Тесты и CLI-логику выносите в when isMainModule, библиотечный код — без него. Подробнее здесь — простые приложения, функции.

Вопрос. result в proc пустой, хотя присваивал переменные внутри.

Ответ. Неявная переменная result — это возвращаемое значение; нужно писать в result или return. Если объявили локальную переменную с тем же смыслом — она не станет return автоматически. Подробнее здесь — функции и макросы.

Вопрос. func vs proc — в чём разница на практике?

Ответ. func не может иметь побочных эффектов (глобальное состояние, I/O); proc — обычная процедура. Для чистых вычислений предпочитайте func. Подробнее здесь — функции и макросы.

Вопрос. Макрос из статьи — "undeclared identifier" внутри quote do.

Ответ. В макросах символы из генерируемого кода нужно экранировать через backticks или newIdentNode. Начинайте с шаблонов и macro, не с сырых AST. Подробнее здесь — функции и макросы.

Вопрос. case по строке — ветка else не ловит все значения.

Ответ. Для enum используйте исчерпывающий case; для строк добавьте else. when — compile-time ветвление, не путать с runtime case. Подробнее здесь — управляющие конструкции.

Вопрос. Цикл 0 ..< n vs 0 .. n — off-by-one в массиве.

Ответ. ..< — полуоткрытый диапазон (верхняя граница не входит), .. — включительно. Для индексов seq чаще нужен 0 ..< s.len. Подробнее здесь — управляющие конструкции.

Вопрос. ORC / новый GC — программа стала медленнее после обновления Nim 1.x → 2.x.

Ответ. Nim 2 по умолчанию использует ORC вместо refc; профилируйте hot path. Для legacy-кода смотрите флаги --mm:arc / документацию по памяти. Подробнее здесь — архитектура компиляции, основы.

Вопрос. nimble install — пакет не виден в import.

Ответ. Установка через nimble кладёт пакет в user path; в проекте лучше nimble init и зависимость в .nimble. Проверьте nimble path. Подробнее здесь — первая программа.

Вопрос. echo выводит кракозябры вместо кириллицы в Windows-консоли.

Ответ. Переключите кодовую страницу терминала на UTF-8 (chcp 65001) или выводите в файл в UTF-8. Исходник сохраните в UTF-8 без BOM. Подробнее здесь — первая программа.

Вопрос. readFile на большом логе — процесс съел всю RAM.

Ответ. readFile загружает файл целиком. Для гигабайтных логов читайте построчно через File и readLine. Подробнее здесь — простые приложения.

Вопрос. Пришёл из Python — жду REPL с >>> для отладки.

Ответ. Используйте nim r file.nim (быстрая пересборка) или inim из nimble для интерактива. Полноценного CPython-REPL у Nim нет. Подробнее здесь — первая программа.

Вопрос. Хочу один .exe без DLL — что включить в сборку?

Ответ. На Windows статическая линковка зависит от toolchain: nim c -d:release --passL:-static (осторожно с лицензиями). Проверьте размер и legal notice для OpenSSL. Подробнее здесь — архитектура компиляции.

Вопрос. distinct type — зачем, если есть object?

Ответ. distinct создаёт новый тип на базе существующего без runtime-стоимости — защита от перепутанных int (UserId vs OrderId). Подробнее здесь — типы данных.

Вопрос. Исключение не поймано — программа печатает stack trace и падает.

Ответ. В библиотечном коде предпочитайте Result[T, E] из std/results; try/except — для границ приложения. Подробнее здесь — основы, функции.

Вопрос. С чего начать после раздела — Jester, GUI или свой CLI?

Ответ. Закрепите простые приложения и nimble init. Веб-фреймворки — после уверенного httpclient и модулей. Подробнее здесь — оглавление.

Вопрос. Что такое Nim language — это Python или компилируемый язык?

Ответ. Nim компилируется в C и даёт нативный exe; синтаксис похож на Python, но это статическая типизация и макросы. Подробнее здесь — основы, история.

Вопрос. Nim vs Python — когда выбрать Nim?

Ответ. Python — экосистема ML и скриптов; Nim — один бинарник без интерпретатора, скорость близкая к C, удобный синтаксис. Сравнение — оглавление, Python.

Вопрос. Как установить Nim на Windows — chocho, zip или nimble?

Ответ. Официальный установщик или chocho/winget; затем нужен GCC/MinGW для nim c. Пошагово — первая программа.

Вопрос. Как скомпилировать Nim в exe одной командой?

Ответ. nim c -d:release имя.nim — release-бинарник; nim c -r — сразу запуск. Подробнее здесь — первая программа, архитектура компиляции.

Вопрос. Nim indentation error — как исправить отступы?

Ответ. Только пробелы (обычно 2) или только табы в файле; выровняйте блоки proc/if/for. Подробнее здесь — основы.

Вопрос. Nim vs Rust — что быстрее и проще для CLI утилиты?

Ответ. Скорость сопоставима после компиляции; Rust строже по памяти, Nim быстрее писать "как на Python". CLI — простые приложения, сосед — Rust.

Вопрос. Можно ли писать игры на Nim?

Ответ. Да, есть биндинги к SDL, Raylib и движкам; экосистема меньше Unity/Godot. Сначала освойте основы и сборку nim c. Подробнее здесь — архитектура.

Вопрос. Nim веб сервер — как сделать API без фреймворка?

Ответ. std/asynchttpserver или Jester/Prologue после stdlib; минимальный GET — простые приложения (httpclient как клиент, сервер — следующий шаг).

Вопрос. Nim ORC garbage collector — что это в Nim 2?

Ответ. ORC (Reference Counting) — модель памяти по умолчанию в Nim 2 для ref-типов; меньше пауз, чем у старого refc. Подробнее здесь — архитектура компиляции, основы.

Вопрос. Nim convert to JavaScript — как собрать под браузер?

Ответ. nim js -d:nodejs или js-бэкенд для фронта; ограничения по stdlib. Подробнее здесь — архитектура компиляции.

Вопрос. Nimble install — как добавить пакет в проект?

Ответ. nimble init, зависимость в .nimble, nimble install. Глобальный install без проекта путает версии. Подробнее здесь — первая программа.

Вопрос. Nim proc vs func — в чём разница?

Ответ. func без побочных эффектов (I/O, глобалы); proc — обычная процедура. Подробнее здесь — функции и макросы.

Вопрос. Nim seq vs array — что выбрать для списка?

Ответ. array[N, T] — фиксированный размер на стеке; seq[T] — динамический список в куче с add. Подробнее здесь — типы данных.

Вопрос. Как парсить JSON в Nim без сторонних библиотек?

Ответ. Модуль std/json: parseJson, to(JsonNode), сериализация через %*. Пример трекера задач — простые приложения.

Вопрос. Nim макросы для начинающих — с чего начать?

Ответ. Сначала шаблоны и when, затем macro и quote do. Не начинайте проект с макросов. Подробнее здесь — функции и макросы.

Вопрос. Nim читать файл построчно — как не грузить весь лог в RAM?

Ответ. open, цикл readLine, close — вместо readFile. Подробнее здесь — простые приложения.

Вопрос. Nim vs Zig — оба системные, кого учить?

Ответ. Zig — без GC, явные аллокаторы; Nim — GC/ORC и синтаксис как Python. Zig сложнее по памяти, Nim быстрее старт для скриптов-утилит. Сосед — Zig.

Вопрос. Сколько учить Nim если знаю Python?

Ответ. Первая утилита за 1–2 недели; C-компилятор и nimble — дополнительная настройка. Маршрут — 74103.

Вопрос. Nim async await — есть ли в языке?

Ответ. Асинхронность через asyncdispatch и макросы async/await в экосистеме; stdlib httpclient синхронный с таймаутом. Подробнее здесь — архитектура.

Вопрос. Где учить Nim на русском бесплатно?

Ответ. Раздел Nim в энциклопедии: оглавление, первая программа, основы с runnable-примерами.

Вопрос. Nim distinct type — зачем нужен отдельный тип для int?

Ответ. Чтобы компилятор не путал UserId и OrderId при той же машинной репрезентации. Подробнее здесь — типы данных.

Вопрос. Nim Result type — обработка ошибок без exception?

Ответ. В Nim 2 — std/results с Result[T, E] для явных ошибок в библиотечном коде. Подробнее здесь — основы, функции.


Что запомнить

Nim — статически типизированный язык с Python-подобным синтаксисом, компилирующийся в C/C++/JS и дающий нативный исполняемый файл без виртуальной машины. Nim 2.x по умолчанию использует ORC для управления памятью reference-типов.

Основные особенности Nim:

  • Отступы вместо скобок — блоки кода задаются whitespace, как в Python.
  • Компиляция через Cnim c генерирует C и вызывает GCC/Clang; кросс-компиляция через -d:... и --cpu/--os.
  • Метапрограммирование — шаблоны, макросы, when для compile-time ветвления.
  • Стандартная библиотекаstd/json, std/httpclient, std/os для утилит без сторонних пакетов.
  • proc/func, result, seq, Table — базовые строительные блоки прикладного кода.

Маршрут: первая программаосновытипыуправлениефункции и макросыпростые приложенияархитектура.

Три практических правила:

  1. Перед randrandomize(); перед сетью — timeout и defer: close().
  2. Большие файлы — построчно, не readFile целиком.
  3. Зависимости — через nimble, не глобальный nimble install без проекта.

Куда идти дальше

ТемаРаздел
Явная память без GCZig — о разделе
Интерпретация и экосистемаPython — о разделе
HTTP и интеграцииHTTP как основа веб-интеграций

Практика: простые приложения на Nim.


Основа по протоколу

Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.


См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").