Nim/Haxeの再探求 (2)

投稿日: 2024/10/21 14:56:27

カテゴリ: 言語探求

サムネイル: なし


前の記事の続き。

前記事の最後に、Beefという言語について取り上げて、元々この再探求のきっかけになったC3言語とも比較をしてみた。

簡単にいえば、C3はC言語との互換性を極力重視している一方、BeefはC#と似た構文を持ちながらもC/C++のような手動メモリ管理を取り入れている点がポイントといえる。

そこで改めてNim/Haxeと改めて比較してみると、自分はやはり、GCにメモリ管理を完全に委ねるのはかなり抵抗があるということに気付いた。ただ一方で、すべてを手動管理するというのもなかなか辛い。

C++(11以降)がバランスが良いのは、基本的に手動のメモリ管理が可能でありながら、スマートポインタによる疑似GC(参照カウント操作)が可能という点。これはGodotが採用しているGDScriptとGDExtensionにもいえる。Godotの場合はRefCountクラスを継承したものは参照カウントで管理され、それ以外は手動メモリ管理になる。

自分はこれくらいのバランス感覚がちょうどいいかなと思っていて、Zigでも実はzigrc等を使えばできるのだけれど、普段から毎回アロケータを意識しなければいけないのはちょっと大変かなという気がする。もちろんZigの場合は隠された動作は極力しないという哲学があるのでシンプルで良いと思うけれど、自分はC3/Beefくらいの、必要なときだけカスタムアロケータを渡せたり、スタックアロケータは別で使える(C3でいうtalloc、Beefでいうscope)くらいが良いバランス感覚な気がする。

正直、必要なときだけ参照カウント(RefCount)が気軽に使える言語というのは、C++/(Godot)/Rustくらいしか自分は知らない。Zigはやっと最近前述のzigrcのようなライブラリが出てきたけれど、逆にいえばC3/Beefでも同様のスマートポインタやスマートクラス(あるいはカスタムアロケータ)を作ってしまえば良い気はするものの、それだと車輪の再発明をしてしまいがちなので、RustのRcのように標準ライブラリに入っていてほしい気もする。

…と、こんなノリで結局C++を使い続けてしまいながら、ざっと書きなぐるときはPythonとかを使って結局最後に書き直す羽目になるので、もう少し調べて性に合う言語を見つけたい。

ちなみになぜC++が嫌なのかといえば、ぶっちゃけC++17に固定できるなら何も問題はないのだけれど、互換性の問題でそれ未満を使わなければならないケースは多くて、そうなるとOptionalすらstdになくてBoostを使ったりする羽目になるのが辛い。これはどの言語にもいえることかもしれないけれど、C++は依存関係が複雑であることが多いのでなかなか一筋縄ではいかない。

(余談として、この記事を書いたあとにBeefを試してみようとしたけれど、Apple SilliconのMacはまだサポートされていない様子だったのでIssueを立てた。良さそうな言語だったので使ってみたかったけれど、Apple Sillicon Macがサポートされていないのは個人的につらすぎるので、Beefも見送りかなぁ。)