2 ポイント 投稿者 GN⁺ 2023-08-20 | 1件のコメント | WhatsAppで共有
  • 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 は OCamlReScriptFlow に貢献しており、ReScript ツールチェーンの高速コンパイラ、標準ライブラリ、ビルドシステムで chief architect を務めた
  • 言語設計は Go と Rust の両方から影響を受けている
    • Go のシンプルさ、特に パッケージシステム を取り入れている
    • Rust の表現力、パターンマッチング型推論、ジェネリクス、trait に似た ad-hoc polymorphism を含む
  • 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 は急速に変化している対象だが、現在利用可能な入口を提供している
  • 言語ツールチェーンの開発は過去には数年から 10 年かかっていたが、蓄積された経験と初期から編成された専任チームにより開発を簡素化したとしている
  • 2024 年第 2 四半期末までに beta status への到達を見込んでいる
    • beta status は相対的な安定性、少ないバグ、Wasm host と相互作用するための堅牢な FFI を意味する
  • ソースコードはベータ品質に達した後に公開する計画である
  • 戦略的計画には、Wasm 2.0 向けの Wasm GC 統合と、Wasm 1.0 向けの独自 GC が含まれ、Wasm proposals に合わせるとしている

コミュニティチャンネル

1件のコメント

 
GN⁺ 2023-08-20
Hacker News の意見
  • このプロジェクトのリードです。いまオンライン IDE https://try.moonbitlang.com ですぐ試せて、F5 で実行できます
    ドキュメントは https://github.com/moonbitlang/moonbit-docs にあり、コンパイラはベータ段階に達したら公開予定です。想定時期は 2024年第2四半期末です

    • 新しいプログラミング言語を見るときにまず確認する質問です: 非同期コードはどう書くのか、代数的効果(algebraic effects)・コンテキスト/ケイパビリティ(contexts/capabilities)・線形型(linear types)のような、あまり主流ではない機能があるのか、型システムは健全で型キャストが必要なのか、インターフェース/トレイト/プロトコルをサポートするのか、ジェネリクスがどれほど豊富なのかが気になります
      例えば、型パラメータの明示的な変性指定、下限/上限制約、高階カインド型(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
    • ライセンス、価格、プロジェクトのコントロール権について知りたがる人は多そうです。いま公開することが商業戦略上不利になる可能性はありますが、秘密主義と不確実性は関心を冷ましてしまうことがあります
    • https://moonbitlang.com/docs/syntax/ のドキュメントは、文字色と背景色のせいで読みにくいです
    • 専用の fn キーワードが本当に必要なのか気になります。funcfn の根本的な違いが分かりません
    • funcfn を区別する必要があるのか、関数シグネチャで戻り値を表す -> の矢印が本当に必要なのか気になります
      新しい型構文が 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 を使うべき理由が気になります

    • Moonbit はモダンな言語で、AssemblyScript は過去の失敗を受け継いでいるからです。例えば Moonbit は パターンマッチをサポートし、言語構成要素の大半が式です
      AssemblyScript にはパターンマッチがなく、主に文(statement)で構成されます。Moonbit には 代数的データ型がありますが、AssemblyScript にそういうものがあるのかはよく分かりません。ランタイムの違いもさらにあるかもしれませんが、Web サイトだけでは判断しにくいです
    • AssemblyScript よりは Grain にはるかに近く見えます: https://grain-lang.org/
    • Rust と Go との比較は、どちらも人気があり WASM サポートが第一級の言語だからだと思いますが、AssemblyScript と比較すべきだという点には同意します
  • トップレベルの関数定義には func、ネストした関数定義には fn キーワードを使うのはよくありません。特定の文脈に関係なく、どちらか一方に統一すべきです

    • ネストした関数はクロージャだから、ということかもしれません。トップレベル宣言と違って名前と型を省略でき、値をキャプチャできるので、別個のクロージャ/ラムダ構文を持つ言語は珍しくありません
      それが本当に必要なのか、よい設計なのかは別ですが、前例は多いです
    • ネストした関数に、より短く読みやすい関数定義を許しているので、エレガントな設計だと思います。fn は名前と型を省略できるようにし、短いキーワードによって関数定義もより短くできることを示しています
  • WASM をターゲットにするモダンなガベージコレクション言語が出てきて期待しています。最も近い比較対象はおそらく Grain だと思います: https://grain-lang.org/

    • Grain コンパイラは純粋な OCaml ではなく ReasonML で書かれているそうです。こうしたニッチな技術がためらいなく何層にも積み重なっていく様子は、ちょっとコメディのようです
  • 「言語ツールチェーン全体の開発は、以前なら数年から10年までかかっていたが、蓄積された経験と、Moonbitの初期から編成した専任の優秀なチームのおかげで簡素化された。Moonbitは2024年第2四半期末までにベータ状態に到達すると期待しており、これは比較的安定していてバグが少なく、Wasmホストと相互作用する堅牢なFFIを備えた段階を意味する。ベータ品質に到達したらソースコードを公開する予定だ。戦略的には、Wasmの提案に合わせて、Wasm 2.0向けのWasm GC統合と、Wasm 1.0向けの独自GCを計画している」とされている
    そのため、現時点では https://github.com/moonbitlang/ は空になっている

  • ここのコメントを見ると、Moonbitにはガベージコレクションがあるようだ。ただ、フィボナッチの結果バイナリが253バイトなら、おそらくGCは含まれていないのだろう
    提案中のWASMネイティブGCを使っているのか、それともビルドシステムがここでは不要だと判断してGCを外せるほど賢いのか気になる

    • ファイルを右クリックして、下から2番目のメニューである Compile to Wat を選ぶと、WASMテキストを直接見られる
      フィボナッチ例の出力には print_i32 のインポート、メモリと関数定義、_start のエクスポートだけが見え、GCランタイムが付いている形ではない
    • おそらく賢く省略しているのだと思う。コードサイズが彼らの目標の一つだからだ
  • Grainを思い出す。これもWasmファーストのプログラミング言語なので、比較対象にGrainを追加するとよさそうだ
    https://grain-lang.org/

  • About Teamのリンクは中国語の edu.cn ページにつながっている。大学プロジェクトのように見えるが、確信はない。Join Usページも中国語で、ホームページの例はbaidu.comのJavaScriptが必要なように見える

    • umatrixプラグインを有効にしてもデモは依然として動作する。必要なスクリプトは unpkgmsecnd(Microsoftドメイン)から来ており、baiduは不要だ
  • Goではフィボナッチをあのようには実装しない

    • Goが好きなわけではないが、あのベンチマークが筋の通らないものだという点は認めざるを得ない。末尾呼び出し最適化をサポートしない言語で末尾呼び出しを使えば、当然結果は悪くなる
      慣用的な実装同士を比較してトレードオフを細かく論じる代わりに、数字をいくつか投げ込む方が簡単だったのだろう。単なる言語のティーザーだとしても、人々に誤解させないためにはTCOについての注釈は入れた方がよさそうだ
    • こじつけの例でWASMとGoを使いながら TinyGo に触れないのは、あまり誠実には見えない
    • Rustでもそのようには実装しない。かなり悪いベンチマークだ。私の経験では、末尾再帰がないことと switch 文が原因だと思われ、Goではそれが遅くなり得る
      それでもMoonbitを紹介するティーザーとしては悪くない
  • このプロジェクトが Meta と関係があるのか気になる。作者のHongbo ZhangはMetaでReasonMLやFlowのようなオープンソースのプログラミング言語プロジェクトに携わっており、LinkedInによれば現在もMetaに在籍している