Moonbit: 高速・簡潔・ユーザーフレンドリーなWebAssembly言語
(moonbitlang.com)- WebAssembly がクラウドおよびエッジコンピューティングで重要性を増す中、Moonbit は Wasm の効率性・安全性・小さなサイズをより簡単に活用できる Wasm-first 言語 を目指している
- Rust や C/C++ は学習難度の高さと長いコンパイル時間が負担であり、Go は生成コードが大きく非効率的だという限界を、Moonbit は狙っている
- 設計の焦点は高速なビルドと実行、小さな Wasm 出力、使いやすさであり、複数の中間表現最適化 と関数単位の並列意味解析、増分再解析を含む
- Fibonacci の例では、ローカル関数の型推論、最小の Wasm 出力、Go より高速で Rust に近い性能、再帰クロージャと exhaustive pattern match のサポートを強調している
- 現在はオンライン IDE、CLI ツール、ドキュメント、VSCode 拡張を提供しており、2024 年第 2 四半期末までに beta status に到達し、ベータ品質に達した後にソースコード公開を目標としている
WebAssembly を最優先する言語という目標
- WebAssembly はクロスプラットフォームの命令セットアーキテクチャであり、効率性・安全性・小さなサイズ・公開標準という特性により、クラウドとエッジコンピューティングで重要性が高まっている
- 既存の選択肢では Wasm の潜在力を十分に活かせていないと見ている
- Rust や C/C++ のような低水準の Wasm 言語は学習が難しく、長いコンパイル時間のため開発速度が落ちる可能性がある
- Go のような高水準言語は生成コードが非効率かつ大きく、Wasm の速度と小サイズという利点を活かしにくいと見ている
- Moonbit は高速にビルド・実行でき、小さな Wasm 出力を生成し、Go のように学びやすい Wasm-first 言語を志向している
言語設計とチーム
- Moonbit は Hongbo Zhang と、言語設計・開発経験が 10 年以上あるチームが主導している
- Zhang は OCaml、ReScript、Flow に貢献しており、ReScript ツールチェーンの高速コンパイラ、標準ライブラリ、ビルドシステムで chief architect を務めた
- 言語設計は Go と Rust の両方から影響を受けている
- fault tolerant 型システムは速度、並列化のしやすさ、増分チェックを考慮して設計されており、IDE サポート を中核目標としている
高速なビルドと実行
- Moonbit は開発性能とランタイム性能の両方を含めて、スタック全体で高速な言語 を目指している
- プログラム全体の最適化のために、複数レベルの中間表現(IR)を使用する
- メモリレイアウトを改善してキャッシュミスを減らす方向を取る
- データフローと制御フローの分析に、より良い文脈を提供する
- 既存の多くのリンク時最適化構造よりもプログラム構造を包括的に理解し、効果的な最適化を可能にすると見ている
- 低水準では見えない高水準の重複を見つけて除去できる
- IDE 機能に重要な高速ビルド性能のため、関数単位の並列意味解析を可能にしている
- ReScript や Rust と異なり、関数単位の並列 semantic analysis が可能である
- 同じ粒度で増分再解析を行い、大規模な monorepo を扱いながらミリ秒単位の応答時間を提供できるとしている
小さな Wasm 出力
- Moonbit は効果的な dead code elimination を念頭に設計されている
- この解析を妨げる言語機能を除外し、標準ライブラリもデッドコード除去が容易な構造で構成している
- プログラム全体の最適化により、最終的なコードサイズを大幅に減らそうとしている
- コードサイズの削減はセキュリティ向上と攻撃脆弱性の低減につながると見ている
- serverless コンピューティング環境で高速な起動を保証するとしている
使いやすさのための機能とツール
- Moonbit は自動メモリ管理を提供し、Rust と差別化している
- Go と異なり、ポインタや left value のような危険要素を避けるとしている
- データ指向プログラミングのために安全な機能を提供する
- algebraic data types
- ad-hoc polymorphisms
- pattern match
- 言語を超えてプラットフォームとしての役割も目指しており、初期段階でもツール群を提供している
- 高速ビルドツール
- パッケージマネージャ
- コンパイラ
- IDE
- ブラウザさえあればどこからでもアクセスできる、コンテナ不要の Cloud IDE
- この Cloud IDE はオフライン機能も提供し、既存の Cloud IDE と差別化されるとしている
Fibonacci の例で見る違い
- Fibonacci の例では、MoonBit、Go、Rust の 3 言語で
fib関数を実装して比較している - ベンチマーク によると、MoonBit は型推論、コードサイズ、性能、使いやすさで違いを見せる
- ローカル型推論: MoonBit はローカル関数
auxの型を推論する - 小さな Wasm サイズ: MoonBit が最小の Wasm 出力を生成する
- 性能: Go より高速で Rust に近い
- 使いやすさ: Go のように再帰クロージャをサポートし、Rust では実装が非常に難しいとしている
- Rust のように exhaustive pattern match をサポートし、Go の switch case よりはるかに強力だとしている
- ローカル型推論: MoonBit はローカル関数
現在の状況とロードマップ
- Moonbit は急速に変化している対象だが、現在利用可能な入口を提供している
- 言語ツールチェーンの開発は過去には数年から 10 年かかっていたが、蓄積された経験と初期から編成された専任チームにより開発を簡素化したとしている
- 2024 年第 2 四半期末までに beta status への到達を見込んでいる
- beta status は相対的な安定性、少ないバグ、Wasm host と相互作用するための堅牢な FFI を意味する
- ソースコードはベータ品質に達した後に公開する計画である
- 戦略的計画には、Wasm 2.0 向けの Wasm GC 統合と、Wasm 1.0 向けの独自 GC が含まれ、Wasm proposals に合わせるとしている
コミュニティチャンネル
- 質問は forum に投稿できる
- Discord に参加するか、Twitter account をフォローできる
1件のコメント
Hacker News の意見
このプロジェクトのリードです。いまオンライン IDE https://try.moonbitlang.com ですぐ試せて、F5 で実行できます
ドキュメントは https://github.com/moonbitlang/moonbit-docs にあり、コンパイラはベータ段階に達したら公開予定です。想定時期は 2024年第2四半期末です
例えば、型パラメータの明示的な変性指定、下限/上限制約、高階カインド型(higher-kinded types)、構造的/名目的サブタイピングのどちらが中心なのか、代数的データ型と一般化代数的データ型があるのかも確認したいです
参考: https://v2.ocaml.org/manual/effects.html, https://docs.hhvm.com/hack/contexts-and-capabilities/introdu..., https://austral-lang.org/linear-types
fnキーワードが本当に必要なのか気になります。funcとfnの根本的な違いが分かりませんfuncとfnを区別する必要があるのか、関数シグネチャで戻り値を表す->の矢印が本当に必要なのか気になります新しい型構文が
struct Userですが、この場合は Go のようにtype User structのほうがよいと思います。そうすればtype AssignUser func(name: String, id: Int) -> Intのように、fn変数用の関数型も作れます:がレキサーやパーサーの助けになるのかも気になります。関数シグネチャでfunc(name: String)ではなくfunc(name String)と書けないのか、型宣言もmut elems: List[Int]ではなくmut elems List[int]にできないのか、と聞きたいです。些細な揚げ足取りですが、全体としては気に入っていますサイトは Rust や Go と比較していますが、私には AssemblyScript との比較のほうが適切に見えます。AssemblyScript も WASM ネイティブで、エコシステムがまだ小さい点も似ています
ただ Moonbit と違って TypeScript を使ったことがある人にはなじみのある言語なので、AssemblyScript の代わりに Moonbit を使うべき理由が気になります
AssemblyScript にはパターンマッチがなく、主に文(statement)で構成されます。Moonbit には 代数的データ型がありますが、AssemblyScript にそういうものがあるのかはよく分かりません。ランタイムの違いもさらにあるかもしれませんが、Web サイトだけでは判断しにくいです
トップレベルの関数定義には
func、ネストした関数定義にはfnキーワードを使うのはよくありません。特定の文脈に関係なく、どちらか一方に統一すべきですそれが本当に必要なのか、よい設計なのかは別ですが、前例は多いです
fnは名前と型を省略できるようにし、短いキーワードによって関数定義もより短くできることを示していますWASM をターゲットにするモダンなガベージコレクション言語が出てきて期待しています。最も近い比較対象はおそらく Grain だと思います: https://grain-lang.org/
「言語ツールチェーン全体の開発は、以前なら数年から10年までかかっていたが、蓄積された経験と、Moonbitの初期から編成した専任の優秀なチームのおかげで簡素化された。Moonbitは2024年第2四半期末までにベータ状態に到達すると期待しており、これは比較的安定していてバグが少なく、Wasmホストと相互作用する堅牢なFFIを備えた段階を意味する。ベータ品質に到達したらソースコードを公開する予定だ。戦略的には、Wasmの提案に合わせて、Wasm 2.0向けのWasm GC統合と、Wasm 1.0向けの独自GCを計画している」とされている
そのため、現時点では https://github.com/moonbitlang/ は空になっている
オンラインIDEも試せる: https://try.moonbitlang.com
ここのコメントを見ると、Moonbitにはガベージコレクションがあるようだ。ただ、フィボナッチの結果バイナリが253バイトなら、おそらくGCは含まれていないのだろう
提案中のWASMネイティブGCを使っているのか、それともビルドシステムがここでは不要だと判断してGCを外せるほど賢いのか気になる
フィボナッチ例の出力には
print_i32のインポート、メモリと関数定義、_startのエクスポートだけが見え、GCランタイムが付いている形ではないGrainを思い出す。これもWasmファーストのプログラミング言語なので、比較対象にGrainを追加するとよさそうだ
https://grain-lang.org/
About Teamのリンクは中国語の edu.cn ページにつながっている。大学プロジェクトのように見えるが、確信はない。Join Usページも中国語で、ホームページの例はbaidu.comのJavaScriptが必要なように見える
Goではフィボナッチをあのようには実装しない
慣用的な実装同士を比較してトレードオフを細かく論じる代わりに、数字をいくつか投げ込む方が簡単だったのだろう。単なる言語のティーザーだとしても、人々に誤解させないためにはTCOについての注釈は入れた方がよさそうだ
switch文が原因だと思われ、Goではそれが遅くなり得るそれでもMoonbitを紹介するティーザーとしては悪くない
このプロジェクトが Meta と関係があるのか気になる。作者のHongbo ZhangはMetaでReasonMLやFlowのようなオープンソースのプログラミング言語プロジェクトに携わっており、LinkedInによれば現在もMetaに在籍している