前の記事の脚注くらいで、Haxeは案外nimの競合にあたるのかなとふと思った。
Haxeもnimも、どちらもゲーム開発に積極的に使われている印象で、クロスプラットフォームで動いているように見える。では何が違うのだろう。
RedditやHaxeのフォーラム等で議論が少しあったけれど、個人的に一番違うのは、HaxeがJavaのような「Write Once, Run Anywhere」を掲げていて(そしてかつ掲げていながらも必ずしも複数のターゲットで同じ挙動はせず、単一のVMを持たないという矛盾を持っていて)、一方でnimは単なるC++トランスパイラのシステム言語である点だと思う。
自分の目標は別にマルチプラットフォーム対応ではなく、Write Once Run Anywhereでなくても良い。プラットフォームごとに別のコードがあったっていいし、ある意味歓迎だし、プラットフォームごとに固有のコードを書いてチューニングするべき点はチューンアップできるべきだと自分は思う。その点C++に直接触れて、C++をみていれば良い、そしてC++の知識がそのまま使えるnimはありがたい。
一方でHaxeはそうではない。ライブラリやフレームワークだけをみれば、OpenFLとかkhaとか、Armory3Dとか魅力的なフレームワークはたくさんあるけれど、どの実装も実際のランタイムターゲットが何になるかは実際定まっていなくて不定。おそらくプラットフォームごとのデバッグはライブラリ自体の対応にかなりの程度依存するはず。(一応HashLinkなどの共通VMはあるけれどおそらくアーキテクチャ対応は限定的。)
ある意味で、一度書いたコードを低レイヤーを気にすることなく永らえることができるのは、Javaと似た思想で興味深いところではあるけれど、自分はそのJavaからはだいぶ今は距離をおいているので、正直実際のところはわからない。ブラウザのJavaScriptやNode.jsとか、C# .NET Coreとか(Monoとか)、事実上のWrite Once Run Anywhereは多数あるけれど、そういう意味でも、正直この分野ではJavaScriptを書くかC#を書けば事足りるのかなと思うし、そういう意味ではJavaScriptとC#で共通のコードベースをHaxeで書けるのは人によっては嬉しいのかもしれない。(あとは.NET Coreが実際はうまくいっていない部分をHaxeは独自のライブラリで補えているのは強いのかもしれないけれど、ゲーム開発にかなり偏っている印象はある。)
自分も最近は開発基盤をMacからWindowsに移してしばらく経つので、.NETやC#の資産を活用したい思いは少しあり、TiXLとかでもnimとか書けたらいいのにと思うけれど、そういう分野でHaxeが書けるというわけでもないので(書けるけどC#に対応できるというだけで対応コストの分の見返りは特にないので)、おそらくHaxeとnimは一見似ているようでいて実際は全く違うニーズとユースケースなのだろうと思う。
一方でnimをC++トランスパイラとしてのシステム言語と捉えるなら、Haxeとの比較スレッドでもよく挙げられていたnimの特徴として、ネットワーク関係に強いのは結構意外な強みなのかなという気がする。Rustが最近WASMターゲットも含めてそういう強みを出してきているけれど、C++は基盤として使われているとはいえアプリ開発言語としてネットワークに強いイメージはあまりないので、こういう部分はnimのPython-likeな部分やDSL(マクロ等)が活きてきているのかなと思うと興味深いかもしれない。