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 — дополнительная настройка. Маршрут — 7 → 4 → 103.
Вопрос. Nim async await — есть ли в языке?
Ответ. Асинхронность через asyncdispatch и макросы async/await в экосистеме; stdlib httpclient синхронный с таймаутом. Подробнее здесь — архитектура.
Вопрос. Где учить Nim на русском бесплатно?
Ответ. Раздел Nim в энциклопедии: оглавление, первая программа, основы с runnable-примерами.
Вопрос. Nim distinct type — зачем нужен отдельный тип для int?
Ответ. Чтобы компилятор не путал UserId и OrderId при той же машинной репрезентации. Подробнее здесь — типы данных.
Что запомнить
Nim — статически типизированный язык с Python-подобным синтаксисом, компилирующийся в C/C++/JS и дающий нативный исполняемый файл без виртуальной машины. Nim 2.x по умолчанию использует ORC для управления памятью reference-типов.
Основные особенности Nim:
- Отступы вместо скобок — блоки кода задаются whitespace, как в Python.
- Компиляция через C —
nim cгенерирует C и вызывает GCC/Clang; кросс-компиляция через-d:...и--cpu/--os. - Метапрограммирование — шаблоны, макросы,
whenдля compile-time ветвления. - Стандартная библиотека —
std/json,std/httpclient,std/osдля утилит без сторонних пакетов. proc/func,result,seq,Table— базовые строительные блоки прикладного кода.
Маршрут: первая программа → основы → типы → управление → функции и макросы → простые приложения → архитектура.
Три практических правила:
- Перед
rand—randomize(); перед сетью —timeoutиdefer: close(). - Большие файлы — построчно, не
readFileцеликом. - Зависимости — через
nimble, не глобальныйnimble installбез проекта.
Куда идти дальше
| Тема | Раздел |
|---|---|
| Явная память без GC | Zig — о разделе |
| Интерпретация и экосистема | Python — о разделе |
| HTTP и интеграции | HTTP как основа веб-интеграций |
Практика: простые приложения на Nim.
Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). История языка Nim - эволюция идеи "эффективности без потери выразительности" и развитие экосистемы. Простые приложения на Nim — скрипты, файлы, JSON и HTTP на stdlib; примеры с разбором. Основы языка Nim - синтаксис, типизация и принципы системного программирования с высокой производительностью. Архитектура компиляции и метапрограммирования Nim - этапы трансляции, AST и compile-time возможности. Типизация, набор правил определения типа данных значений языка. Управляющие конструкции и операторы Nim - переменные `let/var/const`, ветвления и контроль потока выполнения. Функции и макросы в Nim - объявление `proc`, метапрограммирование и расширение языка через compile-time механизмы. Гайд по установке и настройке с написанием первой программы и её запуском.История языка Nim
Простые приложения на Nim
Основы языка Nim
Архитектура компиляции и метапрограммирования
Типы данных и шаблоны
Управляющие конструкции и операторы Nim
Функции и макросы
Первая программа на Nim