超dotnet new (2026/5/29) MoonBitをC# にTranspileする akeit0
自己紹介 名前: akeit0 読み方:あけいと https://github.com/akeit0 https://x.com/Akeit0_ 株式会社バーチャルキャスト2025年新卒(?)入社 Unity x VR をしながら、趣味もC#。 最適化、言語実装周りなどでOSS活動をしている。 公開しているものは実験的なものが多い 最近はjs engineとかブラウザとか
MoonBitとは > MoonBit はクラウドおよびエッジコンピューティング向けの エンドツーエンドなプログラミング言語ツールチェーンであり、 wasm、wasm-gc、js、native バックエンドに対応しています。 MoonBit ドキュメント — MoonBit v0.9.3 ドキュメント より引用 見た目はrustに近い ● ● ● 型は後置 voidではなくUnit pipeline演算子はF#のような第1引数に入れていく形式
何したの? MoonBitからC#へのtranspilerつくったよ 公式のオープンソースのコンパイラが一年更新されていない パーサーも安定せず、最新に追従おそい なのでparserから実装 変換手順としては moonbitでirのjsonを作ってC#/RoslynでC#生成 実験的なので実用段階ではないがシンプルなライブラリはそのまま動く 今回の説明に用いる C#コードは自動生成 akeit0/moonbit2csharp
structを宣言しよう structでも自動的に参照型、つまりclass #valtypeでbackend次第で一応値型に これはmutだからclassでsetterがある
traitをC#で書こう(今回のメイン) traitはinterfaceのようなもの。ただし後付可能
traitをC#で書こう C#で表現するとこう generic math!!!
traitを実装する 普通に実装...
型制約 ● ● traitはあとから付け足せる ので実装を別にする trait 制約が増えれば指定 する実装も増える
traitオブジェクト C#でも ってするよね moonbitだとこう
trait オブジェクトをC#で ● ● インスタンスと実装が別 実装用インスタンスを用意
trait オブジェクトをC#で ● ● 実装インスタンスはgeneric cache アロケーションを減らすにはこ れが現時点ではよさそうだが検 討の余地あり
Char ● ● ● ● ● ● Charはunicodeコードポイントなのでint32 C#で言えばRune 現代的...! traspile後はintに StringをiterateするとCharが返ってくる Stringの内部はUTF-16でC#へのtranspile的にはありがたい。
バイナリなど ● immutableなBytes型がある ● 実行時のリフレクションなどが ない ので自由 ● 裏ではただのbyte[] ● ReadOnlyArray[T]なども裏ではT[]
enum ● ● enumはpayloadを持てる なければそのままenum ● payloadあればprivate closedなパターンの abstractなclassとenumを生成して、 matchではtagでswitch+Unsafe.As <T>でcast ● C#実装は煩雑なので省略
愚痴 C#にblock 式欲しいなあ (来ないと思うけど)
最後に MoonBitはいいぞ 来月1.0がリリースされるらしい