Skip to content

セルフホストまでの道のり #651

Description

@narumincho

definy が目指す「セルフホスト(Self-hosting)」は、**「definy の言語仕様・コンパイラ・エディタ・ランタイム・UI、さらにはサーバーまでもが definy 自身(Part / Module / Expression)で記述され、definy 上で開発・実行・進化していける状態(ブートストラップ)」**を指すものと捉えられます。

現在のリポジトリのアーキテクチャ(Rust + Dioxus + SurrealDB、WASM コンパイラ wasm_emitter、イベントソーシングによる AST 表現)を踏まえると、セルフホストへの道のりは大きく 5つのフェーズ に分けられると考えられます。


セルフホストへのロードマップ案

flowchart TD
    P1["Phase 1: 言語機能・表現力の拡充<br>(関数・ADT・バイト列操作)"]
    P2["Phase 2: コンパイラのセルフホスト<br>(definy による WASM Emitter 実装)"]
    P3["Phase 3: イベントモデル・コアロジックの自己定義<br>(ハッシュ計算・状態還元)"]
    P4["Phase 4: エディタ / UI のセルフホスト<br>(Live Programming 環境)"]
    P5["Phase 5: フルスタック・独立実行環境<br>(WASI / サーバー自立)"]

    P1 --> P2
    P2 --> P3
    P3 --> P4
    P4 --> P5
Loading

Phase 1: 言語機能・表現力の拡充(コンパイラを書ける言語にする)

コンパイラ自身を definy で記述するためには、まず definy 言語に「複雑なデータ構造とアルゴリズム」を表現できる能力が必要です。

  1. 第一級関数と再帰
    • ラムダ式(クロージャ)、無名関数
    • 再帰呼び出し、高階関数(map, fold, filter など)
  2. 代数的データ型 (ADT) とパターンマッチング
    • 現在の TypeLiteral / レコードだけでなく、Variant (タグ付き直和型 / enum) の完全なサポート
    • AST(Expression や Type)をエレガントに走査・分解するためのパターンマッチ / match 式
  3. 低レベル・バイナリプリミティブ
    • WASM バイナリを構築するための バイト列型 (Bytes / Uint8Array) とその操作(バイト追加、整数エンコード、LEB128 等)

Phase 2: コンパイラのセルフホスト(ブートストラップ達成)

Rust 側(compiler.rs)で実装されている「式から WebAssembly を出力する処理」を definy 自身で書き直します。

  1. AST と型の自己定義
    • definy のモジュール/パートとして Expression, Type, WasmInstruction などを定義
  2. definy 製 WASM Emitter の実装
    • compile_to_wasm : Expression -> Bytes となる関数(Part)を definy で実装
  3. ブートストラップ検証(Stage 1 〜 Stage 2)
    • Stage 0 (現在): Rust 製コンパイラ
    • Stage 1: Rust 製コンパイラで「definy 製コンパイラ」をコンパイルして compiler.wasm を得る
    • Stage 2: compiler.wasm を使って「definy 製コンパイラ」自身を再コンパイルし、出力された WASM が完全に一致すること(決定論的ビルド)を確認
    • 👉 ここで「コンパイラのセルフホスト」が完了

Phase 3: イベントモデルとコアロジックのセルフホスト

definy は純粋な AST だけでなく「イベントソーシング」でコードが進化する世界観を持っています。

  1. イベントハッシュ計算の抽象化
    • SHA-256 などの暗号学的ハッシュを definy の組み込み(または WASM ランタイム経由)で計算できるようにする
  2. Reducer / Folder の definy 化
    • イベント列(Vec<Event>)から現在のプログラム状態(Part や Module の辞書)を構築するリダクションロジックを definy で記述

Phase 4: エディタ / UI のセルフホスト(ライブプログラミング)

definy の最大の魅力の一つは、Web 上で完結する構造化エディタ(expression_editor)です。

  1. 宣言的 UI モデルの確立
    • HTML / SVG ノードを返す Elm Architecture や React/Dioxus 風の UI 抽象を definy 上に定義(Virtual DOM / Component)
  2. エディタ自体の自己ホスト
    • 現在 Dioxus (Rust) で書かれているパート詳細、式ツリーエディタ、イベント履歴一覧を definy で再構築
  3. ドッグフーディング(自己編集ループ)
    • 「definy のエディタの UI を definy で編集し、即座に画面上のエディタ自身が変わる」 という Smalltalk / Pharo のような自己反映的(Self-reflective)な開発体験を実現

Phase 5: フルスタック・自立したホスティング環境

最終的に、クライアントだけでなくサーバーやストレージ連携も含めて definy エコシステム内で完結させます。

  1. I/O・エフェクトの抽象化 (WASI / Web API)
    • HTTP リクエストの受信、DB (SurrealDB や KVS) へのアクセスを純粋関数型言語の枠組み(Task や Effect)で安全に抽象化
  2. definy サーバーのセルフホスト
    • イベントを受け取って保存・配信するバックエンド API(definy-server)も definy から WASI / Node / Deno 向けにビルドしてデプロイ
  3. definy.app 上で definy.app が稼働・更新される世界の完成

まず直近(次のステップ)として取り組むと良さそうなこと

いきなり全体を目指すのではなく、まずは Phase 1〜2(最小限のセルフホストコンパイラ) にフォーカスするのが確実です:

  • 関数抽象(ラムダ・呼び出し)の実装: 式エディタと WASM エミッタで関数呼び出しを扱えるようにする
  • Enum / 代数的データ型: 式の種類(Add, Number, If 等)を definy の型システムで表現できるようにする
  • バイト列操作(Bytes)の導入: バイナリ出力のためのプリミティブを整備する

definy の「すべての変更がイベントとして記録され、不変のハッシュで参照される」という土台は、コンパイラの再現性(キャッシュ・決定論的ビルド)と非常に相性が良いため、セルフホストを達成したときには他の言語にはない非常に強力で美しい開発環境になるはずです。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions