Files
hakorune/README.ja.md
nyash-codex dd65cf7e4c builder+vm: unify method calls via emit_unified_call; add RouterPolicy trace; finalize LocalSSA/BlockSchedule guards; docs + selfhost quickstart
- Unify standard method calls to emit_unified_call; route via RouterPolicy and apply rewrite::{special,known} at a single entry.\n- Stabilize emit-time invariants: LocalSSA finalize + BlockSchedule PHI→Copy→Call ordering; metadata propagation on copies.\n- Known rewrite default ON (userbox only, strict guards) with opt-out flag NYASH_REWRITE_KNOWN_DEFAULT=0.\n- Expand TypeAnnotation whitelist (is_digit_char/is_hex_digit_char/is_alpha_char/Map.has).\n- Docs: unified-method-resolution design note; Quick Reference normalization note; selfhosting/quickstart.\n- Tools: add tools/selfhost_smoke.sh (dev-only).\n- Keep behavior unchanged for Unknown/core/user-instance via BoxCall fallback; all tests green (quick/integration).
2025-09-28 20:38:09 +09:00

20 KiB
Raw Blame History

🐱 Nyash プログラミング言語

超真面目に作っている趣味言語
20日でゼロからネイティブバイナリへ - AI駆動の言語革命

🇺🇸 English Version / 英語版はこちら

Selfhost Minimal Core Smoke Everything is Box Performance JIT Ready MIT License


開発者向けクイックスタート: docs/DEV_QUICKSTART.md ユーザーマクロPhase 2: docs/guides/user-macros.md AST JSON v0マクロ/ブリッジ): docs/reference/ir/ast-json-v0.md セルフホスト1枚ガイド: docs/how-to/self-hosting.md ExternCallenv.*)と println 正規化: docs/reference/runtime/externcall.md

MIR 統一Call既定ON

  • 呼び出しは中央(emit_unified_callで集約。開発段階では既定ON0|false|off で明示OFF
    • 早期正規化: toString/stringify → str
    • equals/1: Known 優先 → 一意候補ユーザーBoxのみ
    • Known→関数化: obj.m(a) → Class.m(me,obj,a) に統一
  • レガシー関数化の重複を避ける開発ガード:
    • NYASH_DEV_DISABLE_LEGACY_METHOD_REWRITE=1
  • JSON出力は unified ON で v1、OFF で v0従来

開発計測(任意)

  • resolve.choose の Known 率をKPIとして出力
    • NYASH_DEBUG_KPI_KNOWN=1(有効化)
    • NYASH_DEBUG_SAMPLE_EVERY=<N>N件ごとに出力

レイヤー・ガードorigin→observe→rewrite の一方向)

  • スクリプト: tools/dev/check_builder_layers.sh

開発ショートカットOperator Boxes + JSON

  • JSON最小Roundtrip/Nested を一発): ./tools/opbox-json.sh
  • quick 全体軽量プリフライトtimeout 180s: ./tools/opbox-quick.sh
  • 詳細: docs/guides/operator-boxes.md

開発モードと既定

  • nyash --dev script.nyash で開発向け既定AST using ON / Operator Boxes 観測ON / 診断の最小ONを一括で有効化できます。nyash script.nyash は本番相当(静かで安定)。
  • ワンコマンドの dev ショートカットも引き続き利用できます(tools/opbox-json.sh / tools/opbox-quick.sh)。
  • using ガード: 同じファイルの重複 importまたは alias の再バインド)はエラーになり、行番号付きで通知されます。
    • 例: using: duplicate import of '<canon_path>' at file.nyash:12 (previous alias 'X' first seen at line 5)
    • 重複を削除/統合して解消してください。

Phase15202509アップデート

  • LLVM は Python/llvmlite ハーネスを優先(NYASH_LLVM_USE_HARNESS=1。Rust VM/JIT は保守・比較用途。
  • パーサの改行処理は TokenCursor に統一中(NYASH_PARSER_TOKEN_CURSOR=1)。
  • if/else の PHI は実際の遷移元exitを pred として使用VM/LLVM パリティ緑)。
  • 自己ホスト準備として Ny 製 JSON ライブラリと Ny Executor最小命令を既定OFFトグルで段階導入予定。
  • 推奨トグル: NYASH_LLVM_USE_HARNESS=1, NYASH_PARSER_TOKEN_CURSOR=1, NYASH_JSON_PROVIDER=ny, NYASH_SELFHOST_EXEC=1

仕様と既知制約

  • 必須不変条件Invariants: docs/reference/invariants.md
  • 制約(既知/一時/解消済み): docs/reference/constraints.md
  • PHI と SSA の設計: docs/reference/architecture/phi-and-ssa.md
    • 既定のPHI挙動: Phase15 で PHI-ONMIR14が標準になったよ。ループ・break/continue・構造化制御の合流で PHI を必ず生成するよ。
    • レガシー互換: NYASH_MIR_NO_PHI=1(必要なら NYASH_VERIFY_ALLOW_NO_PHI=1 も)で PHI-OFFエッジコピーに切り替えできるよ。
  • テスト行列(仕様→テスト対応): docs/guides/testing-matrix.md
  • 他言語との比較: docs/guides/comparison/nyash-vs-others.md

プロファイル(クイック)

  • --profile dev → マクロONstrict、PyVM 開発向けの既定を適用(必要に応じて環境で上書き可)
  • --profile lite → マクロOFF の軽量実行
    • 例: ./target/release/nyash --profile dev --backend vm apps/tests/ternary_basic.nyash

目次

🧪 Self-Hosting自己ホスト開発

  • ガイド: docs/how-to/self-hosting.md
  • 最小E2E: ./target/release/nyash --backend vm apps/selfhost-minimal/main.nyash
  • スモーク: bash tools/jit_smoke.sh / bash tools/selfhost_vm_smoke.sh
  • Makefile: make run-minimal, make smoke-selfhost

MIR注記: Core13 最小カーネルは既定で有効NYASH_MIR_CORE13=1。旧命令は正規化されますArray/Ref→BoxCall、TypeCheck/Cast/Barrier/WeakRefの統一

純化モード: NYASH_MIR_CORE13_PURE=1 を有効にすると、Optimizer が Load/Store/NewBox/Unary を Core13 形に書き換え、残存する非Core13命令があればコンパイルを失敗させます。あえて実行が壊れる可能性がありますが、MIR違反を早期に発見するための設計です。

変更履歴(要点): CHANGELOG.md

🚀 速報: ネイティブEXE達成

2025年8月29日 - 誕生からわずか20日で、Nyashがネイティブ実行ファイルへのコンパイルを実現

# NyashソースからネイティブバイナリへCraneliftが必要
cargo build --release --features cranelift-jit
./tools/build_aot.sh program.nyash -o app         # ネイティブEXE
./app                                             # スタンドアロン実行!

20日間で達成したこと

  • インタープリター付き完全プログラミング言語
  • 13.5倍高速化を実現したVM
  • JITコンパイラCranelift統合
  • WebAssemblyサポート
  • プラグインシステムC ABI
  • ネイティブバイナリ生成
  • プラグイン経由のPython統合

なぜNyashなのか

🎯 Everything is Box 哲学

// 従来の言語は複雑な型システムを持つ
// Nyash: 一つの概念がすべてを支配する - Box

static box Main {
    main() {
        // すべての値はBox - 統一、安全、シンプル
        local name = new StringBox("Nyash")
        local count = new IntegerBox(42)
        local data = new MapBox()
        
        // PythonオブジェクトもBox
        local py = new PyRuntimeBox()
        local math = py.import("math")
        print("sqrt(9) = " + math.getattr("sqrt").call(9).str())
        
        return 0
    }
}

前例のない開発速度

  • 1日目: 基本インタープリター動作
  • 4日目: すでにJIT計画開始
  • 13日目: VMが13.5倍高速化達成
  • 20日目: ネイティブ実行ファイル生成!

🔌 プラグインファースト・アーキテクチャ

// あらゆる機能がプラグインBoxになれる
local file = new FileBox()          // ファイルI/Oプラグイン
local http = new HttpClientBox()    // ネットワークプラグイン
local py = new PyRuntimeBox()       // Pythonプラグイン

// プラグインもネイティブコードにコンパイル!

🏗️ 複数の実行モード

重要: 現在、JIT ランタイム実行は封印中です。実行は「Rust VMMIR/ PyVM開発補助」、配布は「LLVM AOTハーネス」が主軸です。ASTインタープリタはレガシー扱いでデフォルト無効interpreter-legacy feature

Phase15自己ホスト期: ASTインタープリタは任意featureで明示ON

  • 既定ビルド: --backend vm は PyVM 経路python3 + tools/pyvm_runner.py が必要Rust VMMIR
  • レガシー AST インタープリタを有効化するには(通常は不要):
    cargo build --release --features interpreter-legacy
    

1. インタープリターモード (開発用)

./target/release/nyash program.nyash
  • 即座に実行
  • 完全なデバッグ情報
  • 開発に最適

2. VMモード既定は PyVMレガシーは任意

# 既定: PyVM ハーネスpython3 必要)
./target/release/nyash --backend vm program.nyash

# レガシー Rust VM を使う場合
cargo build --release --features vm-legacy
./target/release/nyash --backend vm program.nyash
  • 既定vm-legacy OFF: MIR(JSON) を出力して tools/pyvm_runner.py で実行
  • レガシー VM: インタープリター比で 13.5x(歴史的実測)。比較・検証用途で維持
  • 補足: --benchmark はレガシー VMvm-legacy)が必要です。実行前に cargo build --release --features vm-legacy を行ってください。

3. ネイティブバイナリCranelift AOT (配布用)

# 事前ビルドCranelift
cargo build --release --features cranelift-jit

./tools/build_aot.sh program.nyash -o myapp
./myapp  # スタンドアロン実行!
  • 依存関係ゼロ
  • 最高性能
  • 簡単配布

4. ネイティブバイナリLLVM AOT, llvmliteハーネス

# ハーネスCLI をビルドLLVM_SYS_180_PREFIX不要
cargo build --release -p nyash-llvm-compiler && cargo build --release --features llvm

# ハーネス経由で EXE を生成して実行
NYASH_LLVM_USE_HARNESS=1 \
NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc \
NYASH_EMIT_EXE_NYRT=target/release \
  ./target/release/nyash --backend llvm --emit-exe myapp program.nyash
./myapp

# あるいは .o を出力して手動リンク
NYASH_LLVM_USE_HARNESS=1 \
NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc \
  ./target/release/nyash --backend llvm program.nyash \
  -D NYASH_LLVM_OBJ_OUT=$PWD/nyash_llvm_temp.o
cc nyash_llvm_temp.o -L crates/nyrt/target/release -Wl,--whole-archive -lnyrt -Wl,--no-whole-archive -lpthread -ldl -lm -o myapp
./myapp

簡易スモークテストVM と EXE の出力一致確認):

tools/smoke_aot_vs_vm.sh examples/aot_min_string_len.nyash

LLVM バックエンドの補足

  • Python llvmlite を使用します。Python3 + llvmlite の用意と ny-llvmc のビルド(cargo build -p nyash-llvm-compiler)が必要です。LLVM_SYS_180_PREFIX は不要です。
  • NYASH_LLVM_OBJ_OUT: --backend llvm 実行時に .o を出力するパス。
    • 例: NYASH_LLVM_OBJ_OUT=$PWD/nyash_llvm_temp.o ./target/release/nyash --backend llvm apps/ny-llvm-smoke/main.nyash
  • 削除された NYASH_LLVM_ALLOW_BY_NAME=1: すべてのプラグイン呼び出しがmethod_idベースに統一。
    • LLVMバックエンドは性能と型安全性のため、method_idベースのプラグイン呼び出しのみ対応。

5. WebAssembly (ブラウザ用)

cargo build --release --features wasm-backend
./target/release/nyash --compile-wasm program.nyash
  • ブラウザで実行
  • デフォルトでクロスプラットフォーム
  • Webファースト開発

🧰 タスク実行 (nyash.toml)

nyash.toml[tasks][env] で、ビルド/スモークなどのタスクを簡単に実行できますMVP

nyash.toml の末尾に追記):

[env]
RUST_BACKTRACE = "1"

[tasks]
# llvmlite ハーネスCLI をビルドLLVM_SYS_180_PREFIX不要
build_llvm = "cargo build --release -p nyash-llvm-compiler && cargo build --release --features llvm"
smoke_obj_array = "NYASH_LLVM_USE_HARNESS=1 NYASH_NY_LLVM_COMPILER={root}/target/release/ny-llvmc NYASH_LLVM_OBJ_OUT={root}/nyash_llvm_temp.o ./target/release/nyash --backend llvm apps/ny-llvm-smoke/main.nyash"

実行:

./target/release/nyash --run-task build_llvm
./target/release/nyash --run-task smoke_obj_array

補足:

  • [env] の値は実行前に環境へ適用されます。
  • {root} は現在のプロジェクトルートに展開されます。
  • 現状は最小機能OS別/依存/並列は未対応)。

ちいさなENVまとめVM vs LLVM ハーネス)

  • VM 実行: 追加ENVなしでOK。
    • 例: ./target/release/nyash --backend vm apps/tests/ternary_basic.nyash
  • LLVM ハーネス実行: 下記3つだけ設定してね。
    • NYASH_LLVM_USE_HARNESS=1
    • NYASH_NY_LLVM_COMPILER=$NYASH_ROOT/target/release/ny-llvmc
    • NYASH_EMIT_EXE_NYRT=$NYASH_ROOT/target/release
    • 例: NYASH_LLVM_USE_HARNESS=1 NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc NYASH_EMIT_EXE_NYRT=target/release ./target/release/nyash --backend llvm apps/ny-llvm-smoke/main.nyash

DebugHub かんたんガイド

  • 有効化: NYASH_DEBUG_ENABLE=1
  • 種別指定: NYASH_DEBUG_KINDS=resolve,ssa
  • 出力先: NYASH_DEBUG_SINK=/tmp/nyash_debug.jsonl
  • 例: NYASH_DEBUG_ENABLE=1 NYASH_DEBUG_KINDS=resolve,ssa NYASH_DEBUG_SINK=/tmp/nyash.jsonl tools/smokes/v2/run.sh --profile quick --filter "userbox_*"

開発用セーフティVM

  • stringify(Void) は "null" を返すJSONフレンドリ開発セーフティ。既定挙動は不変
  • JsonScanner のデフォルト値(NYASH_VM_SCANNER_DEFAULTS=1 時のみ): is_eof/current/advance 内に限定し、数値/テキストの不足を安全に埋める。
  • VoidBox に対する length/size/get/push 等は、ガード下で中立なノーオペとして扱い、開発中のハードストップを回避。

🧰 一発ビルドMVP: nyash --build

nyash.toml を読み、プラグイン → コア → AOT → リンクまでを一発実行する最小ビルド機能です。

基本Cranelift AOT

./target/release/nyash --build nyash.toml \
  --app apps/egui-hello-plugin/main.nyash \
  --out app_egui

主なオプション(最小)

  • --build <path>: nyash.toml の場所
  • --app <file>: エントリ .nyash
  • --out <name>: 出力EXE名既定: app/app.exe
  • --build-aot cranelift|llvm(既定: cranelift
  • --profile release|debug(既定: release
  • --target <triple>(必要時のみ)

注意

  • LLVM AOT は Python の llvmlite ハーネスを使用します。Python3 + llvmlite と ny-llvmc のビルド(cargo build -p nyash-llvm-compiler)が必要です。LLVM_SYS_180_PREFIX は不要です。
  • GUIを含む場合、AOTのオブジェクト出力時にウィンドウが一度開きます閉じて続行
  • WSL で表示されない場合は docs/guides/cranelift_aot_egui_hello.md のWSL TipsWayland→X11切替を参照。

📊 パフォーマンスベンチマーク

実世界ベンチマーク結果 (ny_bench.nyash)

モード           | 時間      | 相対速度
----------------|-----------|---------------
インタープリター | 110.10ms  | 1.0x (基準)
VM              | 8.14ms    | 13.5倍高速
Cranelift AOT   | ~46ms    | ~2027倍高速
ネイティブ(LLVM)| ~4ms      | ~27倍高速

🎮 言語機能

クリーンな構文

box GameCharacter {
    private { name, health, skills }
    
    // birthコンストラクタ - Boxに生命を与える
    birth(characterName) {
        me.name = characterName
        me.health = 100
        me.skills = new ArrayBox()
        print("🌟 " + characterName + " が誕生しました!")
    }
    
    learnSkill(skill) {
        me.skills.push(skill)
        return me  // メソッドチェーン
    }
}

// 使用例
local hero = new GameCharacter("ネコ")
hero.learnSkill("火魔法").learnSkill("回復")

モダンなAsync/Await

// シンプルな並行処理
nowait task1 = fetchDataFromAPI()
nowait task2 = processLocalFiles()

// 待機中に他の作業
updateUI()

// 結果収集
local apiData = await task1
local files = await task2

デリゲーションパターン

// 継承よりコンポジション
box EnhancedArray from ArrayBox {
    private { logger }
    
    override push(item) {
        me.logger.log("追加中: " + item)
        from ArrayBox.push(item)  // 親に委譲
    }
}

🔌 プラグインシステム

Nyashは「Everything is Plugin」アーキテクチャを開拓

# nyash.toml - プラグイン設定
[libraries."libnyash_python_plugin.so"]
boxes = ["PyRuntimeBox", "PyObjectBox"]

[libraries."libnyash_net_plugin.so"]  
boxes = ["HttpServerBox", "HttpClientBox", "WebSocketBox"]

C/Rustで独自のBox型を作成してシームレスに統合


🛠️ はじめる

クイックインストール (Linux/Mac/WSL)

# クローンとビルド
git clone https://github.com/moe-charm/nyash.git
cd nyash
cargo build --release --features cranelift-jit

# 最初のプログラムを実行
echo 'print("Hello Nyash!")' > hello.nyash
./target/release/nyash hello.nyash

Windows

# Windows向けクロスコンパイル
cargo install cargo-xwin
cargo xwin build --target x86_64-pc-windows-msvc --release
# target/x86_64-pc-windows-msvc/release/nyash.exe を使用

# WindowsでのネイティブEXEAOTビルドCranelift と MSYS2/WSL が必要)
cargo build --release --features cranelift-jit
powershell -ExecutionPolicy Bypass -File tools\build_aot.ps1 -Input examples\aot_min_string_len.nyash -Out app.exe
./app.exe

🌟 独自のイノベーション

1. AI駆動開発

  • Claude、ChatGPT、Codexの協力で開発
  • コンセプトからネイティブコンパイルまで20日間の旅
  • AIが言語開発を30倍加速できることを証明

2. Box-Firstアーキテクチャ

  • すべての最適化がBox抽象を保持
  • プラグインもBox、JITもBoxを保持、ネイティブコードもBoxを尊重
  • すべての実行モードで前例のない一貫性

3. 観測可能な設計

  • 組み込みのデバッグとプロファイリング
  • JITコンパイルのJSONイベントストリーム
  • 最適化のDOTグラフ可視化

📚

Python統合

// NyashからPythonライブラリを使用
local py = new PyRuntimeBox()
local np = py.import("numpy")
local array = np.getattr("array").call([1, 2, 3])
print("NumPy配列: " + array.str())

Webサーバー

local server = new HttpServerBox()
server.start(8080)

loop(true) {
    local request = server.accept()
    local response = new HttpResponseBox()
    response.setStatus(200)
    response.write("Nyashからこんにちは")
    request.respond(response)
}

ゲーム開発

box GameObject {
    public { x, y, sprite }
    
    update(deltaTime) {
        // 物理シミュレーション
        me.y = me.y + gravity * deltaTime
    }
    
    render(canvas) {
        canvas.drawImage(me.sprite, me.x, me.y)
    }
}

🤝 貢献

革命に参加しよう!以下を歓迎します:

  • 🐛 バグ報告と修正
  • プラグイン経由の新しいBox型
  • 📚 ドキュメントの改善
  • 🎮 クールなサンプルプログラム

詳細は AGENTS.mdRepository Guidelinesをご参照ください。プロジェクト構成、ビルド/テスト手順、PRの要件を簡潔にまとめています。

📄 ライセンス

MIT ライセンス - プロジェクトで自由に使用してください!


👨‍💻 作者

charmpic - 趣味で言語作ってる人

  • 🐱 GitHub: @moe-charm
  • 🌟 協力: Claude、ChatGPT、Codexとのコラボレーション

🎉 歴史的タイムライン

  • 2025年8月9日: 最初のコミット - "Hello Nyash!"
  • 2025年8月13日: JIT計画開始4日目
  • 2025年8月20日: VMが13.5倍性能達成
  • 2025年8月29日: ネイティブEXEコンパイル実現

ゼロからネイティブバイナリまで20日間 - 言語開発の新記録!


🚀 Nyash - すべてがBoxであり、Boxがネイティブコードにコンパイルされる場所

❤️🤖 AIコラボレーション、そしてプログラミング言語は思考の速度で作れるという信念で構築