所感ではなくあえて初感とした。ファーストインプレッション…、とは言い難いくらい今までもずっとnimは書いてはきたのだけれど、本気で使おうと思ったのは初に近いので。
個人的に感動したのは、nimが1.0になる前から使っていた頃や、1.4くらいのArcが出る前くらいのnimとは比べ物にならないくらい適用範囲が広がっていること。
UEやGodot等での利用
特にNimForUEやgdext-nim(つまりNim for Godot)が動いたときは感動した。実は両方とも以前から使おうと思って動作確認テストは軽くしてたものの、バージョンミスマッチ等で動かなかったりとか、動いてもなんか面倒だなと思って使っていなかった。
特にGodotについては、自分でもgdextensionは必要に応じて書きつつも、ほとんどgdscriptで書いていたのだけれど、最近速度面が気になるようになってきた。ただUEのBlueprintといい、標準のスクリプト的なものが一番シームレスにノンストップに開発できるのは確かなので、わざわざこういうサードパーティのプラグインを導入するのは少しリスキーではあるのは確か。
ただ、それはあくまでGodotやUE側から見た見方だったのだけれど、nim言語から見れば適用範囲がすごく広がっている。特にゲームエンジンに乗っかれば、普通のnim開発で見舞われるようなC/C++固有のエラー系は少ないので、C/C++固有の知識を強く求められることも減る。
そしてGodotでもUEでも、C++をスクリプトやブループリントの代わりに使うのはいずれもハードルが高いので、nimがその緩衝材として働くなら、それほど嬉しいことはない。ただプラグインの動作やビルドがちゃんとできる前提にはなってくるけれど、UEは個人的にC++プロジェクトで散々な思いをしてきてあまり開発体験がよくない印象しかないし、Blueprintもコードで書けば一瞬なのにと思う部分がめっちゃまどろっこしかったり、どちらも良い印象ではないので、それ以外の第三のスクリプトとしてUnityでいうC#的な選択肢の一つがあるのは嬉しい。
実は同様の用途でUnLuaを検討していたりもしていたのだけれど、全く別のLuaプラグインが、C++やBlueprintの関数へのバインディングが全然なくてがっかりして、もちろんUnLuaがそうではないことは頭ではわかっているけれど、やっぱり非C/C++だとバインディングされてなかったら終わるなーというイメージがあって、その点nimはC/C++へのトランスパイラなので安心感が大きい。
かつ、以前自分が体験したようなGC周りで詰まってしまってプロファイリングに時間がかかったりなども、nimでは少ないと予想される。
正直こういう目線でnimを見たことがなかったので、案外良いものかもしれないという印象を受けた。
スクリプト言語やタスクランナーとしての利用
ちなみに最初のとっかかりとしてPythonやRubyで書いているような軽いウェブスクレイピングをnimで書いてみたりしたのだけれど、結構すんなり動いたし書きやすかったし、nimscriptも書きやすかった。
nimscripterを使えばLuaのようにスクリプト言語としてnimscriptを使うこともできるらしいけれど、そうでなくてもmakeみたいなタスクランナーとしては普通に使いやすいし、やっぱDSL書けるのは最強だなと思った。この辺はPythonっぽいというよりもRubyっぽくて、なんだか高速なRubyという印象。
高速なRubyといえばCrystalだけど…
高速なRubyといえばCrystalがあるけれど、Crystalはtypeid(型のVMにおける扱い)が特殊なせいでC/C++用のライブラリを作るのが事実上難しいとか、Lua等と同じようにGCの扱いが難儀だという噂を聞くので、Crystalも何度となく使おうと思って諦めた経緯がある。
そういう意味では、自分はLuaこそRubyっぽくて楽しいと思ってここしばらくは使ってきたので、その代わりとしてnimがRubyっぽいのは、とてもありがたいことだなと思う。
nimは静的型付け言語ではありつつも、C/C++譲りの動的な操作のやりやすさ、OdinやV言語並にポインタ等がシームレスに扱えて、C/C++との連携性が強い。その上DSLにも強かったり、NimForUEで実感したけれど、C#やJavaっぽいアノテーションも扱えるおかげで、C/C++でマクロで書かれているような黒魔術も問題なく移換できそう。まあ最悪はマクロもあるけれど、ラムダとUFCSがある時点でマクロはRustでいう println! のような特殊な用途だけに使うべきかなとは思う。(それも $ や repr が存在しているので価値は薄いけど。)
まとめ
ということで、長々と書きすぎたけど、概ねとても好印象ではある。これだけ適用範囲が広いと、何から手を付けたものかなと思うけれど、まずは身近な小さなスクリプトをnimで書いていくことや、久々なので基本構文をおさえるところからやっていこうかな。
個人的には nim-bgfx や bgfx.nim がずっと保守されてなくてサンプルが動かないのが残念なので、まずはそこからかなぁとも思う。