This article is a detailed review of Nim 2, a systems programming language praised for its conciseness, flexibility, and performance. The author has used Nim for 1-2 years and believes it’s undervalued despite some imperfections. Nim is noted for feeling like a high-level language such as Python while delivering systems-level performance comparable to C, C++, Rust, and others. Key points include: - Memory Management: Nim 2 defaults to ORC/ARC reference counting with RAII-style destructors, moves, and copies, rather than a tracing garbage collector. This approach is similar to C++'s sharedptr but without atomic counters unless enabled. - Compilation and Interoperability: Nim compiles to C, C++, Objective-C, or JavaScript and supports choosing the underlying C/C++ compiler. It excels in interoperability, able to import existing C/C++ code including templates, constructors, operators, etc. - Language Design: Nim supports procedures with Uniform Call Syntax (UFCS), making properties, method calls, and operator overloading straightforward without requiring complex macros. It has strong typing features such as variants, distinct types, tuples, and type classes with support for generics and concepts. Async programming is available in user space via macro-transformed code, with two available async runtimes. - Metaprogramming: Nim emphasizes powerful compile-time code execution, macros for AST transformations, hygienic templates, and the ability to reflect on object fields enabling easy serialization/deserialization without external code generators. The article showcases a practical example implementing a simple key-value file parser that uses Nim’s fieldPairs and overloadable parseValue procedures to automatically load configuration from files into user-defined objects. This example also highlights how Nim’s compile-time execution can be used for static configuration. Downsides mentioned:** - Tooling and Debugging: The Nim LSP can be unstable and slow; debugging is challenging due to name mangling and double compilation through Nim and C/C++ compilers. NimScript debugging is unsupported. - Compile Times: Reasonable but could improve, currently limited by lack of incremental compilation and just compiling via C. Nim 3 aims to address this. - Language Idiosyncrasies: Features like inline iterators can confuse newcomers, and forwarding varargs is not straightforward. Writing macros can be difficult, needing compile-time execution. - Standard Library: Lacks WASM support out of the box; some parts may need redesign to align with new language features. In conclusion, Nim offers a compelling combination of concise syntax, powerful metaprogramming, and systems-level capabilities. While the community is small, several high-quality libraries exist—such as cligen for CLI parsing, mummy for HTTP/WebSocket servers, karax for HTML DSL, and others for JSON, compression, graphics, and machine learning. The author encourages exploring Nim’s u