Hacker News Digest

28 августа 2025 г. в 22:25 • miguel-martin.com • ⭐ 216 • 💬 51

OriginalHN

#nim#c#cpp#rust#cuda#javascript#webassembly#metaprogramming

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-задержек.