Skip to content

Commit 62c68fb

Browse files
committed
docs: update README and related documentation for new features and improvements
- Added a link to the development notes in the README. - Updated the status of LLVM IR generation for various blocks in the README and architecture documentation. - Enhanced the description of supported opcodes and their implementation status in the blocks documentation. - Revised the CLI documentation to reflect changes in supported commands and their expected behavior. - Created a new development notes document to guide contributors on setup, editing, and documentation updates. - Clarified the current limitations and expected future implementations in the architecture and development documentation.
1 parent aa3c69b commit 62c68fb

8 files changed

Lines changed: 175 additions & 75 deletions

File tree

README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,14 @@
4848
| `project.json` を取り出して表示する | `json` ||
4949
| ブロック数・使用 opcode を確認する | `stats` ||
5050
| hat block からスレッドを抽出する | `run` ||
51-
| 動き系命令、見た目の大きさ変更系命令、変数代入、それらの入力式に使われる演算子や変数参照を LLVM IR へ変換し、JIT で実行する | `run` | 🚧 一部 |
51+
| 動き系命令の一部、見た目の say/think と大きさ変更、変数代入と加算、制御の repeat/forever/if/ifelse/wait until、それらの入力式に使われる演算子や変数参照を LLVM IR へ変換し、JIT で実行する | `run` | 🚧 一部 |
5252
| 生成した LLVM IR を `.ll` ファイルへ保存する | `compile` ||
5353
| JSON パースエラー時の位置情報・コンテキスト表示 |||
5454
| 完全な Scratch 互換実行 |||
5555

5656
## まだ開発途中のこと
5757

58-
- Scratch opcode の網羅的な IR 実装(現状はスレッド本体が動き系、見た目の大きさ変更系、変数代入、タイマーリセットのみ。動き系は `motion_movesteps` を含めて実装済み。式はリテラル、演算子、変数参照、見た目の大きさレポーター、タイマーレポーターのみ)
58+
- Scratch opcode の網羅的な IR 実装(現状はスレッド本体が動き系の一部、見た目の say/think と大きさ変更、変数代入と加算、制御の repeat/forever/if/ifelse/wait until、タイマーリセットのみ。動き系は `motion_movesteps` を含めて実装済み。式はリテラル、演算子、変数参照、見た目の大きさレポーター、タイマーレポーターのみ)
5959
- Scratch VM 相当のイベントランタイムの完成
6060
- 生成した IR から実行可能ファイルへつなぐフロー
6161
- 互換性検証とリグレッションテストの拡充
@@ -142,7 +142,7 @@ cargo run -- json my_project.sb3 | jq '[.targets[].blocks[].opcode] | unique | s
142142
cargo run -- run <path-to-project.sb3>
143143
```
144144

145-
`run` は現状もっとも実験的なコマンドです。文ブロックは動き系、見た目の大きさ変更系、変数代入、タイマーリセット、入力式はリテラル・演算子・変数参照・大きさレポーター・タイマーレポーターのみを含むシンプルなプロジェクトから試すことを推奨します。動き系では `motion_movesteps` も実装済みです。成功時は各スレッドの状態が実行中に定期的に標準出力へ表示されます。
145+
`run` は現状もっとも実験的なコマンドです。文ブロックは動き系の一部、見た目の say/think と大きさ変更、変数代入と加算、制御の repeat/forever/if/ifelse/wait until、タイマーリセット、入力式はリテラル・演算子・変数参照・大きさレポーター・タイマーレポーターのみを含むシンプルなプロジェクトから試すことを推奨します。動き系では `motion_movesteps` も実装済みです。成功時は各スレッドの状態が実行中に定期的に標準出力へ表示されます。
146146

147147
```text
148148
SpriteStruct { sprite_x: 100.0, sprite_y: 0.0, sprite_rotate: 90.0, sprite_size: 100.0, ... }
@@ -164,7 +164,7 @@ cargo run -- compile <path-to-project.sb3>
164164

165165
## 入力ファイルについて
166166

167-
このリポジトリには現在、配布用の `.sb3` サンプルは含まれていません。Scratch エディタでプロジェクトを作成し、**「ファイル」→「コンピューターに保存する」**`.sb3` を書き出して入力に使ってください
167+
このリポジトリには動作確認用の `examples/script.sb3` が含まれています。まずはこのファイルで `stats``json` を試せます。追加の入力を用意したい場合は、Scratch エディタでプロジェクトを作成し、**「ファイル」→「コンピューターに保存する」**`.sb3` を書き出してください
168168

169169
`run` で最後まで通したい場合は、文ブロックを動き系(「〇歩動かす」「x座標を〇にする」など)、見た目の大きさ変更系(「大きさを〇ずつ変える」「大きさを〇%にする」)、変数代入、タイマーリセットに絞り、その入力式にリテラル・演算子・変数参照・大きさレポーター・タイマーレポーターだけを使ったシンプルなプロジェクトから始めると確認しやすいです。
170170

@@ -179,7 +179,7 @@ xyo-rust/
179179
│ ├── types/ Scratch JSON 構造を受ける型定義
180180
│ ├── parser/ Scratch ブロック列を Stmt / Expr に変換
181181
│ └── compiler/ LLVM IR 生成
182-
├── tests/ CLI テスト
182+
├── examples/ 動作確認用の .sb3 サンプル
183183
├── bitcodes/ C ソースと生成済み bitcode / IR
184184
├── docs/ Markdown ソースと Taiga サイト生成ファイル
185185
├── build.rs ビルドスクリプト (C → bitcode)
@@ -228,6 +228,7 @@ CLANGXX=clang++-23 \
228228
| [CLI](./docs/markdown/cli.md) | サブコマンドの詳細・出力例・エラーの読み方 |
229229
| [対応ブロック一覧](./docs/markdown/blocks.md) | opcode ごとのパーサー / IR 対応状況 |
230230
| [アーキテクチャ](./docs/markdown/architecture.md) | パイプラインの詳細・モジュール設計 |
231+
| [開発メモ](./docs/markdown/development.md) | 開発時の確認手順・生成物・ドキュメント更新方針 |
231232

232233
## Star History
233234

docs/markdown/README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Scratch の `.sb3` プロジェクトを読み込み、解析し、LLVM IR を
1717
- [CLI](./cli.md)
1818
- [対応ブロック一覧](./blocks.md)
1919
- [アーキテクチャ](./architecture.md)
20+
- [開発メモ](./development.md)
2021

2122
## Scratch と `.sb3` について
2223

@@ -67,7 +68,7 @@ Scratch プロジェクトは `.sb3` という拡張子で保存されます。`
6768
| 2 | `project.json` を Scratch プロジェクト構造へ変換する | ✅ 完成 |
6869
| 3 | hat block からスレッドを解析する | ✅ 完成 |
6970
| 4 | `Stmt` / `Expr` に変換する(パーサー) | ✅ ほぼ完成(87 opcode) |
70-
| 5 | 一部の式 / 文を LLVM IR へ変換し、JIT で実行する | 🚧 一部実装(文は動き系、見た目の大きさ変更系、変数代入、タイマーリセット。動き系は `motion_movesteps` を含めて実装済み。式はリテラル + 演算子 + 変数参照 + 見た目の大きさレポーター + タイマーレポーター) |
71+
| 5 | 一部の式 / 文を LLVM IR へ変換し、JIT で実行する | 🚧 一部実装(文は動き系の一部、見た目の say/think と大きさ変更、変数代入と加算、制御の repeat/forever/if/ifelse/wait until、タイマーリセット。動き系は `motion_movesteps` を含めて実装済み。式はリテラル + 演算子 + 変数参照 + 見た目の大きさレポーター + タイマーレポーター) |
7172
| 6 | 生成した IR から実行可能ファイルを作る | ❌ 未実装 |
7273

7374
```warn
@@ -115,18 +116,18 @@ IR 生成(src/compiler/)
115116
| コマンドの使い方を知りたい | [CLI](./cli.md) |
116117
| 対応済み opcode を確認したい | [対応ブロック一覧](./blocks.md) |
117118
| 内部構造を把握したい | [アーキテクチャ](./architecture.md) |
118-
| コントリビュートしたい | [アーキテクチャ](./architecture.md)[対応ブロック一覧](./blocks.md) |
119+
| コントリビュートしたい | [開発メモ](./development.md)[アーキテクチャ](./architecture.md)[対応ブロック一覧](./blocks.md) |
119120

120121
## 現時点での注意点
121122

122123
- Scratch VM との完全互換は未実装です
123124
- LLVM 21.1.x 系を前提にしています(他のバージョンではビルドが失敗します)
124-
- 配布用の `.sb3` サンプルは同梱されていません。Scratch エディタからエクスポートしてください
125-
- `run` サブコマンドは実験的で、スレッド本体は動き系文ブロック、見た目の大きさ変更系、変数代入、タイマーリセットのみ、入力式はリテラル、演算子、変数参照、見た目の大きさレポーター、タイマーレポーターのみ対応しています。動き系では `motion_movesteps` も実装済みです
125+
- 動作確認用の `.sb3` サンプルとして `examples/script.sb3` を同梱しています。追加の検証には Scratch エディタからエクスポートした `.sb3` を使ってください
126+
- `run` サブコマンドは実験的で、スレッド本体は動き系の一部、見た目の say/think と大きさ変更、変数代入と加算、制御の repeat/forever/if/ifelse/wait until、タイマーリセットのみ、入力式はリテラル、演算子、変数参照、見た目の大きさレポーター、タイマーレポーターのみ対応しています。動き系では `motion_movesteps` も実装済みです
126127

127128
## 関連リンク
128129

129-
- [リポジトリの README](../README.md)
130+
- [リポジトリの README](../../README.md)
130131
- [GitHub](https://github.com/pnsk-lab/xyo-rust)
131132
- [Scratch 公式サイト](https://scratch.mit.edu/)
132133
- [LLVM 公式サイト](https://llvm.org/)

docs/markdown/architecture.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,8 @@ for stmt in &thread.stmts {
439439
Stmt::Motion(v) => parse_motion_stmt(builders, v, &function, thread.target_idx),
440440
Stmt::Looks(v) => parse_looks_stmt(builders, v, &function, thread.target_idx),
441441
Stmt::DataStmt(v) => parse_data_stmt(builders, v, &function, thread.target_idx),
442+
Stmt::Control(v) => parse_control_stmt(builders, v, &function, thread.target_idx),
443+
Stmt::Sensing(v) => parse_sensing_stmt(builders, v, &function, thread.target_idx),
442444
_ => todo!("やります"), // 未実装
443445
}
444446
}
@@ -448,7 +450,7 @@ builder.build_return(None); // void return
448450

449451
### 実行状態
450452

451-
各スレッドは `SpriteStruct` の状態ポインタを受け取り、`MotionSetX``LooksSetSizeTo` などは `build_struct_gep` を使ってそのフィールドを更新します。大きさ変更系の Looks ブロックは、現在コスチュームの幅・高さから Scratch と同じ最小・最大スケールを計算し、`fmin` / `fmax` で丸めた値を `sprite_size` に保存します。`DataSetVariableTo` は対象変数 ID を解決し、入力値を `DynamicStruct` へ変換してグローバル変数スロットへ保存します。JIT 実行時にも同じ `SpriteStruct``Debug` 形式で表示されます。
453+
各スレッドは `SpriteStruct` の状態ポインタを受け取り、`MotionSetX``LooksSetSizeTo` などは `build_struct_gep` を使ってそのフィールドを更新します。大きさ変更系の Looks ブロックは、現在コスチュームの幅・高さから Scratch と同じ最小・最大スケールを計算し、`fmin` / `fmax` で丸めた値を `sprite_size` に保存します。`LooksSay` / `LooksThink``print` ヘルパーに文字列を渡し、`DataSetVariableTo` `DataChangeVariableBy` は対象変数 ID を解決してグローバル変数スロットへ反映します。`ControlRepeat` / `ControlForever` / `ControlIf` / `ControlIfElse` / `ControlWaitUntil` は、サブスタックを別関数として呼び出すか、`wait_tick` を挟むループに変換されます。JIT 実行時にも同じ `SpriteStruct``Debug` 形式で表示されます。
452454

453455
### 式の IR 変換
454456

@@ -507,17 +509,19 @@ IR 生成後、`default<O3>` パスが適用されます。有効化されてい
507509

508510
### 現在の制約
509511

510-
- **IR 生成**: スレッド本体は動き系命令、見た目の大きさ変更系、変数代入、タイマーリセットのみ。式はリテラル、演算子、変数参照、見た目の大きさレポーター、タイマーレポーターが中心。`run` で残りの文 opcode や未実装式に当たると `todo!()` パニックが起きる
512+
- **IR 生成**: スレッド本体は動き系の一部、見た目の say/think と大きさ変更、変数代入と加算、制御の repeat/forever/if/ifelse/wait until、タイマーリセットのみ。式はリテラル、演算子、変数参照、見た目の大きさレポーター、タイマーレポーターが中心。`run` で残りの文 opcode や未実装式に当たると `todo!()` パニックが起きる
511513
- **ランタイム**: Scratch のイベントループや broadcast / clone を含む完全な VM は未実装。いまの `run` は JIT で各 thread を実行し、状態を標準出力へ定期的に返す
512514
- **コスチューム・サウンド**: コスチューム寸法は大きさの丸めに使うが、コスチューム切り替えやサウンド再生の IR 生成は未対応
513515
- **スレッド間通信**: ブロードキャスト・メッセージ処理は未実装
514516

515517
### 今後の実装が期待される部分
516518

517-
- `ControlStmt` (if/else, repeat, forever など) の IR 生成
518-
- `DataStmt` (変数加算、モニター表示、リスト操作) の IR 生成
519-
- `LooksStmt` (大きさ以外の見た目変更) の IR 生成(実際のレンダリングは別ライブラリが必要)
519+
- `ControlStmt` の残り分岐(wait, repeat until, while, clone, stop, counter など)の IR 生成
520+
- `DataExpr` / `DataStmt` のリスト系 IR 生成
521+
- `LooksStmt` の残り分岐(say/think 以外の見た目変更)の IR 生成(実際のレンダリングは別ライブラリが必要)
520522
- `run` の未実装分岐に対する安全なフォールバック(パニックを避けてエラー報告する)
521523
- 生成した IR を `clang``llc` でリンク・コンパイルするフロー
522524

523525
前のページ: [CLI](./cli.md)
526+
527+
次のページ: [開発メモ](./development.md)

0 commit comments

Comments
 (0)