A review of Nim 2: The good and bad with example code
Плюсы Nim 2
- Память: по умолчанию ORC/ARC (RAII, деструкторы, move/copy), а не трассирующий GC. Можно
--mm:none
или--mm:atomicArc
. - Компилируется в C/C++/Obj-C/JS; выбираем компилятор (
gcc
,nvcc
, …). - Лёгкая интеграция:
{.importc.}
,{.importcpp.}
,{.importjs.}
,{.compile.}
для сторонних файлов. - Метапрограммирование: макросы,
static
исполнение кода на этапе компиляции, генерация CUDA. - Краткость: мало шаблонного кода (чат на 70 строк).
- Производительность ≈ C/C++/Rust; поддержка SIMD, CUDA.
Минусы и подводные камни
- Генерируемый C/C++ код нечитаем — не цель проекта.
- Нет атомарных счётчиков в ORC по умолчанию (требуется флаг).
- Некоторые старые статьи/комментарии описывают Nim 1.x (GC по умолчанию).
- Синтаксис чувствителен к отступам и регистру (но это субъективно).
Мини-пример: простой key/value формат
import std/[tables, strutils]
type Config = object
host*: string
port*: int
proc loadConfig(path: string, T: typedesc): T =
let data = readFile(path).splitLines()
var kv = initTable[string, string]()
for line in data:
let parts = line.split('=')
if parts.len == 2:
kv[parts[0].strip()] = parts[1].strip()
result.host = kv.getOrDefault("host", "localhost")
result.port = parseInt(kv.getOrDefault("port", "8080"))
let cfg = loadConfig("app.conf", Config)
echo cfg.host, ":", cfg.port
Файл app.conf
:
host = 0.0.0.0
port = 9000
Всё компилируется в один бинарник без GC-задержек.