Nim(ニム)は、効率性、表現力、エレガンスを追求したシステムプログラミング言語です。2008年にAndreas Rumpfによって開発が始まり、2024年にバージョン2.0がリリースされ、安定した成熟期を迎えています。Nimの最大の特徴は、Pythonに似た読みやすい構文を持ちながら、C言語に匹敵する実行速度を実現していることです。
NimはC、C++、JavaScriptへのトランスパイル方式を採用しており、既存のCライブラリとのシームレスな連携が可能です。この設計により、パフォーマンスが要求される場面でもPythonのような快適な開発体験を得られます。
Nimの構文はインデントベースで、Pythonに非常に似ています。変数宣言、関数定義、制御構文のいずれもPythonユーザーにとって馴染みやすいものです。
# 変数宣言
var mutableVar = "変更可能"
let immutableVar = "変更不可"
const compileTimeConst = 42
# 関数定義
proc greet(name: string): string =
result = "こんにちは、" & name & "さん!"
# 制御構文
for i in 0..4:
if i mod 2 == 0:
echo i, "は偶数です"
else:
echo i, "は奇数です"
varはミュータブル、letはイミュータブル、constはコンパイル時定数という3段階の変数宣言があり、意図を明確に表現できます。
Nimは静的型付け言語ですが、強力な型推論により、型注釈を最小限に抑えることができます。さらに、ジェネリクス、代数的データ型、型クラスに相当する概念(コンセプト)など、モダンな型システム機能を備えています。
# ジェネリクス
proc findMax[T](arr: openArray[T]): T =
result = arr[0]
for item in arr:
if item > result:
result = item
echo findMax([3, 1, 4, 1, 5, 9, 2, 6]) # 9
echo findMax([1.5, 2.7, 0.3]) # 2.7
# 代数的データ型(Object Variants)
type
ShapeKind = enum
skCircle, skRectangle
Shape = object
case kind: ShapeKind
of skCircle:
radius: float
of skRectangle:
width, height: float
proc area(s: Shape): float =
case s.kind
of skCircle: 3.14159 * s.radius * s.radius
of skRectangle: s.width * s.height
メモリ管理については、Nim 2.0ではデフォルトでORC(Ownership-based Reference Counting)というガベージコレクタが採用されています。参照カウントベースでありながら循環参照も適切に処理でき、リアルタイム性の高いアプリケーションにも適しています。
Nimの真の強力さはメタプログラミング機能にあります。テンプレート、マクロ、コンパイル時関数実行(CTFE)により、ボイラープレートコードを劇的に削減できます。
# テンプレートによるDSL構築
template benchmark(name: string, body: untyped) =
let start = cpuTime()
body
let elapsed = cpuTime() - start
echo name, ": ", elapsed, "秒"
import std/times
benchmark("フィボナッチ計算"):
var a, b = 1
for i in 0..39:
let temp = a
a = b
b = temp + b
echo "結果: ", b
このようなメタプログラミング機能により、ドメイン固有言語(DSL)の構築や、フレームワークレベルの抽象化が言語レベルで実現できます。RustのマクロやC++のテンプレートメタプログラミングに匹敵する能力を、より直感的な構文で利用できるのです。
Nimの実行速度はCに非常に近く、多くのベンチマークでGoやRustと同等のパフォーマンスを示します。Pythonと比較すると数十倍から数百倍高速です。
# フィボナッチのベンチマーク例
proc fib(n: int): int =
if n <= 1: return n
return fib(n - 1) + fib(n - 2)
echo fib(40) # Cとほぼ同等の速度で実行される
コンパイルは以下のコマンドで行います。
nim c -d:release -o:fib fib.nim # リリースビルド
nim c -r fib.nim # コンパイルして即実行
Nimはまだメジャーな言語とは言えず、エコシステムの規模ではPythonやGoに及びません。しかし、「Pythonの書きやすさとCの速さを両立したい」という明確なニーズがある場合、Nimは非常に有力な選択肢です。特にPythonで書いたプロトタイプを高速化したい場面や、Cで書くには複雑すぎるシステムプログラミングの場面で真価を発揮します。言語選択の幅を広げるために、一度触れてみることをお勧めします。