feat(plugin): Fix plugin BoxRef return and Box argument support
- Fixed deadlock in FileBox plugin copyFrom implementation (single lock) - Added TLV Handle (tag=8) parsing in calls.rs for returned BoxRefs - Improved plugin loader with config path consistency and detailed logging - Fixed loader routing for proper Handle type_id/fini_method_id resolution - Added detailed logging for TLV encoding/decoding in plugin_loader_v2 Test docs/examples/plugin_boxref_return.nyash now works correctly: - cloneSelf() returns FileBox Handle properly - copyFrom(Box) accepts plugin Box arguments - Both FileBox instances close and fini correctly 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -1,97 +1,42 @@
|
||||
# 📚 Nyash Documentation
|
||||
# Nyash Archive 🗄️
|
||||
|
||||
**NyashプログラミングLexicalAnalyzer言語の公式ドキュメント** | 最終更新: 2025-08-12
|
||||
過去のドキュメント、設計決定、相談記録のアーカイブです。
|
||||
|
||||
---
|
||||
## 📂 ディレクトリ構造
|
||||
|
||||
## 🚀 すぐ始める
|
||||
### consultations/
|
||||
AI相談記録の保管場所
|
||||
- **gemini/** - Gemini AIとの相談記録
|
||||
- **chatgpt/** - ChatGPTとの相談記録
|
||||
- **codex/** - Codexの解析結果
|
||||
|
||||
### 👶 **初心者向け**
|
||||
- **[Getting Started](GETTING_STARTED.md)** - 環境構築から最初のプログラムまで
|
||||
### decisions/
|
||||
過去の設計決定とその理由
|
||||
- アーキテクチャ決定記録(ADR)
|
||||
- 廃止された機能の説明
|
||||
- 設計変更の経緯
|
||||
|
||||
### 📖 **言語を学ぶ**
|
||||
- **[Language Guide](LANGUAGE_GUIDE.md)** - 言語仕様・構文・完全ガイド
|
||||
### build-logs/
|
||||
ビルドログとベンチマーク結果
|
||||
- パフォーマンス測定記録
|
||||
- ビルドエラーの履歴
|
||||
- 最適化の記録
|
||||
|
||||
### 🌐 **P2P通信**
|
||||
- **[P2P Guide](P2P_GUIDE.md)** - P2P通信システム完全ガイド
|
||||
### old-versions/
|
||||
古いバージョンのドキュメント
|
||||
- 廃止された仕様
|
||||
- 以前のガイドやチュートリアル
|
||||
- 旧バージョンのREADME
|
||||
|
||||
---
|
||||
### generated/
|
||||
自動生成されたドキュメント
|
||||
- MIRダンプ
|
||||
- ベンチマーク結果
|
||||
- コード解析レポート
|
||||
|
||||
## 📋 詳細リファレンス
|
||||
|
||||
### **[reference/](reference/)**
|
||||
- **[language-reference.md](reference/language-reference.md)** - 言語仕様完全リファレンス
|
||||
- **[override-delegation-syntax.md](reference/override-delegation-syntax.md)** - デリゲーション・override構文仕様
|
||||
- **[design-philosophy.md](reference/design-philosophy.md)** - 明示的デリゲーション革命の設計思想
|
||||
- **[builtin-boxes.md](reference/builtin-boxes.md)** - ビルトインBox型詳細リファレンス
|
||||
|
||||
---
|
||||
|
||||
## 🗄️ 過去資料・開発履歴
|
||||
|
||||
### **[archive/](archive/)**
|
||||
- **[development/](archive/development/)** - 過去のドキュメント・開発履歴
|
||||
- **[p2p/](archive/p2p/)** - P2P詳細設計書・AI相談記録
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Nyashとは
|
||||
|
||||
**「Everything is Box」哲学**に基づく革新的プログラミング言語
|
||||
|
||||
```nyash
|
||||
// シンプルで強力な構文
|
||||
local greeting = "Hello, Nyash!"
|
||||
print(greeting)
|
||||
|
||||
// すべてがBox - 統一された美しい世界
|
||||
local numbers = new ArrayBox()
|
||||
numbers.push(42)
|
||||
numbers.push(3.14)
|
||||
|
||||
// P2P通信もBox!
|
||||
local node = new P2PBox("alice", transport: "inprocess")
|
||||
node.send("bob", new IntentBox("chat", { text: "Hello P2P!" }))
|
||||
```
|
||||
|
||||
### ✨ **主な特徴**
|
||||
- **🔧 Production Ready**: Phase 1完了、実用レベルの言語機能
|
||||
- **🌐 P2P Native**: P2P通信がビルトイン (Phase 2実装中)
|
||||
- **🛡️ Memory Safe**: Rust実装による完全メモリ安全性
|
||||
- **📦 Everything is Box**: 統一されたオブジェクトモデル
|
||||
- **⚡ Simple & Powerful**: 学習コストが低く、表現力が高い
|
||||
|
||||
### 📊 **実装状況 (2025-08-12)**
|
||||
|
||||
#### ✅ **Phase 1完了**
|
||||
- FloatBox, ArrayBox改良, Cross-type演算子
|
||||
- 包括的テストスイート (188行)
|
||||
- デリゲーション革命 (`from`構文完成)
|
||||
|
||||
#### 🚧 **Phase 2実装中**
|
||||
- IntentBox (構造化メッセージ)
|
||||
- P2PBox (P2P通信ノード)
|
||||
- MessageBus (プロセス内シングルトン)
|
||||
|
||||
#### 🎯 **最終目標**
|
||||
**NyaMeshP2Pライブラリ実現** - Nyash言語による本格的P2P通信ライブラリ
|
||||
|
||||
---
|
||||
|
||||
## 🤝 コミュニティ
|
||||
|
||||
### 開発方針
|
||||
- **ドキュメントファースト**: ソースより先にドキュメント確認
|
||||
- **AI協働開発**: Gemini先生・ChatGPT先生・Copilot連携
|
||||
- **段階的実装**: Phase 1→2→3の確実な進歩
|
||||
|
||||
### 貢献方法
|
||||
1. **Issue報告**: バグ・要望をGitHub Issuesで報告
|
||||
2. **ドキュメント改善**: typo修正・内容追加のPull Request歓迎
|
||||
3. **コード貢献**: 新機能実装・バグ修正のPull Request歓迎
|
||||
|
||||
---
|
||||
|
||||
**🎉 Welcome to the world of "Everything is Box"!**
|
||||
|
||||
*Nyashで新しいプログラミングの世界を体験しよう!*
|
||||
## ⚠️ 注意事項
|
||||
このディレクトリの内容は歴史的参照用です。
|
||||
最新情報は以下を参照してください:
|
||||
- 現在の仕様: `/reference/`
|
||||
- 利用ガイド: `/guides/`
|
||||
- 開発状況: `/development/`
|
||||
|
||||
@ -1,41 +0,0 @@
|
||||
P2PBox ビルドエラー詳細 (2025-08-11)
|
||||
=====================================
|
||||
|
||||
エラー概要:
|
||||
- ライブラリのビルド: ✅ 成功
|
||||
- テストの実行: ✅ 成功
|
||||
- nyashバイナリのビルド: ❌ モジュールインポートエラー
|
||||
|
||||
エラー詳細:
|
||||
|
||||
error[E0432]: unresolved imports `crate::Transport`, `crate::TransportKind`, `crate::create_transport`
|
||||
--> src/boxes/p2p_box.rs:16:13
|
||||
|
|
||||
16 | use crate::{Transport, TransportKind, create_transport};
|
||||
| ^^^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ no `create_transport` in the root
|
||||
| | |
|
||||
| | no `TransportKind` in the root
|
||||
| no `Transport` in the root
|
||||
|
||||
error[E0432]: unresolved imports `crate::get_global_message_bus`, `crate::BusMessage`, `crate::MessageBus`
|
||||
--> src/boxes/p2p_box.rs:17:13
|
||||
|
|
||||
17 | use crate::{get_global_message_bus, BusMessage, MessageBus};
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^ no `MessageBus` in the root
|
||||
|
||||
error[E0432]: unresolved import `crate::TransportKind`
|
||||
--> src/interpreter/objects.rs:13:5
|
||||
|
|
||||
13 | use crate::TransportKind;
|
||||
| ^^^^^^^^^^^^^^^^^^^^ no `TransportKind` in the root
|
||||
|
||||
解決案:
|
||||
1. src/boxes/p2p_box.rs でインポートパスを修正:
|
||||
use crate::transport_trait::{Transport, TransportKind, create_transport};
|
||||
use crate::message_bus::{get_global_message_bus, BusMessage, MessageBus};
|
||||
|
||||
2. src/interpreter/objects.rs でインポートパスを修正:
|
||||
use crate::transport_trait::TransportKind;
|
||||
|
||||
これは単純なモジュールパスの問題で、機能的な問題ではありません。
|
||||
P2PBoxの実装自体は完全に動作しています。
|
||||
@ -1,328 +0,0 @@
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/simple_notepad.rs` found to be present in multiple build targets:
|
||||
* `bin` target `simple_notepad`
|
||||
* `example` target `simple_notepad`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/nyash_explorer_with_icons.rs` found to be present in multiple build targets:
|
||||
* `bin` target `nyash_explorer_icons`
|
||||
* `example` target `nyash_explorer_with_icons`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/nyash_notepad_jp.rs` found to be present in multiple build targets:
|
||||
* `bin` target `nyash_notepad_jp`
|
||||
* `example` target `nyash_notepad_jp`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/simple_notepad_v2.rs` found to be present in multiple build targets:
|
||||
* `bin` target `nyash_notepad`
|
||||
* `example` target `simple_notepad_v2`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/simple_notepad_ascii.rs` found to be present in multiple build targets:
|
||||
* `bin` target `nyash_notepad_ascii`
|
||||
* `example` target `simple_notepad_ascii`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/test_icon_extraction.rs` found to be present in multiple build targets:
|
||||
* `bin` target `test_icon_extraction`
|
||||
* `example` target `test_icon_extraction`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/nyash_explorer.rs` found to be present in multiple build targets:
|
||||
* `bin` target `nyash_explorer`
|
||||
* `example` target `nyash_explorer`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/debug_notepad.rs` found to be present in multiple build targets:
|
||||
* `bin` target `debug_notepad`
|
||||
* `example` target `debug_notepad`
|
||||
Checking nyash-rust v0.1.0 (/mnt/c/git/nyash-project/nyash)
|
||||
warning: unused import: `Display`
|
||||
--> src/boxes/buffer/mod.rs:35:23
|
||||
|
|
||||
35 | use std::fmt::{Debug, Display};
|
||||
| ^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unused_imports)]` on by default
|
||||
|
||||
warning: unused import: `std::future::Future`
|
||||
--> src/boxes/future/mod.rs:7:5
|
||||
|
|
||||
7 | use std::future::Future;
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `std::pin::Pin`
|
||||
--> src/boxes/future/mod.rs:8:5
|
||||
|
|
||||
8 | use std::pin::Pin;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `crate::boxes::map_box::MapBox`
|
||||
--> src/boxes/http/mod.rs:9:5
|
||||
|
|
||||
9 | use crate::boxes::map_box::MapBox;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused imports: `Arc` and `Mutex`
|
||||
--> src/boxes/http/mod.rs:11:17
|
||||
|
|
||||
11 | use std::sync::{Arc, Mutex};
|
||||
| ^^^ ^^^^^
|
||||
|
||||
warning: unused import: `Mutex`
|
||||
--> src/boxes/regex/mod.rs:9:22
|
||||
|
|
||||
9 | use std::sync::{Arc, Mutex};
|
||||
| ^^^^^
|
||||
|
||||
warning: unused macro definition: `debug_fuel`
|
||||
--> src/parser/expressions.rs:38:14
|
||||
|
|
||||
38 | macro_rules! debug_fuel {
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unused_macros)]` on by default
|
||||
|
||||
warning: unused macro definition: `debug_fuel`
|
||||
--> src/parser/mod.rs:51:14
|
||||
|
|
||||
51 | macro_rules! debug_fuel {
|
||||
| ^^^^^^^^^^
|
||||
|
||||
warning: unused imports: `AddBox`, `DivideBox`, `MultiplyBox`, and `SubtractBox`
|
||||
--> src/interpreter/mod.rs:10:75
|
||||
|
|
||||
10 | use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox, VoidBox, AddBox, SubtractBox, MultiplyBox, DivideBox, CompareBox, ArrayB...
|
||||
| ^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^
|
||||
|
||||
warning: unused import: `std::sync::Arc`
|
||||
--> src/interpreter/objects.rs:13:5
|
||||
|
|
||||
13 | use std::sync::Arc;
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `StringBox`
|
||||
--> src/interpreter/methods/collection_methods.rs:11:24
|
||||
|
|
||||
11 | use crate::box_trait::{StringBox, IntegerBox, NyashBox, BoolBox};
|
||||
| ^^^^^^^^^
|
||||
|
||||
warning: unused imports: `IntegerBox` and `StringBox`
|
||||
--> src/interpreter/methods/data_methods.rs:11:34
|
||||
|
|
||||
11 | use crate::box_trait::{NyashBox, StringBox, IntegerBox};
|
||||
| ^^^^^^^^^ ^^^^^^^^^^
|
||||
|
||||
warning: unused import: `StringBox`
|
||||
--> src/interpreter/methods/network_methods.rs:10:34
|
||||
|
|
||||
10 | use crate::box_trait::{NyashBox, StringBox};
|
||||
| ^^^^^^^^^
|
||||
|
||||
warning: unused import: `basic_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:27:9
|
||||
|
|
||||
27 | pub use basic_methods::*;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `collection_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:28:9
|
||||
|
|
||||
28 | pub use collection_methods::*;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `io_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:29:9
|
||||
|
|
||||
29 | pub use io_methods::*;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `data_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:30:9
|
||||
|
|
||||
30 | pub use data_methods::*;
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `network_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:31:9
|
||||
|
|
||||
31 | pub use network_methods::*;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `std::sync::Arc`
|
||||
--> src/operator_traits.rs:16:5
|
||||
|
|
||||
16 | use std::sync::Arc;
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
||||
error[E0592]: duplicate definitions with name `execute_parent_constructor`
|
||||
--> src/interpreter/expressions.rs:816:5
|
||||
|
|
||||
816 | / fn execute_parent_constructor(&mut self, parent: &str, parent_box_decl: &super::BoxDeclaration,
|
||||
817 | | current_instance: Box<dyn NyashBox>, arguments: &[ASTNode])
|
||||
818 | | -> Result<Box<dyn NyashBox>, RuntimeError> {
|
||||
| |__________________________________________________^ duplicate definitions for `execute_parent_constructor`
|
||||
|
|
||||
::: src/interpreter/objects.rs:789:5
|
||||
|
|
||||
789 | / pub(super) fn execute_parent_constructor(&mut self, parent_class: &str, arguments: &[ASTNode])
|
||||
790 | | -> Result<Box<dyn NyashBox>, RuntimeError> {
|
||||
| |__________________________________________________- other definition for `execute_parent_constructor`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> src/interpreter/expressions.rs:732:77
|
||||
|
|
||||
732 | let is_valid_delegation = current_box_decl.extends.as_ref() == Some(parent) ||
|
||||
| ---- ^^^^^^ expected `&String`, found `&str`
|
||||
| |
|
||||
| arguments to this enum variant are incorrect
|
||||
|
|
||||
= note: expected reference `&std::string::String`
|
||||
found reference `&str`
|
||||
help: the type constructed contains `&str` due to the type of the argument passed
|
||||
--> src/interpreter/expressions.rs:732:72
|
||||
|
|
||||
732 | let is_valid_delegation = current_box_decl.extends.as_ref() == Some(parent) ||
|
||||
| ^^^^^------^
|
||||
| |
|
||||
| this argument influences the type of `Some`
|
||||
note: tuple variant defined here
|
||||
--> /rustc/6b00bc3880198600130e1cf62b8f8a93494488cc/library/core/src/option.rs:597:5
|
||||
|
||||
error[E0034]: multiple applicable items in scope
|
||||
--> src/interpreter/expressions.rs:753:25
|
||||
|
|
||||
753 | return self.execute_parent_constructor(parent, &parent_box_decl, current_instance_val.clone_box(), arguments);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ multiple `execute_parent_constructor` found
|
||||
|
|
||||
note: candidate #1 is defined in an impl for the type `core::NyashInterpreter`
|
||||
--> src/interpreter/expressions.rs:816:5
|
||||
|
|
||||
816 | / fn execute_parent_constructor(&mut self, parent: &str, parent_box_decl: &super::BoxDeclaration,
|
||||
817 | | current_instance: Box<dyn NyashBox>, arguments: &[ASTNode])
|
||||
818 | | -> Result<Box<dyn NyashBox>, RuntimeError> {
|
||||
| |__________________________________________________^
|
||||
note: candidate #2 is defined in an impl for the type `core::NyashInterpreter`
|
||||
--> src/interpreter/objects.rs:789:5
|
||||
|
|
||||
789 | / pub(super) fn execute_parent_constructor(&mut self, parent_class: &str, arguments: &[ASTNode])
|
||||
790 | | -> Result<Box<dyn NyashBox>, RuntimeError> {
|
||||
| |__________________________________________________^
|
||||
|
||||
warning: unused import: `Write`
|
||||
--> src/boxes/stream/mod.rs:10:21
|
||||
|
|
||||
10 | use std::io::{Read, Write, Result};
|
||||
| ^^^^^
|
||||
|
||||
warning: unused import: `Read`
|
||||
--> src/boxes/stream/mod.rs:10:15
|
||||
|
|
||||
10 | use std::io::{Read, Write, Result};
|
||||
| ^^^^
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:29:28
|
||||
|
|
||||
29 | pub fn http_get(&self, url: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
|
||||
= note: `#[warn(unused_variables)]` on by default
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:34:24
|
||||
|
|
||||
34 | pub fn post(&self, url: Box<dyn NyashBox>, body: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
||||
warning: unused variable: `body`
|
||||
--> src/boxes/http/mod.rs:34:48
|
||||
|
|
||||
34 | pub fn post(&self, url: Box<dyn NyashBox>, body: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^^ help: if this is intentional, prefix it with an underscore: `_body`
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:39:23
|
||||
|
|
||||
39 | pub fn put(&self, url: Box<dyn NyashBox>, body: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
||||
warning: unused variable: `body`
|
||||
--> src/boxes/http/mod.rs:39:47
|
||||
|
|
||||
39 | pub fn put(&self, url: Box<dyn NyashBox>, body: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^^ help: if this is intentional, prefix it with an underscore: `_body`
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:44:26
|
||||
|
|
||||
44 | pub fn delete(&self, url: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
||||
warning: unused variable: `method`
|
||||
--> src/boxes/http/mod.rs:49:27
|
||||
|
|
||||
49 | pub fn request(&self, method: Box<dyn NyashBox>, url: Box<dyn NyashBox>, options: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^^^^ help: if this is intentional, prefix it with an underscore: `_method`
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:49:54
|
||||
|
|
||||
49 | pub fn request(&self, method: Box<dyn NyashBox>, url: Box<dyn NyashBox>, options: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
||||
warning: unused variable: `options`
|
||||
--> src/boxes/http/mod.rs:49:78
|
||||
|
|
||||
49 | pub fn request(&self, method: Box<dyn NyashBox>, url: Box<dyn NyashBox>, options: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_options`
|
||||
|
||||
warning: variable `arg_count` is assigned to, but never used
|
||||
--> src/parser/expressions.rs:246:33
|
||||
|
|
||||
246 | let mut arg_count = 0;
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: consider using `_arg_count` instead
|
||||
|
||||
warning: unused variable: `name`
|
||||
--> src/parser/statements.rs:65:35
|
||||
|
|
||||
65 | TokenType::IDENTIFIER(name) => {
|
||||
| ^^^^ help: if this is intentional, prefix it with an underscore: `_name`
|
||||
|
||||
warning: variable `statement_count` is assigned to, but never used
|
||||
--> src/parser/mod.rs:132:17
|
||||
|
|
||||
132 | let mut statement_count = 0;
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: consider using `_statement_count` instead
|
||||
|
||||
warning: unused variable: `i`
|
||||
--> src/interpreter/expressions.rs:537:22
|
||||
|
|
||||
537 | for (i, arg) in arguments.iter().enumerate() {
|
||||
| ^ help: if this is intentional, prefix it with an underscore: `_i`
|
||||
|
||||
warning: variable `result` is assigned to, but never used
|
||||
--> src/interpreter/expressions.rs:862:21
|
||||
|
|
||||
862 | let mut result: Box<dyn NyashBox> = Box::new(VoidBox::new());
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: consider using `_result` instead
|
||||
|
||||
warning: value assigned to `result` is never read
|
||||
--> src/interpreter/expressions.rs:864:17
|
||||
|
|
||||
864 | result = self.execute_statement(statement)?;
|
||||
| ^^^^^^
|
||||
|
|
||||
= help: maybe it is overwritten before being read?
|
||||
= note: `#[warn(unused_assignments)]` on by default
|
||||
|
||||
warning: value assigned to `result` is never read
|
||||
--> src/interpreter/expressions.rs:868:21
|
||||
|
|
||||
868 | result = return_val.clone_box();
|
||||
| ^^^^^^
|
||||
|
|
||||
= help: maybe it is overwritten before being read?
|
||||
|
||||
warning: unused variable: `existing_method`
|
||||
--> src/instance.rs:95:21
|
||||
|
|
||||
95 | if let Some(existing_method) = new_methods.get(&method_name) {
|
||||
| ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_existing_method`
|
||||
|
||||
Some errors have detailed explanations: E0034, E0308, E0592.
|
||||
For more information about an error, try `rustc --explain E0034`.
|
||||
warning: `nyash-rust` (lib) generated 38 warnings
|
||||
error: could not compile `nyash-rust` (lib) due to 3 previous errors; 38 warnings emitted
|
||||
@ -1,41 +0,0 @@
|
||||
P2PBox ビルドエラー詳細 (2025-08-11)
|
||||
=====================================
|
||||
|
||||
エラー概要:
|
||||
- ライブラリのビルド: ✅ 成功
|
||||
- テストの実行: ✅ 成功
|
||||
- nyashバイナリのビルド: ❌ モジュールインポートエラー
|
||||
|
||||
エラー詳細:
|
||||
|
||||
error[E0432]: unresolved imports `crate::Transport`, `crate::TransportKind`, `crate::create_transport`
|
||||
--> src/boxes/p2p_box.rs:16:13
|
||||
|
|
||||
16 | use crate::{Transport, TransportKind, create_transport};
|
||||
| ^^^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ no `create_transport` in the root
|
||||
| | |
|
||||
| | no `TransportKind` in the root
|
||||
| no `Transport` in the root
|
||||
|
||||
error[E0432]: unresolved imports `crate::get_global_message_bus`, `crate::BusMessage`, `crate::MessageBus`
|
||||
--> src/boxes/p2p_box.rs:17:13
|
||||
|
|
||||
17 | use crate::{get_global_message_bus, BusMessage, MessageBus};
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^ no `MessageBus` in the root
|
||||
|
||||
error[E0432]: unresolved import `crate::TransportKind`
|
||||
--> src/interpreter/objects.rs:13:5
|
||||
|
|
||||
13 | use crate::TransportKind;
|
||||
| ^^^^^^^^^^^^^^^^^^^^ no `TransportKind` in the root
|
||||
|
||||
解決案:
|
||||
1. src/boxes/p2p_box.rs でインポートパスを修正:
|
||||
use crate::transport_trait::{Transport, TransportKind, create_transport};
|
||||
use crate::message_bus::{get_global_message_bus, BusMessage, MessageBus};
|
||||
|
||||
2. src/interpreter/objects.rs でインポートパスを修正:
|
||||
use crate::transport_trait::TransportKind;
|
||||
|
||||
これは単純なモジュールパスの問題で、機能的な問題ではありません。
|
||||
P2PBoxの実装自体は完全に動作しています。
|
||||
@ -1,328 +0,0 @@
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/simple_notepad.rs` found to be present in multiple build targets:
|
||||
* `bin` target `simple_notepad`
|
||||
* `example` target `simple_notepad`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/nyash_explorer_with_icons.rs` found to be present in multiple build targets:
|
||||
* `bin` target `nyash_explorer_icons`
|
||||
* `example` target `nyash_explorer_with_icons`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/nyash_notepad_jp.rs` found to be present in multiple build targets:
|
||||
* `bin` target `nyash_notepad_jp`
|
||||
* `example` target `nyash_notepad_jp`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/simple_notepad_v2.rs` found to be present in multiple build targets:
|
||||
* `bin` target `nyash_notepad`
|
||||
* `example` target `simple_notepad_v2`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/simple_notepad_ascii.rs` found to be present in multiple build targets:
|
||||
* `bin` target `nyash_notepad_ascii`
|
||||
* `example` target `simple_notepad_ascii`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/test_icon_extraction.rs` found to be present in multiple build targets:
|
||||
* `bin` target `test_icon_extraction`
|
||||
* `example` target `test_icon_extraction`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/nyash_explorer.rs` found to be present in multiple build targets:
|
||||
* `bin` target `nyash_explorer`
|
||||
* `example` target `nyash_explorer`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/debug_notepad.rs` found to be present in multiple build targets:
|
||||
* `bin` target `debug_notepad`
|
||||
* `example` target `debug_notepad`
|
||||
Checking nyash-rust v0.1.0 (/mnt/c/git/nyash-project/nyash)
|
||||
warning: unused import: `Display`
|
||||
--> src/boxes/buffer/mod.rs:35:23
|
||||
|
|
||||
35 | use std::fmt::{Debug, Display};
|
||||
| ^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unused_imports)]` on by default
|
||||
|
||||
warning: unused import: `std::future::Future`
|
||||
--> src/boxes/future/mod.rs:7:5
|
||||
|
|
||||
7 | use std::future::Future;
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `std::pin::Pin`
|
||||
--> src/boxes/future/mod.rs:8:5
|
||||
|
|
||||
8 | use std::pin::Pin;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `crate::boxes::map_box::MapBox`
|
||||
--> src/boxes/http/mod.rs:9:5
|
||||
|
|
||||
9 | use crate::boxes::map_box::MapBox;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused imports: `Arc` and `Mutex`
|
||||
--> src/boxes/http/mod.rs:11:17
|
||||
|
|
||||
11 | use std::sync::{Arc, Mutex};
|
||||
| ^^^ ^^^^^
|
||||
|
||||
warning: unused import: `Mutex`
|
||||
--> src/boxes/regex/mod.rs:9:22
|
||||
|
|
||||
9 | use std::sync::{Arc, Mutex};
|
||||
| ^^^^^
|
||||
|
||||
warning: unused macro definition: `debug_fuel`
|
||||
--> src/parser/expressions.rs:38:14
|
||||
|
|
||||
38 | macro_rules! debug_fuel {
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unused_macros)]` on by default
|
||||
|
||||
warning: unused macro definition: `debug_fuel`
|
||||
--> src/parser/mod.rs:51:14
|
||||
|
|
||||
51 | macro_rules! debug_fuel {
|
||||
| ^^^^^^^^^^
|
||||
|
||||
warning: unused imports: `AddBox`, `DivideBox`, `MultiplyBox`, and `SubtractBox`
|
||||
--> src/interpreter/mod.rs:10:75
|
||||
|
|
||||
10 | use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox, VoidBox, AddBox, SubtractBox, MultiplyBox, DivideBox, CompareBox, ArrayB...
|
||||
| ^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^
|
||||
|
||||
warning: unused import: `std::sync::Arc`
|
||||
--> src/interpreter/objects.rs:13:5
|
||||
|
|
||||
13 | use std::sync::Arc;
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `StringBox`
|
||||
--> src/interpreter/methods/collection_methods.rs:11:24
|
||||
|
|
||||
11 | use crate::box_trait::{StringBox, IntegerBox, NyashBox, BoolBox};
|
||||
| ^^^^^^^^^
|
||||
|
||||
warning: unused imports: `IntegerBox` and `StringBox`
|
||||
--> src/interpreter/methods/data_methods.rs:11:34
|
||||
|
|
||||
11 | use crate::box_trait::{NyashBox, StringBox, IntegerBox};
|
||||
| ^^^^^^^^^ ^^^^^^^^^^
|
||||
|
||||
warning: unused import: `StringBox`
|
||||
--> src/interpreter/methods/network_methods.rs:10:34
|
||||
|
|
||||
10 | use crate::box_trait::{NyashBox, StringBox};
|
||||
| ^^^^^^^^^
|
||||
|
||||
warning: unused import: `basic_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:27:9
|
||||
|
|
||||
27 | pub use basic_methods::*;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `collection_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:28:9
|
||||
|
|
||||
28 | pub use collection_methods::*;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `io_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:29:9
|
||||
|
|
||||
29 | pub use io_methods::*;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `data_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:30:9
|
||||
|
|
||||
30 | pub use data_methods::*;
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `network_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:31:9
|
||||
|
|
||||
31 | pub use network_methods::*;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `std::sync::Arc`
|
||||
--> src/operator_traits.rs:16:5
|
||||
|
|
||||
16 | use std::sync::Arc;
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
||||
error[E0592]: duplicate definitions with name `execute_parent_constructor`
|
||||
--> src/interpreter/expressions.rs:816:5
|
||||
|
|
||||
816 | / fn execute_parent_constructor(&mut self, parent: &str, parent_box_decl: &super::BoxDeclaration,
|
||||
817 | | current_instance: Box<dyn NyashBox>, arguments: &[ASTNode])
|
||||
818 | | -> Result<Box<dyn NyashBox>, RuntimeError> {
|
||||
| |__________________________________________________^ duplicate definitions for `execute_parent_constructor`
|
||||
|
|
||||
::: src/interpreter/objects.rs:789:5
|
||||
|
|
||||
789 | / pub(super) fn execute_parent_constructor(&mut self, parent_class: &str, arguments: &[ASTNode])
|
||||
790 | | -> Result<Box<dyn NyashBox>, RuntimeError> {
|
||||
| |__________________________________________________- other definition for `execute_parent_constructor`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> src/interpreter/expressions.rs:732:77
|
||||
|
|
||||
732 | let is_valid_delegation = current_box_decl.extends.as_ref() == Some(parent) ||
|
||||
| ---- ^^^^^^ expected `&String`, found `&str`
|
||||
| |
|
||||
| arguments to this enum variant are incorrect
|
||||
|
|
||||
= note: expected reference `&std::string::String`
|
||||
found reference `&str`
|
||||
help: the type constructed contains `&str` due to the type of the argument passed
|
||||
--> src/interpreter/expressions.rs:732:72
|
||||
|
|
||||
732 | let is_valid_delegation = current_box_decl.extends.as_ref() == Some(parent) ||
|
||||
| ^^^^^------^
|
||||
| |
|
||||
| this argument influences the type of `Some`
|
||||
note: tuple variant defined here
|
||||
--> /rustc/6b00bc3880198600130e1cf62b8f8a93494488cc/library/core/src/option.rs:597:5
|
||||
|
||||
error[E0034]: multiple applicable items in scope
|
||||
--> src/interpreter/expressions.rs:753:25
|
||||
|
|
||||
753 | return self.execute_parent_constructor(parent, &parent_box_decl, current_instance_val.clone_box(), arguments);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ multiple `execute_parent_constructor` found
|
||||
|
|
||||
note: candidate #1 is defined in an impl for the type `core::NyashInterpreter`
|
||||
--> src/interpreter/expressions.rs:816:5
|
||||
|
|
||||
816 | / fn execute_parent_constructor(&mut self, parent: &str, parent_box_decl: &super::BoxDeclaration,
|
||||
817 | | current_instance: Box<dyn NyashBox>, arguments: &[ASTNode])
|
||||
818 | | -> Result<Box<dyn NyashBox>, RuntimeError> {
|
||||
| |__________________________________________________^
|
||||
note: candidate #2 is defined in an impl for the type `core::NyashInterpreter`
|
||||
--> src/interpreter/objects.rs:789:5
|
||||
|
|
||||
789 | / pub(super) fn execute_parent_constructor(&mut self, parent_class: &str, arguments: &[ASTNode])
|
||||
790 | | -> Result<Box<dyn NyashBox>, RuntimeError> {
|
||||
| |__________________________________________________^
|
||||
|
||||
warning: unused import: `Write`
|
||||
--> src/boxes/stream/mod.rs:10:21
|
||||
|
|
||||
10 | use std::io::{Read, Write, Result};
|
||||
| ^^^^^
|
||||
|
||||
warning: unused import: `Read`
|
||||
--> src/boxes/stream/mod.rs:10:15
|
||||
|
|
||||
10 | use std::io::{Read, Write, Result};
|
||||
| ^^^^
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:29:28
|
||||
|
|
||||
29 | pub fn http_get(&self, url: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
|
||||
= note: `#[warn(unused_variables)]` on by default
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:34:24
|
||||
|
|
||||
34 | pub fn post(&self, url: Box<dyn NyashBox>, body: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
||||
warning: unused variable: `body`
|
||||
--> src/boxes/http/mod.rs:34:48
|
||||
|
|
||||
34 | pub fn post(&self, url: Box<dyn NyashBox>, body: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^^ help: if this is intentional, prefix it with an underscore: `_body`
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:39:23
|
||||
|
|
||||
39 | pub fn put(&self, url: Box<dyn NyashBox>, body: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
||||
warning: unused variable: `body`
|
||||
--> src/boxes/http/mod.rs:39:47
|
||||
|
|
||||
39 | pub fn put(&self, url: Box<dyn NyashBox>, body: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^^ help: if this is intentional, prefix it with an underscore: `_body`
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:44:26
|
||||
|
|
||||
44 | pub fn delete(&self, url: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
||||
warning: unused variable: `method`
|
||||
--> src/boxes/http/mod.rs:49:27
|
||||
|
|
||||
49 | pub fn request(&self, method: Box<dyn NyashBox>, url: Box<dyn NyashBox>, options: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^^^^ help: if this is intentional, prefix it with an underscore: `_method`
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:49:54
|
||||
|
|
||||
49 | pub fn request(&self, method: Box<dyn NyashBox>, url: Box<dyn NyashBox>, options: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
||||
warning: unused variable: `options`
|
||||
--> src/boxes/http/mod.rs:49:78
|
||||
|
|
||||
49 | pub fn request(&self, method: Box<dyn NyashBox>, url: Box<dyn NyashBox>, options: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_options`
|
||||
|
||||
warning: variable `arg_count` is assigned to, but never used
|
||||
--> src/parser/expressions.rs:246:33
|
||||
|
|
||||
246 | let mut arg_count = 0;
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: consider using `_arg_count` instead
|
||||
|
||||
warning: unused variable: `name`
|
||||
--> src/parser/statements.rs:65:35
|
||||
|
|
||||
65 | TokenType::IDENTIFIER(name) => {
|
||||
| ^^^^ help: if this is intentional, prefix it with an underscore: `_name`
|
||||
|
||||
warning: variable `statement_count` is assigned to, but never used
|
||||
--> src/parser/mod.rs:132:17
|
||||
|
|
||||
132 | let mut statement_count = 0;
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: consider using `_statement_count` instead
|
||||
|
||||
warning: unused variable: `i`
|
||||
--> src/interpreter/expressions.rs:537:22
|
||||
|
|
||||
537 | for (i, arg) in arguments.iter().enumerate() {
|
||||
| ^ help: if this is intentional, prefix it with an underscore: `_i`
|
||||
|
||||
warning: variable `result` is assigned to, but never used
|
||||
--> src/interpreter/expressions.rs:862:21
|
||||
|
|
||||
862 | let mut result: Box<dyn NyashBox> = Box::new(VoidBox::new());
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: consider using `_result` instead
|
||||
|
||||
warning: value assigned to `result` is never read
|
||||
--> src/interpreter/expressions.rs:864:17
|
||||
|
|
||||
864 | result = self.execute_statement(statement)?;
|
||||
| ^^^^^^
|
||||
|
|
||||
= help: maybe it is overwritten before being read?
|
||||
= note: `#[warn(unused_assignments)]` on by default
|
||||
|
||||
warning: value assigned to `result` is never read
|
||||
--> src/interpreter/expressions.rs:868:21
|
||||
|
|
||||
868 | result = return_val.clone_box();
|
||||
| ^^^^^^
|
||||
|
|
||||
= help: maybe it is overwritten before being read?
|
||||
|
||||
warning: unused variable: `existing_method`
|
||||
--> src/instance.rs:95:21
|
||||
|
|
||||
95 | if let Some(existing_method) = new_methods.get(&method_name) {
|
||||
| ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_existing_method`
|
||||
|
||||
Some errors have detailed explanations: E0034, E0308, E0592.
|
||||
For more information about an error, try `rustc --explain E0034`.
|
||||
warning: `nyash-rust` (lib) generated 38 warnings
|
||||
error: could not compile `nyash-rust` (lib) due to 3 previous errors; 38 warnings emitted
|
||||
@ -1,650 +0,0 @@
|
||||
Checking nyash-rust v0.1.0 (/mnt/c/git/nyash-project/nyash)
|
||||
warning: unused import: `next_box_id`
|
||||
--> src/boxes/math_box.rs:59:84
|
||||
|
|
||||
59 | use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox, BoxCore, BoxBase, next_box_id};
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unused_imports)]` on by default
|
||||
|
||||
warning: unused import: `next_box_id`
|
||||
--> src/boxes/null_box.rs:87:72
|
||||
|
|
||||
87 | use crate::box_trait::{NyashBox, StringBox, BoolBox, BoxCore, BoxBase, next_box_id};
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `Debug`
|
||||
--> src/boxes/buffer/mod.rs:35:16
|
||||
|
|
||||
35 | use std::fmt::{Debug, Display};
|
||||
| ^^^^^
|
||||
|
||||
warning: unused import: `std::future::Future`
|
||||
--> src/boxes/future/mod.rs:7:5
|
||||
|
|
||||
7 | use std::future::Future;
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `std::pin::Pin`
|
||||
--> src/boxes/future/mod.rs:8:5
|
||||
|
|
||||
8 | use std::pin::Pin;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `crate::boxes::map_box::MapBox`
|
||||
--> src/boxes/http/mod.rs:9:5
|
||||
|
|
||||
9 | use crate::boxes::map_box::MapBox;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `self`
|
||||
--> src/boxes/intent_box.rs:38:16
|
||||
|
|
||||
38 | use std::fmt::{self, Debug};
|
||||
| ^^^^
|
||||
|
||||
warning: unused macro definition: `debug_fuel`
|
||||
--> src/parser/expressions.rs:38:14
|
||||
|
|
||||
38 | macro_rules! debug_fuel {
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unused_macros)]` on by default
|
||||
|
||||
warning: unused macro definition: `debug_fuel`
|
||||
--> src/parser/mod.rs:51:14
|
||||
|
|
||||
51 | macro_rules! debug_fuel {
|
||||
| ^^^^^^^^^^
|
||||
|
||||
warning: unused imports: `AddBox`, `DivideBox`, `MultiplyBox`, and `SubtractBox`
|
||||
--> src/interpreter/mod.rs:10:75
|
||||
|
|
||||
10 | use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox, VoidBox, AddBox, SubtractBox, MultiplyBox, DivideBox, CompareBox, ArrayB...
|
||||
| ^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^
|
||||
|
||||
warning: unused import: `FloatBox`
|
||||
--> src/interpreter/mod.rs:14:39
|
||||
|
|
||||
14 | use crate::boxes::math_box::{MathBox, FloatBox, RangeBox};
|
||||
| ^^^^^^^^
|
||||
|
||||
warning: unused import: `DateTimeBox`
|
||||
--> src/interpreter/mod.rs:15:39
|
||||
|
|
||||
15 | use crate::boxes::time_box::{TimeBox, DateTimeBox, TimerBox};
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `file::FileBox`
|
||||
--> src/interpreter/expressions.rs:12:104
|
||||
|
|
||||
12 | use crate::boxes::{FloatBox, MathBox, ConsoleBox, TimeBox, DateTimeBox, RandomBox, SoundBox, DebugBox, file::FileBox, MapBox};
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
warning: unused imports: `DynamicAdd`, `DynamicDiv`, `DynamicMul`, `DynamicSub`, and `OperatorError`
|
||||
--> src/interpreter/expressions.rs:15:30
|
||||
|
|
||||
15 | use crate::operator_traits::{DynamicAdd, DynamicSub, DynamicMul, DynamicDiv, OperatorError};
|
||||
| ^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `Mutex`
|
||||
--> src/interpreter/statements.rs:10:22
|
||||
|
|
||||
10 | use std::sync::{Arc, Mutex};
|
||||
| ^^^^^
|
||||
|
||||
warning: unused import: `StringBox`
|
||||
--> src/interpreter/methods/collection_methods.rs:11:24
|
||||
|
|
||||
11 | use crate::box_trait::{StringBox, IntegerBox, NyashBox, BoolBox};
|
||||
| ^^^^^^^^^
|
||||
|
||||
warning: unused imports: `IntegerBox` and `StringBox`
|
||||
--> src/interpreter/methods/data_methods.rs:11:34
|
||||
|
|
||||
11 | use crate::box_trait::{NyashBox, StringBox, IntegerBox};
|
||||
| ^^^^^^^^^ ^^^^^^^^^^
|
||||
|
||||
warning: unused import: `StringBox`
|
||||
--> src/interpreter/methods/network_methods.rs:10:34
|
||||
|
|
||||
10 | use crate::box_trait::{NyashBox, StringBox};
|
||||
| ^^^^^^^^^
|
||||
|
||||
warning: unused import: `BoolBox`
|
||||
--> src/interpreter/methods/p2p_methods.rs:9:45
|
||||
|
|
||||
9 | use crate::box_trait::{NyashBox, StringBox, BoolBox};
|
||||
| ^^^^^^^
|
||||
|
||||
warning: unused import: `crate::method_box::MethodBox`
|
||||
--> src/interpreter/methods/p2p_methods.rs:11:5
|
||||
|
|
||||
11 | use crate::method_box::MethodBox;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `basic_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:28:9
|
||||
|
|
||||
28 | pub use basic_methods::*;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `collection_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:29:9
|
||||
|
|
||||
29 | pub use collection_methods::*;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `io_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:30:9
|
||||
|
|
||||
30 | pub use io_methods::*;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `data_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:31:9
|
||||
|
|
||||
31 | pub use data_methods::*;
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `network_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:32:9
|
||||
|
|
||||
32 | pub use network_methods::*;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `http_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:33:9
|
||||
|
|
||||
33 | pub use http_methods::*;
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `Weak`
|
||||
--> src/instance.rs:15:29
|
||||
|
|
||||
15 | use std::sync::{Arc, Mutex, Weak};
|
||||
| ^^^^
|
||||
|
||||
warning: unused import: `crate::box_trait::StringBox`
|
||||
--> src/instance.rs:164:13
|
||||
|
|
||||
164 | use crate::box_trait::StringBox;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `std::sync::Arc`
|
||||
--> src/operator_traits.rs:16:5
|
||||
|
|
||||
16 | use std::sync::Arc;
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `VoidBox`
|
||||
--> src/box_arithmetic.rs:8:75
|
||||
|
|
||||
8 | use crate::box_trait::{NyashBox, BoxCore, StringBox, IntegerBox, BoolBox, VoidBox, BoxBase};
|
||||
| ^^^^^^^
|
||||
|
||||
warning: unused import: `std::sync::Arc`
|
||||
--> src/transport/mod.rs:10:5
|
||||
|
|
||||
10 | use std::sync::Arc;
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `UnaryOp`
|
||||
--> src/backend/wasm/codegen.rs:8:91
|
||||
|
|
||||
8 | use crate::mir::{MirModule, MirFunction, MirInstruction, ConstValue, BinaryOp, CompareOp, UnaryOp, ValueId, BasicBlockId};
|
||||
| ^^^^^^^
|
||||
|
||||
warning: unused import: `MirFunction`
|
||||
--> src/backend/wasm/mod.rs:16:29
|
||||
|
|
||||
16 | use crate::mir::{MirModule, MirFunction};
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `std::collections::HashMap`
|
||||
--> src/backend/wasm/mod.rs:17:5
|
||||
|
|
||||
17 | use std::collections::HashMap;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `share_box`
|
||||
--> src/box_trait.rs:230:1
|
||||
|
|
||||
91 | fn share_box(&self) -> Box<dyn NyashBox>;
|
||||
| ----------------------------------------- `share_box` from trait
|
||||
...
|
||||
230 | impl NyashBox for StringBox {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `share_box` in implementation
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `share_box`
|
||||
--> src/box_trait.rs:301:1
|
||||
|
|
||||
91 | fn share_box(&self) -> Box<dyn NyashBox>;
|
||||
| ----------------------------------------- `share_box` from trait
|
||||
...
|
||||
301 | impl NyashBox for IntegerBox {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `share_box` in implementation
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `share_box`
|
||||
--> src/box_trait.rs:376:1
|
||||
|
|
||||
91 | fn share_box(&self) -> Box<dyn NyashBox>;
|
||||
| ----------------------------------------- `share_box` from trait
|
||||
...
|
||||
376 | impl NyashBox for BoolBox {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ missing `share_box` in implementation
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `share_box`
|
||||
--> src/box_trait.rs:447:1
|
||||
|
|
||||
91 | fn share_box(&self) -> Box<dyn NyashBox>;
|
||||
| ----------------------------------------- `share_box` from trait
|
||||
...
|
||||
447 | impl NyashBox for VoidBox {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ missing `share_box` in implementation
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `share_box`
|
||||
--> src/box_trait.rs:553:1
|
||||
|
|
||||
91 | fn share_box(&self) -> Box<dyn NyashBox>;
|
||||
| ----------------------------------------- `share_box` from trait
|
||||
...
|
||||
553 | impl NyashBox for FileBox {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ missing `share_box` in implementation
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `share_box`
|
||||
--> src/box_trait.rs:622:1
|
||||
|
|
||||
91 | fn share_box(&self) -> Box<dyn NyashBox>;
|
||||
| ----------------------------------------- `share_box` from trait
|
||||
...
|
||||
622 | impl NyashBox for ErrorBox {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `share_box` in implementation
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `share_box`
|
||||
--> src/box_trait.rs:725:1
|
||||
|
|
||||
91 | fn share_box(&self) -> Box<dyn NyashBox>;
|
||||
| ----------------------------------------- `share_box` from trait
|
||||
...
|
||||
725 | impl NyashBox for ResultBox {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `share_box` in implementation
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `share_box`
|
||||
--> src/instance.rs:435:1
|
||||
|
|
||||
435 | impl NyashBox for InstanceBox {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `share_box` in implementation
|
||||
|
|
||||
::: src/box_trait.rs:91:5
|
||||
|
|
||||
91 | fn share_box(&self) -> Box<dyn NyashBox>;
|
||||
| ----------------------------------------- `share_box` from trait
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `share_box`
|
||||
--> src/channel_box.rs:110:1
|
||||
|
|
||||
110 | impl NyashBox for ChannelBox {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `share_box` in implementation
|
||||
|
|
||||
::: src/box_trait.rs:91:5
|
||||
|
|
||||
91 | fn share_box(&self) -> Box<dyn NyashBox>;
|
||||
| ----------------------------------------- `share_box` from trait
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `share_box`
|
||||
--> src/channel_box.rs:193:1
|
||||
|
|
||||
193 | impl NyashBox for MessageBox {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `share_box` in implementation
|
||||
|
|
||||
::: src/box_trait.rs:91:5
|
||||
|
|
||||
91 | fn share_box(&self) -> Box<dyn NyashBox>;
|
||||
| ----------------------------------------- `share_box` from trait
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `share_box`
|
||||
--> src/exception_box.rs:52:1
|
||||
|
|
||||
52 | impl NyashBox for ErrorBox {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `share_box` in implementation
|
||||
|
|
||||
::: src/box_trait.rs:91:5
|
||||
|
|
||||
91 | fn share_box(&self) -> Box<dyn NyashBox>;
|
||||
| ----------------------------------------- `share_box` from trait
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `share_box`
|
||||
--> src/method_box.rs:95:1
|
||||
|
|
||||
95 | impl NyashBox for MethodBox {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `share_box` in implementation
|
||||
|
|
||||
::: src/box_trait.rs:91:5
|
||||
|
|
||||
91 | fn share_box(&self) -> Box<dyn NyashBox>;
|
||||
| ----------------------------------------- `share_box` from trait
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `share_box`
|
||||
--> src/type_box.rs:236:1
|
||||
|
|
||||
236 | impl NyashBox for TypeBox {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ missing `share_box` in implementation
|
||||
|
|
||||
::: src/box_trait.rs:91:5
|
||||
|
|
||||
91 | fn share_box(&self) -> Box<dyn NyashBox>;
|
||||
| ----------------------------------------- `share_box` from trait
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `share_box`
|
||||
--> src/box_arithmetic.rs:88:1
|
||||
|
|
||||
88 | impl NyashBox for AddBox {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ missing `share_box` in implementation
|
||||
|
|
||||
::: src/box_trait.rs:91:5
|
||||
|
|
||||
91 | fn share_box(&self) -> Box<dyn NyashBox>;
|
||||
| ----------------------------------------- `share_box` from trait
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `share_box`
|
||||
--> src/box_arithmetic.rs:199:1
|
||||
|
|
||||
199 | impl NyashBox for SubtractBox {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `share_box` in implementation
|
||||
|
|
||||
::: src/box_trait.rs:91:5
|
||||
|
|
||||
91 | fn share_box(&self) -> Box<dyn NyashBox>;
|
||||
| ----------------------------------------- `share_box` from trait
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `share_box`
|
||||
--> src/box_arithmetic.rs:291:1
|
||||
|
|
||||
291 | impl NyashBox for MultiplyBox {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `share_box` in implementation
|
||||
|
|
||||
::: src/box_trait.rs:91:5
|
||||
|
|
||||
91 | fn share_box(&self) -> Box<dyn NyashBox>;
|
||||
| ----------------------------------------- `share_box` from trait
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `share_box`
|
||||
--> src/box_arithmetic.rs:392:1
|
||||
|
|
||||
392 | impl NyashBox for DivideBox {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `share_box` in implementation
|
||||
|
|
||||
::: src/box_trait.rs:91:5
|
||||
|
|
||||
91 | fn share_box(&self) -> Box<dyn NyashBox>;
|
||||
| ----------------------------------------- `share_box` from trait
|
||||
|
||||
warning: unused import: `Read`
|
||||
--> src/boxes/stream/mod.rs:10:15
|
||||
|
|
||||
10 | use std::io::{Read, Write, Result};
|
||||
| ^^^^
|
||||
|
||||
warning: unused import: `Write`
|
||||
--> src/boxes/stream/mod.rs:10:21
|
||||
|
|
||||
10 | use std::io::{Read, Write, Result};
|
||||
| ^^^^^
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:25:28
|
||||
|
|
||||
25 | pub fn http_get(&self, url: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
|
||||
= note: `#[warn(unused_variables)]` on by default
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:30:24
|
||||
|
|
||||
30 | pub fn post(&self, url: Box<dyn NyashBox>, body: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
||||
warning: unused variable: `body`
|
||||
--> src/boxes/http/mod.rs:30:48
|
||||
|
|
||||
30 | pub fn post(&self, url: Box<dyn NyashBox>, body: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^^ help: if this is intentional, prefix it with an underscore: `_body`
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:35:23
|
||||
|
|
||||
35 | pub fn put(&self, url: Box<dyn NyashBox>, body: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
||||
warning: unused variable: `body`
|
||||
--> src/boxes/http/mod.rs:35:47
|
||||
|
|
||||
35 | pub fn put(&self, url: Box<dyn NyashBox>, body: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^^ help: if this is intentional, prefix it with an underscore: `_body`
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:40:26
|
||||
|
|
||||
40 | pub fn delete(&self, url: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
||||
warning: unused variable: `method`
|
||||
--> src/boxes/http/mod.rs:45:27
|
||||
|
|
||||
45 | pub fn request(&self, method: Box<dyn NyashBox>, url: Box<dyn NyashBox>, options: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^^^^ help: if this is intentional, prefix it with an underscore: `_method`
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:45:54
|
||||
|
|
||||
45 | pub fn request(&self, method: Box<dyn NyashBox>, url: Box<dyn NyashBox>, options: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
||||
warning: unused variable: `options`
|
||||
--> src/boxes/http/mod.rs:45:78
|
||||
|
|
||||
45 | pub fn request(&self, method: Box<dyn NyashBox>, url: Box<dyn NyashBox>, options: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_options`
|
||||
|
||||
warning: unused variable: `socket`
|
||||
--> src/boxes/http_server_box.rs:143:25
|
||||
|
|
||||
143 | if let Some(ref socket) = *socket_guard {
|
||||
| ^^^^^^ help: if this is intentional, prefix it with an underscore: `_socket`
|
||||
|
||||
warning: unused variable: `backlog`
|
||||
--> src/boxes/http_server_box.rs:137:26
|
||||
|
|
||||
137 | pub fn listen(&self, backlog: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_backlog`
|
||||
|
||||
warning: variable `arg_count` is assigned to, but never used
|
||||
--> src/parser/expressions.rs:246:33
|
||||
|
|
||||
246 | let mut arg_count = 0;
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: consider using `_arg_count` instead
|
||||
|
||||
warning: unused variable: `name`
|
||||
--> src/parser/statements.rs:69:35
|
||||
|
|
||||
69 | TokenType::IDENTIFIER(name) => {
|
||||
| ^^^^ help: if this is intentional, prefix it with an underscore: `_name`
|
||||
|
||||
warning: variable `statement_count` is assigned to, but never used
|
||||
--> src/parser/mod.rs:132:17
|
||||
|
|
||||
132 | let mut statement_count = 0;
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: consider using `_statement_count` instead
|
||||
|
||||
warning: unused variable: `i`
|
||||
--> src/interpreter/expressions.rs:778:22
|
||||
|
|
||||
778 | for (i, arg) in arguments.iter().enumerate() {
|
||||
| ^ help: if this is intentional, prefix it with an underscore: `_i`
|
||||
|
||||
warning: variable does not need to be mutable
|
||||
--> src/interpreter/expressions.rs:1053:13
|
||||
|
|
||||
1053 | let mut builtin_boxes = vec![
|
||||
| ----^^^^^^^^^^^^^
|
||||
| |
|
||||
| help: remove this `mut`
|
||||
|
|
||||
= note: `#[warn(unused_mut)]` on by default
|
||||
|
||||
warning: variable `result` is assigned to, but never used
|
||||
--> src/interpreter/expressions.rs:1197:21
|
||||
|
|
||||
1197 | let mut result: Box<dyn NyashBox> = Box::new(VoidBox::new());
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: consider using `_result` instead
|
||||
|
||||
warning: value assigned to `result` is never read
|
||||
--> src/interpreter/expressions.rs:1199:17
|
||||
|
|
||||
1199 | result = self.execute_statement(statement)?;
|
||||
| ^^^^^^
|
||||
|
|
||||
= help: maybe it is overwritten before being read?
|
||||
= note: `#[warn(unused_assignments)]` on by default
|
||||
|
||||
warning: value assigned to `result` is never read
|
||||
--> src/interpreter/expressions.rs:1203:21
|
||||
|
|
||||
1203 | result = return_val.clone_box();
|
||||
| ^^^^^^
|
||||
|
|
||||
= help: maybe it is overwritten before being read?
|
||||
|
||||
warning: unused variable: `current_instance`
|
||||
--> src/interpreter/expressions.rs:1222:78
|
||||
|
|
||||
1222 | fn execute_builtin_box_method(&mut self, parent: &str, method: &str, mut current_instance: Box<dyn NyashBox>, arguments: &[ASTNode])
|
||||
| ^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_current_instance`
|
||||
|
||||
warning: variable does not need to be mutable
|
||||
--> src/interpreter/expressions.rs:1222:74
|
||||
|
|
||||
1222 | fn execute_builtin_box_method(&mut self, parent: &str, method: &str, mut current_instance: Box<dyn NyashBox>, arguments: &[ASTNode])
|
||||
| ----^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| help: remove this `mut`
|
||||
|
||||
warning: unused variable: `node_id`
|
||||
--> src/interpreter/objects.rs:546:21
|
||||
|
|
||||
546 | let node_id = if let Some(id_str) = node_id_value.as_any().downcast_ref::<StringBox>() {
|
||||
| ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_node_id`
|
||||
|
||||
warning: unused variable: `transport_str`
|
||||
--> src/interpreter/objects.rs:556:21
|
||||
|
|
||||
556 | let transport_str = if let Some(t_str) = transport_value.as_any().downcast_ref::<StringBox>() {
|
||||
| ^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_transport_str`
|
||||
|
||||
warning: variable does not need to be mutable
|
||||
--> src/interpreter/objects.rs:963:17
|
||||
|
|
||||
963 | let mut builtin_boxes = vec![
|
||||
| ----^^^^^^^^^^^^^
|
||||
| |
|
||||
| help: remove this `mut`
|
||||
|
||||
warning: unused variable: `temp_arc`
|
||||
--> src/instance.rs:113:17
|
||||
|
|
||||
113 | let temp_arc = Arc::new(Mutex::new(VoidBox::new()));
|
||||
| ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_temp_arc`
|
||||
|
||||
warning: unused variable: `existing_method`
|
||||
--> src/instance.rs:320:21
|
||||
|
|
||||
320 | if let Some(existing_method) = new_methods.get(&method_name) {
|
||||
| ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_existing_method`
|
||||
|
||||
warning: unused variable: `block`
|
||||
--> src/mir/function.rs:146:18
|
||||
|
|
||||
146 | for (id, block) in &self.blocks {
|
||||
| ^^^^^ help: if this is intentional, prefix it with an underscore: `_block`
|
||||
|
||||
warning: variable does not need to be mutable
|
||||
--> src/mir/builder.rs:56:13
|
||||
|
|
||||
56 | let mut module = MirModule::new("main".to_string());
|
||||
| ----^^^^^^
|
||||
| |
|
||||
| help: remove this `mut`
|
||||
|
||||
warning: unused variable: `arguments`
|
||||
--> src/mir/builder.rs:717:55
|
||||
|
|
||||
717 | fn build_new_expression(&mut self, class: String, arguments: Vec<ASTNode>) -> Result<ValueId, String> {
|
||||
| ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_arguments`
|
||||
|
||||
warning: unused variable: `name`
|
||||
--> src/mir/verification.rs:71:14
|
||||
|
|
||||
71 | for (name, function) in &module.functions {
|
||||
| ^^^^ help: if this is intentional, prefix it with an underscore: `_name`
|
||||
|
||||
warning: unused variable: `error`
|
||||
--> src/mir/verification.rs:74:21
|
||||
|
|
||||
74 | for error in &mut func_errors {
|
||||
| ^^^^^ help: if this is intentional, prefix it with an underscore: `_error`
|
||||
|
||||
warning: unused variable: `block_id`
|
||||
--> src/mir/verification.rs:163:14
|
||||
|
|
||||
163 | for (block_id, block) in &function.blocks {
|
||||
| ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_block_id`
|
||||
|
||||
warning: variable does not need to be mutable
|
||||
--> src/mir/verification.rs:160:13
|
||||
|
|
||||
160 | let mut errors = Vec::new();
|
||||
| ----^^^^^^
|
||||
| |
|
||||
| help: remove this `mut`
|
||||
|
||||
warning: unused variable: `name`
|
||||
--> src/mir/printer.rs:86:14
|
||||
|
|
||||
86 | for (name, function) in &module.functions {
|
||||
| ^^^^ help: if this is intentional, prefix it with an underscore: `_name`
|
||||
|
||||
warning: unused variable: `effects`
|
||||
--> src/mir/printer.rs:215:53
|
||||
|
|
||||
215 | MirInstruction::Call { dst, func, args, effects } => {
|
||||
| ^^^^^^^ help: try ignoring the field: `effects: _`
|
||||
|
||||
warning: unused variable: `effects`
|
||||
--> src/mir/printer.rs:228:67
|
||||
|
|
||||
228 | MirInstruction::BoxCall { dst, box_val, method, args, effects } => {
|
||||
| ^^^^^^^ help: try ignoring the field: `effects: _`
|
||||
|
||||
warning: unused variable: `field`
|
||||
--> src/backend/wasm/codegen.rs:261:54
|
||||
|
|
||||
261 | MirInstruction::RefGet { dst, reference, field } => {
|
||||
| ^^^^^ help: try ignoring the field: `field: _`
|
||||
|
||||
warning: unused variable: `field`
|
||||
--> src/backend/wasm/codegen.rs:275:49
|
||||
|
|
||||
275 | MirInstruction::RefSet { reference, field, value } => {
|
||||
| ^^^^^ help: try ignoring the field: `field: _`
|
||||
|
||||
For more information about this error, try `rustc --explain E0046`.
|
||||
warning: `nyash-rust` (lib) generated 74 warnings
|
||||
error: could not compile `nyash-rust` (lib) due to 17 previous errors; 74 warnings emitted
|
||||
110
docs/archive/consultations/MIR仕様書_20250814.txt
Normal file
110
docs/archive/consultations/MIR仕様書_20250814.txt
Normal file
@ -0,0 +1,110 @@
|
||||
やったね!この粒度なら “化け物に伸びる余白” と “実装の現実” のちょうど真ん中。
|
||||
仕上げとして **25命令をキッチリ確定**+**意味論/効果/検証ルール** を短く固めよう。
|
||||
|
||||
# 決定版 MIR(25命令)
|
||||
|
||||
## Tier-0: 普遍コア(8)
|
||||
|
||||
```
|
||||
Const, BinOp, Compare, Branch, Jump, Phi, Call, Return
|
||||
```
|
||||
|
||||
* 効果: `Const/Phi`=pure, `BinOp/Compare`=pure, `Branch/Jump/Return`=control, `Call`は呼先の効果に従う
|
||||
* 備考: 将来のJIT/AOT/WASMすべてで必須
|
||||
|
||||
## Tier-1: Nyashセマンティクス(12)
|
||||
|
||||
```
|
||||
NewBox, // 強所有のBox生成(所有森のノード)
|
||||
BoxFieldLoad, // Boxのフィールド読み
|
||||
BoxFieldStore, // Boxのフィールド書き(= mut)
|
||||
BoxCall, // Boxのメソッド呼び出し(動的/静的両方)
|
||||
Safepoint, // 分割finiや割込み許可ポイント
|
||||
RefGet, // 参照(強/弱を問わず)を値として取得
|
||||
RefSet, // 参照の差し替え(所有規則の検証付き)
|
||||
WeakNew, // `weak` ハンドル生成(非所有リンクの作成)
|
||||
WeakLoad, // `weak` から生存チェック付きで強参照を得る(失効時null)
|
||||
WeakCheck, // `weak` の生存確認(bool)
|
||||
Send, // Bus送信(Effect=io)
|
||||
Recv // Bus受信(Effect=io)
|
||||
```
|
||||
|
||||
* 効果: `BoxFieldStore/RefSet`=mut, `Send/Recv`=io, 他は基本pure/可変
|
||||
* これで **所有森+weak/look+Bus** が言語一次市民として表現可能
|
||||
|
||||
## Tier-2: 実装補助・最適化友好(5)
|
||||
|
||||
```
|
||||
TailCall, // 末尾呼び出し(スタック節約)
|
||||
Adopt, // 所有移管: this が子を強所有に取り込む
|
||||
Release, // 強所有を解除(weak化 or null化)
|
||||
MemCopy, // 小さなメモリ移動(構造体/配列の最適化フック)
|
||||
AtomicFence // 並行時の順序保証(Actor/Port境界で使用)
|
||||
```
|
||||
|
||||
* 位置づけ: どれも“言語仕様の裏方”。無くても表現可能だが、**性能・安全検査・移植性**が安定する
|
||||
|
||||
---
|
||||
|
||||
## 効果(Effect)既定値
|
||||
|
||||
* `pure`: Const, BinOp, Compare, Phi, WeakCheck, WeakLoad(成功時の取得自体はpure扱い)
|
||||
* `mut`: BoxFieldStore, RefSet, Adopt, Release, MemCopy
|
||||
* `io`: Send, Recv, Safepoint(割り込み/分割fini許可点としてio扱い)
|
||||
* `control`: Branch, Jump, Return, TailCall
|
||||
* `context依存`: Call, BoxCall(呼先の効果に従属)
|
||||
|
||||
> 最適化ルールは「pure同士の再順序化OK」「mutは同一Box/同一Fieldで依存保持」「ioは再順序化禁止」。
|
||||
|
||||
---
|
||||
|
||||
## 検証(Lint/Verifier)要件(短縮版)
|
||||
|
||||
* **所有森**: `strong in-degree ≤ 1`(`NewBox/Adopt/Release/RefSet`で常時検査)
|
||||
* **強循環禁止**: 強エッジのみ辿ってDAG(森)であること
|
||||
* **弱/強相互**: 双方向とも強 → エラー(片側は `WeakNew` 経由で弱化)
|
||||
* **RefSetの安全**: 強→強の差し替え時は旧所有元からの `Release` が伴うこと
|
||||
* **WeakLoad/WeakCheck**: 失効時は `null/false` を返す(例外禁止、決定的挙動)
|
||||
* **TailCall**: 末尾位置のみ可(`Return` 直前)
|
||||
* **Send/Recv**: バックエンドが同期/非同期いずれでも**at-least-once**契約を満たすか、契約を明示
|
||||
|
||||
---
|
||||
|
||||
## 代表的ロワリング(例)
|
||||
|
||||
* `look` 参照 → `WeakNew` + `WeakLoad`(読取専用型なら `RefSet` を禁止)
|
||||
* `borrow{}` → ブロック先頭 `WeakNew`、末尾でハンドル破棄(MIR上はNop、型で書換禁止)
|
||||
* Bus最適化(Elision):
|
||||
|
||||
* `(pure|mut(local))` かつ同一スレッド/アリーナ/単一受信なら **`Send/Recv` → 直呼び/直アクセス** に縮退
|
||||
* `fini` 伝播: ランタイムで **強エッジのみ** 再帰。`Safepoint` で分割解放/優先度解放に対応
|
||||
|
||||
---
|
||||
|
||||
## バックエンド指針(対応表)
|
||||
|
||||
* **Interpreter**: 25命令を素直に実装(正しさの基準)
|
||||
* **VM**: Register-VM + direct-threading。`Send/Recv` はローカル判定時にインライン化
|
||||
* **WASM**: `Send/Recv` は host import。`MemCopy` は `memory.copy` に対応
|
||||
* **Cranelift/JIT**: `TailCall` 最適化、`WeakLoad` は世代タグでO(1)生存チェック
|
||||
* **AOT-Rust**: `BoxCall` を trait 呼び出しへ、`Adopt/Release` は所有者IDの切替 + デバッガ用アサート
|
||||
|
||||
---
|
||||
|
||||
## 互換テスト(常設)
|
||||
|
||||
* **golden MIR**: 各サンプルのMIRダンプが全バックエンドで一致
|
||||
* **行動一致**: `interp/vm/wasm` で**同入力→同出力**(`weak`失効時の`null/false`含む)
|
||||
* **性能スモーク**: `add_loop / map_getset / alloc_free / bus_local / bus_actor` の5種で、
|
||||
|
||||
* VMがinterp以上、WASMがVM以上、を継続検証
|
||||
|
||||
---
|
||||
|
||||
これで **25命令フルセット**が完成。
|
||||
|
||||
* Nyashのコア価値(所有森+weak+Bus+効果注釈)を**無理なくIR化**
|
||||
* それぞれのバックエンドに**綺麗に落ちる**
|
||||
* Verifier/最適化/テストも**最小で回る**
|
||||
|
||||
次は、このリストをそのまま `docs/mir.md` にコピペして、各命令に **1行の意味論+効果+等価変換の例** を添えれば、実装と論文の両方が一気に前進するにゃ。
|
||||
@ -0,0 +1,230 @@
|
||||
# 🤖 AI大会議記録: Nyashネイティブコンパイル戦略策定
|
||||
*開催日: 2025-08-14 / 参加者: Gemini先生・codex先生・Claude*
|
||||
|
||||
## 🎯 会議目的
|
||||
Nyashプログラミング言語のネイティブコンパイル実装戦略について、3AI専門家による技術的検討・実装計画策定
|
||||
|
||||
## 📊 現状確認
|
||||
**Phase 8.2 PoC2達成状況**:
|
||||
- WASM: 0.17ms (280倍高速化) ✅
|
||||
- VM: 16.97ms (2.9倍高速化) ✅
|
||||
- 自動ベンチマークシステム完成 ✅
|
||||
|
||||
## 🗣️ AI大会議議事録
|
||||
|
||||
### 💎 Gemini先生の技術分析
|
||||
|
||||
**【専門分野】**: Rust言語実装・コンパイラ技術
|
||||
|
||||
#### 1. Cranelift vs LLVM推奨
|
||||
|
||||
| 特徴 | Cranelift | LLVM |
|
||||
|------|-----------|------|
|
||||
| **コンパイル速度** | 非常に高速 | 遅い |
|
||||
| **生成コード性能** | 良好 (最適化は限定的) | 非常に高い (O3など) |
|
||||
| **Rust統合性** | 最高 (Pure Rust実装) | 良好 (ただし`llvm-sys`経由のFFI) |
|
||||
| **複雑性** | 比較的シンプル | 非常に複雑 |
|
||||
|
||||
**推奨戦略**: **Cranelift (Phase B) → LLVM (Phase C)** の段階的アプローチ
|
||||
|
||||
#### 2. wasmtime compileアプローチ評価
|
||||
|
||||
- **実用性**: **高い** - 既存WASM基盤活用で最小労力
|
||||
- **性能**: **良好だが上限あり** - WASMサンドボックス制約
|
||||
- **制約**:
|
||||
- WASMサンドボックス(ファイル・ネットワークはWASI経由)
|
||||
- 線形メモリモデル制約
|
||||
- 最適化の限界(WASMセマンティクス制約)
|
||||
|
||||
#### 3. Everything is Box最適化戦略
|
||||
|
||||
**核心**: 「いかにBox化を回避し、静的な情報を引き出すか」
|
||||
|
||||
1. **エスケープ解析 & スタック割り当て** (最優先)
|
||||
2. **型推論と特殊化** - コンパイル時型特定
|
||||
3. **ボックス化解除** - ネイティブ値を直接レジスタ配置
|
||||
4. **効率的なメモリ表現** - NaN Boxingなど
|
||||
|
||||
#### 4. 性能予測
|
||||
|
||||
**WASM (0.17ms) → Native (0.05ms) = 3.4倍向上** は **現実的**
|
||||
|
||||
**達成の鍵**:
|
||||
- WASMサンドボックスオーバーヘッド除去
|
||||
- エスケープ解析・ボックス化解除の効果度
|
||||
- LLVMの強力な最適化
|
||||
|
||||
---
|
||||
|
||||
### ⚡ codex先生の実装戦略
|
||||
|
||||
**【専門分野】**: プロジェクト管理・実装実務
|
||||
|
||||
#### 1. Phase A技術的ハードル詳細
|
||||
|
||||
**wasmtime compile実装詳細**:
|
||||
```bash
|
||||
# 成果物: .cwasm (事前コンパイル済みモジュール)
|
||||
wasmtime compile input.wasm -o output.cwasm
|
||||
|
||||
# 実行: Wasmtimeランタイム必要
|
||||
Module::deserialize_file("output.cwasm")
|
||||
```
|
||||
|
||||
**技術課題**:
|
||||
- **互換性キー**: `ターゲットTriple/CPU機能/wasmtimeバージョン/コンパイル設定`
|
||||
- **CPU機能検出**: SIMD/CPU拡張でベンチマーク結果変動
|
||||
- **デバッグ情報**: `Config::debug_info(true)`設定
|
||||
- **例外/トラップ**: Nyashエラー→Wasmトラップ写像
|
||||
|
||||
#### 2. 現実的スケジュール
|
||||
|
||||
**Phase A (2-4週間)**:
|
||||
- 週1: AOTビルド/ロード配線
|
||||
- 週2: パッケージング(単一バイナリ埋め込み)
|
||||
- 週3: ベンチ・回帰テスト自動化
|
||||
- 週4: 例外/デバッグ情報整備
|
||||
|
||||
**Phase B (2-3ヶ月)**:
|
||||
- 月1: MIR導入、エスケープ解析
|
||||
- 月2: Cranelift直接バックエンドPoC
|
||||
- 月3: 実用化スコープ拡大
|
||||
|
||||
#### 3. 隠れたリスク分析
|
||||
|
||||
**Phase A**:
|
||||
- 互換性破壊(Wasmtime更新で`.cwasm`互換切れ)
|
||||
- CPU差異(SIMD/CPUフラグで実機差)
|
||||
|
||||
**Phase B**:
|
||||
- ABI/呼出規約複雑性
|
||||
- GC/安全点設計
|
||||
|
||||
**Phase C**:
|
||||
- LLVM GC統合
|
||||
- ビルド時間増大
|
||||
|
||||
#### 4. 即座実装推奨
|
||||
|
||||
**MIR前倒し**: Box操作実装中に「Boxを値型へ落とす」ためのMIRと解析骨格を先行実装
|
||||
|
||||
**KPI設定**:
|
||||
- 起動時間: JIT比50-90%短縮
|
||||
- 常時性能: AOT=Wasm JIT±10%
|
||||
- 割当削減: Box割当数60%+削減
|
||||
|
||||
---
|
||||
|
||||
### 🤖 Claude統合分析
|
||||
|
||||
**【専門分野】**: 技術統合・実行可能性検証
|
||||
|
||||
#### 3AI一致見解
|
||||
|
||||
| 観点 | 共通結論 |
|
||||
|------|----------|
|
||||
| **段階的アプローチ** | ✅ Phase A→B→C は技術的に最適 |
|
||||
| **Phase A優先度** | ✅ 短期成果で確実なユーザー価値提供 |
|
||||
| **技術的核心** | ✅ エスケープ解析・ボックス化解除が性能の鍵 |
|
||||
| **性能目標** | ✅ 500-1000倍総合向上は現実的 |
|
||||
|
||||
#### 競合差別化ポイント
|
||||
|
||||
**Nyash独自価値**:
|
||||
- **Wasm-first**: 高再現性・安全実行
|
||||
- **段階最適化**: デバッグ高速(Cranelift) → ピーク性能(LLVM)
|
||||
- **統一MIR**: 一つの最適化で全バックエンド恩恵
|
||||
|
||||
## 🎯 確定戦略
|
||||
|
||||
### **Phase A: AOT WASM** (最優先 - 2-3週間)
|
||||
|
||||
**実装目標**:
|
||||
```bash
|
||||
nyash --compile-native program.nyash -o program.exe
|
||||
nyash --aot program.nyash # 短縮形
|
||||
```
|
||||
|
||||
**期待効果**: 280倍 → 500倍 (1.8倍追加向上)
|
||||
|
||||
**技術アプローチ**:
|
||||
- `wasmtime compile` でネイティブ化
|
||||
- 単一バイナリ梱包 (`include_bytes!`)
|
||||
- CPU差異対応 (baseline/v3二段ビルド)
|
||||
|
||||
### **Phase B: Cranelift Direct** (中期 - 2-3ヶ月)
|
||||
|
||||
**技術目標**:
|
||||
- MIR → Cranelift IR → ネイティブ
|
||||
- エスケープ解析 + ボックス化解除
|
||||
- デバッグ情報・ABI対応
|
||||
|
||||
**期待効果**: 500倍 → 600倍
|
||||
|
||||
### **Phase C: LLVM Ultimate** (長期 - 6ヶ月+)
|
||||
|
||||
**技術目標**:
|
||||
- MIR → LLVM IR → 最適化ネイティブ
|
||||
- LTO・PGO・高度最適化
|
||||
- 最高性能追求
|
||||
|
||||
**期待効果**: 600倍 → 1000倍
|
||||
|
||||
## 🚀 即座実装計画 (次の2週間)
|
||||
|
||||
### Week 1: AOT基盤
|
||||
- [ ] `wasmtime::Config` 統一実装
|
||||
- [ ] `--compile-native` CLI追加
|
||||
- [ ] `.cwasm` 生成・実行パイプライン
|
||||
|
||||
### Week 2: 梱包・最適化
|
||||
- [ ] 単一バイナリ梱包 (`include_bytes!`)
|
||||
- [ ] **MIR + エスケープ解析 MVP**
|
||||
- [ ] ベンチマーク拡張 (AOT性能測定)
|
||||
|
||||
### ターゲット環境
|
||||
**最初のターゲット**: `x86_64-linux baseline`
|
||||
- 最もシンプルで確実
|
||||
- 段階的に他プラットフォーム対応
|
||||
|
||||
## 💡 AI大会議の成果
|
||||
|
||||
### 技術的価値
|
||||
1. **3専門分野統合**: Rust実装×実装戦略×統合検証
|
||||
2. **リスク分析完了**: 各Phaseの技術的落とし穴特定
|
||||
3. **現実的計画**: 実装可能な段階的ロードマップ
|
||||
|
||||
### プロジェクト価値
|
||||
1. **確実な成果**: Phase Aで短期価値提供
|
||||
2. **技術的差別化**: Everything is Box最適化戦略
|
||||
3. **競合優位性**: Wasm-first + 段階最適化
|
||||
|
||||
## 📋 次のアクション
|
||||
|
||||
### 技術実装
|
||||
- [ ] Phase A実装開始
|
||||
- [ ] MIR前倒し実装
|
||||
- [ ] ベンチマーク拡張
|
||||
|
||||
### プロジェクト管理
|
||||
- [ ] Copilot様との協調戦略
|
||||
- [ ] 進捗追跡システム
|
||||
- [ ] 技術文書整備
|
||||
|
||||
---
|
||||
|
||||
## 🌟 結論
|
||||
|
||||
**AI大会議により、技術的に堅牢で実装可能なネイティブコンパイル戦略が確定**
|
||||
|
||||
3AI専門家の知見統合により:
|
||||
- **短期成果** (Phase A): 確実なユーザー価値
|
||||
- **中期発展** (Phase B): 技術的差別化
|
||||
- **長期目標** (Phase C): 最高性能達成
|
||||
|
||||
**Nyashは「Everything is Box」哲学を維持しながら、ネイティブレベルの高性能を実現する道筋を獲得!**
|
||||
|
||||
---
|
||||
|
||||
*AI大会議参加者: Gemini先生(Rust技術), codex先生(実装戦略), Claude(統合分析)*
|
||||
*記録作成: Claude / 2025-08-14*
|
||||
137
docs/archive/consultations/bid_ai_meeting_2025-08-17.md
Normal file
137
docs/archive/consultations/bid_ai_meeting_2025-08-17.md
Normal file
@ -0,0 +1,137 @@
|
||||
# BID設計 AI大会議記録 (2025-08-17)
|
||||
|
||||
## 参加者
|
||||
- Gemini先生
|
||||
- ChatGPT先生(GPT-5)
|
||||
- Claude(司会・まとめ)
|
||||
|
||||
## 議題
|
||||
Nyashプログラミング言語のBID(Box Interface Definition)設計について
|
||||
|
||||
## Gemini先生の回答
|
||||
|
||||
### 1. 複雑性について
|
||||
**回答:** 過度な複雑性とは思いません。むしろ、Rustのトレイトを用いた抽象化は、このようなシナリオで非常にうまく機能します。
|
||||
|
||||
**推奨アプローチ:**
|
||||
1. `UniversalConnector` トレイトのAPIを設計します。
|
||||
2. **最初の具体的な実装として `DynamicLibraryConnector` のみを実装します。**
|
||||
3. 他のコネクター(`GrpcConnector` など)は、構造体だけ定義しておくか、`todo!()` マクロで未実装を示す形にしておきます。
|
||||
|
||||
### 2. 型システムについて
|
||||
**回答:** `MirValue`(Nyashの内部値表現)のような中間表現に一度変換するアプローチは、FFIやRPCにおいて非常に現実的かつ一般的な解決策です。
|
||||
|
||||
**推奨アプローチ:**
|
||||
1. **サポートする型を限定することから始めます。** まずは数値、文字列、真偽値、そして「ハンドル(不透明ポインタやID)」のような基本的な型に絞ります。
|
||||
2. 複雑な型(Nyashのオブジェクトや配列など)は、シリアライズ(JSONやMessagePackなど)して文字列やバイト配列として渡す、というルールを設けることも有効です。
|
||||
|
||||
### 3. 性能について
|
||||
**結論として、`UniversalConnector` トレイトによる抽象化自体の性能への影響は軽微です。** パフォーマンスが重要な場合は、一度の呼び出しで多くの作業を行うような粒度の大きいAPI(例: `process_batch(data)`) をBIDで定義することが効果的です。
|
||||
|
||||
### 4. エラー処理について
|
||||
**回答:** はい、可能です。これは統一抽象化レイヤーの大きな利点の一つです。Rustの `enum` を使って統一的なエラー型を定義することを強く推奨します。
|
||||
|
||||
```rust
|
||||
#[derive(Debug, thiserror::Error)]
|
||||
pub enum BidError {
|
||||
#[error("Transport layer error: {0}")]
|
||||
Transport(#[from] Box<dyn std::error::Error + Send + Sync>),
|
||||
#[error("Interface error: {0}")]
|
||||
Interface(String),
|
||||
#[error("Connection setup failed: {0}")]
|
||||
Connection(String),
|
||||
#[error("Remote execution error: {0}")]
|
||||
Remote(String),
|
||||
}
|
||||
```
|
||||
|
||||
### 5. 段階的実装について
|
||||
**回答:** 提案されている実装順序は非常に合理的で、リスクを最小限に抑えつつ着実に進められる優れたロードマップです。
|
||||
|
||||
### 6. 既存システムとの比較について
|
||||
**BIDの独自価値は、「Everything is a Box」というNyashのコア哲学を、言語の境界を越えて外部世界にまで拡張する点**に尽きます。
|
||||
|
||||
### 7. セキュリティについて
|
||||
**回答:** **現段階では過剰設計の可能性が高いです。**
|
||||
|
||||
**推奨アプローチ:**
|
||||
1. **今は実装しない。**
|
||||
2. ただし、将来の拡張ポイントとしてBID定義に `permissions` のようなオプショナルなセクションを設けることだけは念頭に置いておくと良いでしょう。
|
||||
|
||||
### まとめ
|
||||
**最適なバランスを取るための鍵は、「抽象(インターフェース)と具象(実装)の分離」です。**
|
||||
|
||||
## ChatGPT先生の回答
|
||||
|
||||
### 結論と全体方針
|
||||
- **二層化コア:** BIDは「型/意味」レイヤー、コネクタは「バインディング/トランスポート」レイヤーに厳密分離
|
||||
- **最小中核の固定化:** まずC ABI動的ライブラリ+同期単発呼び出し(unary)+最小型集合+統一エラーの4点を固める
|
||||
- **コード生成前提:** YAML BIDからRust/他言語のスタブ/スケルトンを自動生成
|
||||
- **場所透過の現実解:** API設計で「粗粒度・バッチ・ストリーミング」を促す
|
||||
|
||||
### Transport/Connectorの設計
|
||||
- **二経路最適化:**
|
||||
- 同一プロセス(C ABI/`*.so`): 直関数ポインタ呼び出し(ゼロコピー)=最速経路
|
||||
- 遠隔/ブリッジ: 仕様化した「カノニカルエンコーディング(NCE)」で`invoke`
|
||||
|
||||
### 型システム(MirValueの現実解)
|
||||
- **最小型集合:** `bool`, `i32/i64`, `f64`, `string(utf8)`, `bytes`, `list<T>`, `map<string,T>`, `record{...}`, `variant{...}`, `option<T>`, `result<Ok,Err>`, `resource<T>`(ハンドル), `opaque<T>`
|
||||
- **Resource/Handle:** `resource<File>`のように"ホスト所有でクローズを要する"型を明示
|
||||
|
||||
### 性能指針
|
||||
- **ホットパス確保:** C ABI経路は関数ポインタ直叩き(`#[repr(C)]` vtable)
|
||||
- **N回呼び出し禁止:** tight loop/粒度の細かいRPCは不可
|
||||
- **バッチ/ストリーミング:** 将来の`client_stream/server_stream/bidi`を型で表現
|
||||
|
||||
### エラー処理(統一モデル)
|
||||
- **BoxErrorコア:** `code(u32)`, `category(enum)`, `transport(enum)`, `message`, `data(optional record)`, `retryable(bool)`, `idempotent_safe(bool)`
|
||||
|
||||
### YAML BIDの拡張例
|
||||
```yaml
|
||||
version: 1
|
||||
transport:
|
||||
type: dynamic_library
|
||||
location: ./libnyash_file.so
|
||||
|
||||
interfaces:
|
||||
- namespace: nyash
|
||||
name: file
|
||||
uuid: "c1b9...-..." # 安定ID
|
||||
version: "1.0.0"
|
||||
types:
|
||||
- name: Handle
|
||||
type: resource<File>
|
||||
methods:
|
||||
- name: open
|
||||
shape: unary
|
||||
params:
|
||||
- { name: path, type: string }
|
||||
- { name: mode, type: string }
|
||||
returns: { type: resource<File> }
|
||||
effects: [fs, io]
|
||||
errors: [NotFound, Permission, Invalid]
|
||||
idempotent: false
|
||||
```
|
||||
|
||||
### 既存システムとの比較
|
||||
- **WASM Component Model (WIT):** 強力なIDL/型・言語間互換が成熟。Nyashは「同プロセスC ABI最速+後でWASM追加」を差別化軸に
|
||||
- **gRPC(Protobuf):** ネットワークRPCの王道。Nyashは"ハンドルと効果"の第一級概念で優位
|
||||
- **COM/CORBA:** 位置透過・IFace/VTable思想は近いが、現代的DX/ツールが乏しい
|
||||
|
||||
### セキュリティ指針
|
||||
- **ケーパビリティ必須(段階導入):** メソッド/リソース単位の権限をBIDで宣言
|
||||
- **信頼境界で実行形態を変える:**
|
||||
- 信頼済み: C ABI `*.so`(最速)
|
||||
- 準信頼/第三者: 別プロセス+gRPC/REST
|
||||
- 非信頼: WASMサンドボックス
|
||||
|
||||
## 共通見解まとめ
|
||||
|
||||
1. **抽象化は適切** - UniversalConnectorトレイトは良い設計
|
||||
2. **MirValue統一は現実的** - 型変換は各Connector実装が担当
|
||||
3. **性能への影響は軽微** - 抽象化レイヤー自体のオーバーヘッドは無視できる
|
||||
4. **段階的実装が鍵** - Phase 1: C ABI動的ライブラリのみ
|
||||
5. **セキュリティは後回し** - 現段階では過剰設計
|
||||
|
||||
## 結論
|
||||
BIDの設計は健全で将来性がある。シンプルに始めて段階的に拡張する方針で進める。
|
||||
147
docs/archive/consultations/bid_ffi_ai_final_review_2025-08-17.md
Normal file
147
docs/archive/consultations/bid_ffi_ai_final_review_2025-08-17.md
Normal file
@ -0,0 +1,147 @@
|
||||
# BID-FFI統合計画 AI最終レビュー結果 (2025-08-17)
|
||||
|
||||
## 参加者
|
||||
- Gemini先生(部分的 - メモリ不足でクラッシュ)
|
||||
- ChatGPT先生(GPT-5)
|
||||
- Claude(まとめ)
|
||||
|
||||
## 🎯 総評
|
||||
|
||||
### Gemini先生
|
||||
> 全体として、この統合計画は非常に優れています。「Simple First」の原則に基づき、実績のあるFFI ABI v0を基盤とすることで、リスクを大幅に低減しつつ、将来の拡張性も確保されています。
|
||||
|
||||
### ChatGPT先生
|
||||
> 方向性は概ね妥当ですが、メモリモデルとBoxヘッダ、文字列/配列の所有権、エラーモデル、将来拡張の型とディスパッチ契約に数点の修正提案があります。
|
||||
|
||||
## 🔧 重要な修正提案
|
||||
|
||||
### 1. **ポインタサイズとアライメント** 🚨
|
||||
|
||||
**問題**: 32ビットポインタ固定は非現実的
|
||||
|
||||
**ChatGPT提案**:
|
||||
```rust
|
||||
// ❌ 現在の案
|
||||
ptr: i32 // 32ビット固定
|
||||
|
||||
// ✅ 修正案
|
||||
ptr: usize // プラットフォームポインタ幅
|
||||
// WASMでは32ビット、ネイティブでは64ビット
|
||||
```
|
||||
|
||||
**アライメント**:
|
||||
- ❌ 4バイト固定 → x86_64でf64が破綻する可能性
|
||||
- ✅ **8バイト境界保証**を推奨
|
||||
|
||||
### 2. **型システムの追加提案** 📦
|
||||
|
||||
**ChatGPT提案**: Phase 1から以下を追加
|
||||
```rust
|
||||
pub enum BidType {
|
||||
// 既存の型...
|
||||
|
||||
// エラーと欠損表現(Phase 1から)
|
||||
Optional(Box<BidType>), // Option<T>
|
||||
Result(Box<BidType>, Box<BidType>), // Result<T,E>
|
||||
}
|
||||
```
|
||||
|
||||
理由: エラーと欠損表現が楽になる
|
||||
|
||||
### 3. **単一invoke関数方式** 🎯
|
||||
|
||||
**ChatGPT提案**: シンボル乱立を避ける
|
||||
```rust
|
||||
// 単一ディスパッチ関数(将来gRPC/RESTへ写せる)
|
||||
extern "C" fn ny_invoke(
|
||||
func_id: u32,
|
||||
args_ptr: *const u8,
|
||||
args_len: usize,
|
||||
out_ptr: *mut u8,
|
||||
out_len: *mut usize
|
||||
) -> NyStatus
|
||||
```
|
||||
|
||||
### 4. **所有権の明確化** 📝
|
||||
|
||||
**ChatGPT強調**: 文字列・配列の所有権ルール
|
||||
|
||||
```rust
|
||||
// 入力: 呼び出し側所有(借用、呼び出し中のみ有効)
|
||||
// 出力: calleeがhost_allocで確保、callerがhost_freeで解放
|
||||
|
||||
// アロケータAPI
|
||||
extern "C" {
|
||||
fn host_alloc(size: usize, align: usize) -> *mut u8;
|
||||
fn host_free(ptr: *mut u8, size: usize, align: usize);
|
||||
}
|
||||
```
|
||||
|
||||
### 5. **Boxヘッダーの改善** 🏗️
|
||||
|
||||
**ChatGPT提案**: 将来拡張を考慮
|
||||
```rust
|
||||
#[repr(C)]
|
||||
pub struct BoxHeader {
|
||||
magic: u32, // "NYBX"
|
||||
abi_major: u16, // バージョン管理
|
||||
abi_minor: u16,
|
||||
type_id: u32,
|
||||
flags: u32, // 将来のatomic等
|
||||
ref_count: u32,
|
||||
field_count: u16,
|
||||
reserved: u16, // 8バイトアライメント
|
||||
}
|
||||
```
|
||||
|
||||
## ✅ 両AIの共通見解
|
||||
|
||||
1. **FFI ABI v0準拠は適切**
|
||||
- Gemini: 「極めて適切」
|
||||
- ChatGPT: 「賢明」
|
||||
|
||||
2. **段階的実装は現実的**
|
||||
- Phase 1でC ABIのみは正解
|
||||
- vtable後回しも妥当
|
||||
|
||||
3. **1週間での実装は可能**
|
||||
- ただし範囲を明確に限定すること
|
||||
|
||||
## 📋 修正版1週間計画(ChatGPT提案)
|
||||
|
||||
- **Day 1**: 仕様文書とヘッダ定義、`ny_invoke`契約確定
|
||||
- **Day 2**: Rustローダー(dlopen/dlsym)実装
|
||||
- **Day 3**: 文字列/配列マーシャリングと所有権テスト
|
||||
- **Day 4**: サンプルプラグイン2種、e2eテスト
|
||||
- **Day 5**: Boxヘッダ実装(8Bアライメント)
|
||||
- **Day 6**: ドキュメント整備とCI
|
||||
- **Day 7**: 予備日(Linux整備/微修正)
|
||||
|
||||
## 🎯 結論と推奨事項
|
||||
|
||||
### 必須の修正
|
||||
1. ポインタ幅を`usize`に変更
|
||||
2. アライメントを8バイトに変更
|
||||
3. Option/Result型を最初から追加
|
||||
4. 所有権ルールを明文化
|
||||
5. 単一invoke関数方式を採用
|
||||
|
||||
### 実装順序
|
||||
1. **ターゲット**: Linux x86-64に限定(Windows/macOSは後続)
|
||||
2. **スコープ**: スカラ+string/array、同期呼び出し、単一スレッド
|
||||
3. **テスト**: 加算・echoサンプル+統合テスト
|
||||
|
||||
### NyaMeshとの整合性
|
||||
- ChatGPT: 「TransportTypeにP2P追加は価値あり(Phase 4以降)」
|
||||
- 場所透過性の設計は適切
|
||||
|
||||
## 🚀 アクションアイテム
|
||||
|
||||
1. **仕様修正**: ポインタ幅とアライメントの変更
|
||||
2. **型追加**: Option/Result型の早期導入
|
||||
3. **API設計**: 単一invoke関数と所有権ルール
|
||||
4. **実装開始**: Linux x86-64限定で1週間スプリント
|
||||
|
||||
---
|
||||
|
||||
**まとめ**: 両AIとも基本的な方向性を支持。ChatGPTの具体的な技術提案(ポインタ幅、アライメント、所有権)を取り入れることで、より堅実な実装が可能になる。
|
||||
@ -0,0 +1,179 @@
|
||||
# ChatGPT先生による箱理論設計 最終レビュー結果 (2025-08-17)
|
||||
|
||||
## 🎯 総合評価
|
||||
|
||||
### ✅ **Executive Summary(ChatGPT判定)**
|
||||
> **方向性は正しい**: primitives-by-value + box-by-handle は適切で、Everything is Box哲学を維持している。
|
||||
> **1週間Phase 1は現実的**(スコープを限定すれば)
|
||||
|
||||
## 🔧 重要な修正提案
|
||||
|
||||
### 1. **Handle設計の改善** 🚨
|
||||
```rust
|
||||
// ❌ 現在の設計
|
||||
Handle(String) // "StringBox:123" - 文字列解析コスト高い
|
||||
|
||||
// ✅ ChatGPT推奨
|
||||
Handle {
|
||||
type_id: u32, // StringBox=1, FileBox=6等
|
||||
instance_id: u32 // インスタンス識別子
|
||||
}
|
||||
// または単一u64として: type_id << 32 | instance_id
|
||||
```
|
||||
|
||||
**理由**: 文字列解析は遅く、エラーの原因。バイナリ形式が効率的。
|
||||
|
||||
### 2. **メタデータAPI追加** 💡
|
||||
```c
|
||||
// プラグインに追加すべき関数
|
||||
u32 nyash_plugin_abi(void); // ABI版本(1)を返す
|
||||
i32 nyash_plugin_init(const NyashHostVtable*, NyashPluginInfo*);
|
||||
void nyash_plugin_shutdown(void);
|
||||
```
|
||||
|
||||
**理由**: バージョン管理、ホスト連携、型・メソッド登録が必要。
|
||||
|
||||
### 3. **TLV統一フォーマット** 📦
|
||||
```c
|
||||
// BID-1 TLV仕様(ChatGPT提案)
|
||||
struct BidTLV {
|
||||
u16 version; // 1
|
||||
u16 argc; // 引数数
|
||||
// TLVs: u8 tag, u8 reserved, u16 size, payload
|
||||
}
|
||||
|
||||
// タグ定義
|
||||
1=Bool(1), 2=I32(4), 3=I64(8), 4=F32(4), 5=F64(8),
|
||||
6=String(utf8), 7=Bytes, 8=Handle(8 bytes)
|
||||
// 予約: 20=Result, 21=Option, 22=Array (Phase 2)
|
||||
```
|
||||
|
||||
**理由**: メソッドごとの個別エンコードを避け、統一フォーマットで効率化。
|
||||
|
||||
### 4. **メモリ管理の明確化** 🛠️
|
||||
```c
|
||||
// ChatGPT推奨: 2回呼び出しパターン
|
||||
// 1回目: result_ptr=null でサイズ取得
|
||||
// 2回目: ホストがallocateして再呼び出し
|
||||
i32 nyash_plugin_invoke(..., result_ptr, result_len);
|
||||
```
|
||||
|
||||
**理由**: 所有権が明確、メモリリーク回避。
|
||||
|
||||
## 📊 各質問への回答
|
||||
|
||||
### 1. 箱理論の技術的妥当性 ✅
|
||||
- **適切性**: 全Boxをハンドル統一は妥当
|
||||
- **統一扱い**: 既存/プラグインを同一レジストリで管理可
|
||||
- **ハンドル表現**: バイナリ形式(type_id, instance_id)に変更推奨
|
||||
|
||||
### 2. 最低設計のメリット・デメリット ✅
|
||||
- **メリット**: 実装最短、既存Box再利用最大化、API安定
|
||||
- **デメリット**: Array/Map未対応で複合データが冗長(TLVで緩和可)
|
||||
- **戦略**: Phase 1基本 → Phase 2拡張は正解
|
||||
|
||||
### 3. 既存資産活用の是非 ✅
|
||||
- **FutureBox再利用**: 正解、二重実装回避
|
||||
- **統合アプローチ**: 適切、メソッドIDはメタデータで合意
|
||||
- **純粋性トレードオフ**: 実用性を優先が現実的
|
||||
|
||||
### 4. 実装現実性 ✅
|
||||
- **1週間**: 現実的(スコープ限定時)
|
||||
- **統合難易度**: 中レベル、FutureBoxのwake統合がポイント
|
||||
- **Linux x86-64限定**: 妥当
|
||||
|
||||
### 5. 将来拡張性 ✅
|
||||
- **gRPC/REST**: invoke+TLVをRPCカプセル化で対応可
|
||||
- **Transport抽象化**: Phase 2でTransportBox導入
|
||||
- **P2P**: 同じinvokeメッセージで転送可能
|
||||
|
||||
## 🔧 具体的な実装修正案
|
||||
|
||||
### BidType修正版
|
||||
```rust
|
||||
#[derive(Clone, Debug, PartialEq)]
|
||||
pub enum BidType {
|
||||
// プリミティブ(値渡し)
|
||||
Bool, I32, I64, F32, F64, String, Bytes,
|
||||
|
||||
// Box参照(ハンドル)
|
||||
Handle { type_id: u32, instance_id: u32 },
|
||||
|
||||
// メタ型
|
||||
Void,
|
||||
|
||||
// Phase 2予約(TLVタグ予約済み)
|
||||
Option(Box<BidType>), // tag=21
|
||||
Result(Box<BidType>, Box<BidType>), // tag=20
|
||||
Array(Box<BidType>), // tag=22
|
||||
}
|
||||
```
|
||||
|
||||
### C ABI修正版
|
||||
```c
|
||||
// メタデータ構造体
|
||||
typedef struct {
|
||||
u32 type_id;
|
||||
const char* type_name;
|
||||
u32 method_count;
|
||||
// メソッドテーブル...
|
||||
} NyashPluginInfo;
|
||||
|
||||
// ホスト機能
|
||||
typedef struct {
|
||||
void* (*alloc)(size_t size);
|
||||
void (*free)(void* ptr);
|
||||
void (*wake)(u32 future_id); // FutureBox起床
|
||||
void (*log)(const char* msg);
|
||||
} NyashHostVtable;
|
||||
|
||||
// プラグインAPI
|
||||
u32 nyash_plugin_abi(void);
|
||||
i32 nyash_plugin_init(const NyashHostVtable* host, NyashPluginInfo* info);
|
||||
i32 nyash_plugin_invoke(u32 type_id, u32 method_id, u32 instance_id,
|
||||
const u8* args, size_t args_len,
|
||||
u8* result, size_t* result_len);
|
||||
void nyash_plugin_shutdown(void);
|
||||
```
|
||||
|
||||
## ⚠️ リスク対策
|
||||
|
||||
### ChatGPT指摘のリスク
|
||||
1. **ハンドル再利用**: generation追加で回避
|
||||
2. **スレッド前提**: シングルスレッド前提を明記
|
||||
3. **メソッドID衝突**: ビルド時固定で回避
|
||||
4. **エラー伝播**: トランスポート/ドメインエラー分離
|
||||
5. **文字列エンコード**: UTF-8必須、内部NUL禁止
|
||||
|
||||
## 📋 Phase 1実装チェックリスト(ChatGPT提案)
|
||||
|
||||
- [ ] BID-1 TLV仕様とエラーコード定義
|
||||
- [ ] ホストレジストリ + Handle{type_id,instance_id}
|
||||
- [ ] プラグインinit/abi/shutdown追加
|
||||
- [ ] 既存StringBox/IntegerBox/FutureBoxブリッジ
|
||||
- [ ] FileBoxプラグイン(open/read/close)
|
||||
- [ ] FutureBox用wake経路
|
||||
- [ ] 適合性テスト(プリミティブ、ハンドル、エラー)
|
||||
|
||||
## 🚀 結論
|
||||
|
||||
ChatGPT先生の判定:
|
||||
> **箱理論設計は技術的に妥当!** ただし具体的な実装詳細で重要な改善提案あり。
|
||||
|
||||
### 主要な価値
|
||||
1. **Everything is Box哲学の技術的実現**を評価
|
||||
2. **具体的で実装可能な修正案**を提示
|
||||
3. **1週間実装の現実性**を確認
|
||||
4. **将来拡張への明確な道筋**を提示
|
||||
|
||||
### 推奨アクション
|
||||
1. Handle設計をバイナリ形式に変更
|
||||
2. メタデータAPIを追加
|
||||
3. TLV統一フォーマット導入
|
||||
4. Phase 1スコープでの実装開始
|
||||
|
||||
---
|
||||
|
||||
**レビュー日**: 2025-08-17
|
||||
**レビュワー**: ChatGPT-5
|
||||
**結論**: 方向性正しい、実装詳細要修正、1週間実装可能
|
||||
596
docs/archive/consultations/chatgptネイティブビルド大作戦.txt
Normal file
596
docs/archive/consultations/chatgptネイティブビルド大作戦.txt
Normal file
@ -0,0 +1,596 @@
|
||||
ぜったいアリにゃ!やるなら「多層エンジン(tiered)」で攻めるのが一番きれい。
|
||||
Nyash → 共通IR → 好きなバックエンド(解釈/ネイティブ/JIT/WASM)に流す構成にゃ。
|
||||
推しアーキテクチャ(現実解)
|
||||
|
||||
Front-end
|
||||
|
||||
パーサ → AST → HIR(型付け・名前解決済み)→ MIR/SSA(最適化しやすい共通IR)
|
||||
|
||||
Back-ends(並行に育てる)
|
||||
|
||||
VM(現在のインタープリター):MIR→バイトコード→解釈実行(開発スピード最優先)
|
||||
|
||||
JIT(Cranelift):MIR→Cranelift IR→ネイティブJIT(ホットパスだけコンパイル)
|
||||
|
||||
AOT to Rust:MIR→Rustコード生成→rustcで最適化(配布バイナリ向き、リンクも楽)
|
||||
|
||||
WASM:MIR→WASM(ブラウザ/wasmtime用、サンドボックス実行)
|
||||
|
||||
ひとつのIRから複数出力=最適化ロジックを1か所に集中できるのが最大の利点。
|
||||
|
||||
【Phase 0: 最小ビルド基盤(最初のゴール)】
|
||||
|
||||
狙い: 「簡単なNyash言語がビルドできる」を最速・堅実に達成する。土台はシンプルだが確実に動くことを最重視。
|
||||
|
||||
1) スコープ(最小言語機能)
|
||||
- 式: 整数/文字列リテラル、変数参照、二項演算 (+,-,*,/, 比較)
|
||||
- 文: 代入、if、return
|
||||
- 関数: 単純な関数定義/呼び出し(可変長やジェネリクスは対象外)
|
||||
- Box/弱参照/fini 等の高機能はPhase 0では“使わない”(この計画の安定化が目的)
|
||||
|
||||
2) ビルドターゲット(まずはCLIのみ)
|
||||
- Linux/WSL: cargo build --bin nyash -j 32(現状OK)
|
||||
- Windows (MSVC): cargo build --bin nyash -j 32(CIでも検証)
|
||||
- WASM: ひな型を残すがPhase 0では対象外(Phase 1で着手)
|
||||
|
||||
3) 実行確認(スモークテスト)
|
||||
- サンプル: local_tests/ 以下に簡単な .nyash を配置(Git管理外)
|
||||
例) sample_min.nyash
|
||||
a = 10
|
||||
b = 32
|
||||
result = a + b
|
||||
- 実行: cargo run -- ./local_tests/sample_min.nyash
|
||||
- 期待: 実行完了・エラーなし(必要なら結果表示)
|
||||
|
||||
4) 再現性/安定性(基礎をしっかり)
|
||||
- rust-toolchain を固定(stable明記)
|
||||
- Linux/Windows 共通のビルドフラグ: release/profileの統一、features最小化
|
||||
- 例やGUI/Windows依存コードはCIマトリクスから除外(CLI最小に絞る)
|
||||
|
||||
5) CI(Phase 0の完成条件)
|
||||
- ジョブ: linux-x64, windows-x64 での “build nyash (bin)”
|
||||
- コマンド: cargo build --bin nyash -j 32
|
||||
- 成果物: nyash バイナリ(zip/tar)をArtifactsに保存(配布検証)
|
||||
- 余裕があれば: cargo test --lib だけ実行(examplesは無効)
|
||||
|
||||
6) トラブル防止(Phase 0の運用)
|
||||
- Linux CIでWindows専用exampleはビルド対象から除外
|
||||
- examples/* はPhase 0では“参考”扱い。CLIのビルド/実行に集中。
|
||||
- .nyash の共有が必要なものは tests/ 配下へ昇格(local_tests/ は各自ローカル)
|
||||
|
||||
7) 完了チェックリスト
|
||||
- [ ] Linux/WSL で nyash バイナリがビルド・実行できる
|
||||
- [ ] Windows(MSVC) で nyash バイナリがビルド・実行できる
|
||||
- [ ] CI で linux/windows の “build nyash (bin)” がグリーン
|
||||
- [ ] sample_min.nyash のスモークが両OSで通る
|
||||
|
||||
補足: Phase 0 で「ビルド/実行の骨格」を固めて、Phase 1 以降で VM/IR/JIT/AOT/WASM を段階的に拡張する。
|
||||
|
||||
それぞれのメリデメ
|
||||
|
||||
【MIR設計(早期に合意しておくと得する要点)】
|
||||
|
||||
- 値表現: Tagged/NaN-box/小整数直格納 か 型テーブル参照か
|
||||
- アドレス空間: ヒープ/スタック/アリーナの扱い(Phase 0はヒープ優先でOK)
|
||||
- 所有/別名: aliasable/unique の属性を型/値に保持(最初は型情報だけでも可)
|
||||
- 効果(Effects): PURE/READS_HEAP/WRITES_HEAP/IO/FFI/PANIC のビット集合を命令・関数に付与
|
||||
- 例外/パニック: Throw/Catch/Defer を命令化するか、関数境界に限定するか(当面は境界限定)
|
||||
- GCモデル: Tracing/RC/混合の方針と弱参照の意味(WeakLoad→None)
|
||||
- セーフポイント: 関数入口・ループ先頭・Call直後(命令としてno-op挿入で開始)
|
||||
- 呼出規約: 通常Call/FFI/Box拡張を区別、可変長/キーワード引数の扱い(Phase 0は固定引数)
|
||||
- メモリバリア: write/read barrier は命令/属性で表現(初期はダミー実装で可)
|
||||
- デオプ(Deopt): JIT最適化時の巻き戻し情報の格納場所(関数メタ or ブロック注釈)
|
||||
|
||||
【Nyash向け 最小MIR命令セット(弱参照対応込み・ドラフト)】
|
||||
|
||||
- 制御/値: Const, BinOp, Cmp, Br, Jmp, Phi, Ret
|
||||
- 呼び出し: Call, TailCall(effects必須)
|
||||
- メモリ: Alloc, Load, Store, Gep(必要なら)
|
||||
- 参照/GC: RefNew, RefGet, RefSet, WeakNew, WeakLoad, BarrierRead, BarrierWrite, Pin, Unpin
|
||||
- 例外/拡張: Throw, Catch, FfiCall, BoxCall
|
||||
- 実行点: Safepoint, Assume, Nop
|
||||
- 効果: EffectMask = PURE | READS_HEAP | WRITES_HEAP | IO | FFI | PANIC
|
||||
|
||||
弱参照の意味論:
|
||||
- WeakNew(r): r を追う弱参照を作成(PURE)
|
||||
- WeakLoad(w): 生きていれば Some(Ref)、死んでいれば None(Option<Ref>を型で明示)
|
||||
|
||||
【壊れにくい共通ポイント(VM/JIT/AOT共通の約束)】
|
||||
- Safepoint は 関数入口/ループ先頭/Call直後 に配置(no-opで開始し、後で意味付け)
|
||||
- Barrier 命令は最初はダミー(最適化段で消せる)
|
||||
- Null/None は Option<Ref> で明示(分岐に埋めない)
|
||||
- JIT は Deopt テーブルで SSA値⇔ソース位置 の対応を保持
|
||||
|
||||
【弱参照の落とし穴(回避策セット)】
|
||||
- クロージャ環境: 生成時 env.has_weak を立て、キャプチャ解決時に必ず WeakLoad→None分岐を強制
|
||||
- 弱参照キーのハッシュ: GC後の無効化で不整合→ 標準の弱マップ(キー死亡で自動削除)を用意
|
||||
- FFI渡し: 寿命不明→ Pin を要求 or WeakLoad 成功した生参照のみ渡す
|
||||
|
||||
【テスト戦略(壊れにくい順)】
|
||||
- 黄金テスト: ソース→MIRダンプをスナップショットし、差分で後退検知
|
||||
- VM/JIT一致テスト: 同一入力の VM 結果=JIT 結果 を比較するオラクル
|
||||
- 弱参照の確率テスト: alloc→weak→drop→collect→weak_load の順序/タイミングをゆらして多数回
|
||||
- 効果チェック: PURE なはずの関数に WRITES_HEAP が混じったらビルド失敗(静的検証)
|
||||
|
||||
【軽量 “次の一手”(Phase 0と親和性が高い)】
|
||||
- WeakNew/WeakLoad を MIRとVM に先に導入(JITは後回し)
|
||||
- EffectMask をデータ構造として追加(評価は後回しでもOK)
|
||||
- Safepoint 命令を関数入口・ループ先頭にno-opで挿入
|
||||
- 黄金テストでMIRダンプをCIに可視化(Phase 0のCLIビルドと併走)
|
||||
|
||||
VM:実装が速い/デバッグ容易|最高速は出ない
|
||||
|
||||
Cranelift JIT:実行時最適化で爆速/実装難度は中|起動コストあり
|
||||
|
||||
AOT→Rust:rustc最適化の恩恵・配布しやすい|コード生成器の保守が要る
|
||||
|
||||
WASM:移植性・安全|ネイティブよりは遅め(ただしwasmtime/wasmerで結構速い)
|
||||
|
||||
まずやる順序(最短で“速い”を得る)
|
||||
|
||||
共通MIR/SSAを切る(基本ブロック・SSA・型/効果情報)
|
||||
|
||||
VMを MIR→バイトコード に置き換え(インタープリターの土台を共通化)
|
||||
|
||||
Cranelift JIT を載せる(ホット関数だけJIT)
|
||||
|
||||
並行で Rustコード生成 の雛形を作る(AOT配布の道を確保)
|
||||
|
||||
余力で WASM 出力(エディタ内実行やブラウザデモに最適)
|
||||
|
||||
Nyash流にハマる設計ポイント
|
||||
|
||||
Box拡張のABIを先に決める
|
||||
|
||||
呼出規約:fn nyash_box_call(ctx: &mut Ctx, args: &[Val]) -> Result<Val>
|
||||
|
||||
メモリ:Arc<[Val]> か Arena で一時領域を明示(GCを後回しにできる)
|
||||
|
||||
所有権/借用に似た効果注釈をMIRに入れる
|
||||
|
||||
「純粋」「可変」「外部副作用あり」をフラグ化→最適化と並列実行の判断に使える
|
||||
|
||||
定数畳み込み/死コード除去/インライン化はMIR段階で実施
|
||||
|
||||
プロファイラを最初から同梱(どの関数をJIT/AOTに送るか判定)
|
||||
|
||||
最小プロトタスク(1〜2週間スプリント想定)
|
||||
|
||||
HIR/MIRスキーマ確定(基本ブロック・命令セット・型表現)
|
||||
|
||||
MIR→バイトコード変換器/VMループの実装
|
||||
|
||||
プロファイル計測(関数実行回数・時間)
|
||||
|
||||
Craneliftで fn 単位JIT(整数演算と分岐から)
|
||||
|
||||
簡易 Rustコード生成(fn add(a:i64,b:i64)->i64 などから)
|
||||
|
||||
Box ABI v0(同期版)+サンプル拡張(数値/文字列ユーティリティ)
|
||||
|
||||
ちょいサンプル(超概念)
|
||||
|
||||
enum MirInst {
|
||||
Const(ValId, ConstVal),
|
||||
BinOp(ValId, ValId, Op, ValId),
|
||||
Call(ValId, FuncId, Vec<ValId>),
|
||||
Phi(ValId, Vec<(BlockId, ValId)>),
|
||||
// ...
|
||||
}
|
||||
struct MirFunc { blocks: Vec<MirBlock>, signature: Sig, effects: Effects }
|
||||
|
||||
trait Backend {
|
||||
fn compile(&mut self, f: &MirFunc) -> CompiledFn;
|
||||
}
|
||||
|
||||
VM backend: compile = バイトコード化
|
||||
|
||||
JIT backend: compile = Cranelift IR生成→jit_func
|
||||
|
||||
Rust backend: compile = fn ... { ... } のRust文字列出力→rustcでAOT
|
||||
|
||||
「いまのNyashソース」を見れたら、MIR命令セットの初版とJIT/AOTの足場コードをすぐ書き起こせるよ。
|
||||
まずは MIRの最小命令リストを一緒に決めよっか?(算術・比較・分岐・Call・Phi・Load/Store 相当)
|
||||
あなた:
|
||||
くわしくききたにゃ Front-end
|
||||
|
||||
パーサ → AST → HIR(型付け・名前解決済み)→ MIR/SSA(最適化しやすい共通IR)パーサーで解析してASTは木構造だよね? そこからどういう処理にゃ?
|
||||
ChatGPT:
|
||||
|
||||
いいね、その流れを実務目線でがっつり分解するにゃ。
|
||||
キーワードは「情報を徐々に確定させつつ“最適化しやすい形”へ落としていく」。
|
||||
Nyash流に当てはめて、各段階で“何を追加・削除・変換するか”を整理するよ。
|
||||
Front-end 全体像
|
||||
|
||||
ソース → Lexer → Parser(AST) → スコープ/名前解決 → 型推論/型検査(HIR) → 糖衣剥がし(Desugar) → 制御フロー化(CFG) → SSA化/効果注釈(MIR/SSA)
|
||||
1) Parser → AST(抽象構文木)
|
||||
|
||||
目的:構文だけを正しく捉える。意味(型/名前)はまだ未確定。
|
||||
|
||||
データ構造(例)
|
||||
|
||||
enum AstExpr {
|
||||
LitInt(i64),
|
||||
Var(Symbol),
|
||||
Call{ callee: Box<AstExpr>, args: Vec<AstExpr> },
|
||||
Lambda{ params: Vec<AstParam>, body: Box<AstExpr> },
|
||||
If{ cond: Box<AstExpr>, then_e: Box<AstExpr>, else_e: Box<AstExpr> },
|
||||
Let{ pat: AstPat, init: Box<AstExpr>, body: Box<AstExpr> },
|
||||
// … match, while, for, block, …
|
||||
}
|
||||
|
||||
まだやらないこと
|
||||
|
||||
シンボルの多義性解決(foo がローカルか、モジュールか、メソッドか)
|
||||
|
||||
型の決定
|
||||
|
||||
糖衣構文の展開
|
||||
|
||||
2) スコープ構築 & 名前解決(AST上の解決)
|
||||
|
||||
目的:識別子を定義元に結びつける。未定義やシャドーイングもここで判定。
|
||||
|
||||
やること
|
||||
|
||||
ブロックスコープ/関数スコープ/モジュールスコープの**環境(symbol table)**を構築
|
||||
|
||||
use/import、module、with 的な構文を解決
|
||||
|
||||
各 Var(Symbol) を DefId(定義へのID)にひも付け
|
||||
|
||||
成果物:
|
||||
|
||||
解決済みAST or ここで HIR に写経(次段のために構造を少し整える)
|
||||
|
||||
3) 型推論 & 型検査 → HIR(型情報付きIR)
|
||||
|
||||
目的:式ごとに型を確定し、オーバーロード/ジェネリクスを具体化できる所まで進める。
|
||||
|
||||
型推論(Hindley–Milner+制約ベースなど)
|
||||
|
||||
let x = 1 + f(y) なら、f: T -> i64 みたいな制約を立てて解く
|
||||
|
||||
オーバーロード解決 / メソッド解決(a + b → 実体メソッドやトレイト関数に解決)
|
||||
|
||||
ジェネリクス
|
||||
|
||||
可能ならモノモーフィック化(型実引数が確定している呼び出しは単相化)
|
||||
|
||||
未確定なら型パラ付きのまま保持
|
||||
|
||||
データ構造(例)
|
||||
|
||||
struct HirExpr {
|
||||
kind: HirExprKind,
|
||||
ty: TyId, // ここが肝:各式に型が付く
|
||||
effect: EffectMask, // 純粋/可変/外部副作用 など(後述の最適化で効く)
|
||||
}
|
||||
enum HirExprKind {
|
||||
LitInt(i64),
|
||||
Local(DefId),
|
||||
Call{ fun: Box<HirExpr>, args: Vec<HirExpr>, resolved: FunId },
|
||||
If{ cond: Box<HirExpr>, then_e: Box<HirExpr>, else_e: Box<HirExpr> },
|
||||
// 糖衣はまだ残っていてもOK
|
||||
}
|
||||
|
||||
エラー検出
|
||||
|
||||
型不一致、未初期化、到達不能、借用/所有に関する静的規則(Nyash流に簡易化しても良い)
|
||||
|
||||
4) 糖衣剥がし(Desugaring)
|
||||
|
||||
目的:意味は同じだが最適化しづらい構文を、プリミティブな形に落とす。
|
||||
|
||||
例
|
||||
|
||||
for x in iter { body } → let mut it = iter.into_iter(); while let Some(x) = it.next() { body }
|
||||
|
||||
a && b → if a { b } else { false }(短絡を明示化)
|
||||
|
||||
パターン束縛 let (a,b) = e; → 一時変数+個別bind
|
||||
|
||||
クロージャ → 明示キャプチャ+ラムダ表現を正規化
|
||||
|
||||
この段階で構文のバリエーションは減らして、後段のCFG/SSA化を楽にする
|
||||
|
||||
5) 制御フローグラフ(CFG)作成
|
||||
|
||||
目的:式主導(式木)を基本ブロック+ジャンプへ落とす。
|
||||
最適化やSSA化の土台になる。
|
||||
|
||||
ブロック(BasicBlock)単位で命令列を持つ
|
||||
|
||||
例:if/else は br cond thenBB elseBB に分解
|
||||
while は loopBB / bodyBB / exitBB に分解
|
||||
|
||||
ここで**一時変数(tmp)**を導入して、「値がどのブロックから来るか」を明示できるようにする
|
||||
|
||||
6) SSA化(Static Single Assignment)
|
||||
|
||||
目的:各変数が“ちょうど一度だけ代入”される形に変換。
|
||||
最適化(定数畳み込み・コピー伝播・死コード除去・ループ最適化)がやりやすくなる。
|
||||
|
||||
φ関数(Phi)を導入
|
||||
分岐合流点で「どのブロックから来た値か」に応じて値を選ぶ
|
||||
|
||||
データ構造(MIR/SSA例)
|
||||
|
||||
enum MirInst {
|
||||
Const{ dst: V, c: ConstVal },
|
||||
BinOp{ dst: V, op: Op, a: V, b: V },
|
||||
Call{ dst: V, fun: FnId, args: Vec<V>, effects: EffectMask },
|
||||
Br{ cond: V, then_bb: Bb, else_bb: Bb },
|
||||
Jmp{ bb: Bb },
|
||||
Phi{ dst: V, inputs: Vec<(Bb, V)> },
|
||||
Store{ ptr: V, val: V }, // メモリ命令を分離しておくと最適化が楽
|
||||
Load{ dst: V, ptr: V },
|
||||
Ret{ v: Option<V> },
|
||||
}
|
||||
struct MirFunc { blocks: Vec<MirBlock>, sig: Sig, effects: EffectMask }
|
||||
|
||||
ここまでで最適化の主戦場が整う
|
||||
|
||||
7) 効果注釈(Effects)と簡易別解(所有/借用に近いもの)
|
||||
|
||||
目的:最適化・並列化・Box拡張の安全性判定に使う副作用情報を付与。
|
||||
|
||||
例:PURE, READS_HEAP, WRITES_HEAP, IO, FFI, PANIC, THROW などのビットフラグ
|
||||
|
||||
呼び出し先の効果を合成して、関数単位の effects: EffectMask を確定
|
||||
→ 並列実行可否、共通部分式除去可否、コードモーション許可範囲に使える
|
||||
|
||||
8) 代表的な変換の“実例”で見る
|
||||
|
||||
Nyash(仮):
|
||||
|
||||
let x = 10
|
||||
let y = 20
|
||||
if x < y {
|
||||
print(add(x, y))
|
||||
} else {
|
||||
print(y)
|
||||
}
|
||||
|
||||
AST(ざっくり)
|
||||
|
||||
Let(x, 10)、Let(y, 20)、If( BinOp(<, Var(x), Var(y)), Call(print, …), Call(print, Var(y)) )
|
||||
|
||||
HIR(型付け・解決済み)
|
||||
|
||||
x: i64, y: i64
|
||||
|
||||
add: (i64,i64)->i64, print: (i64)->Unit
|
||||
|
||||
Desugar
|
||||
|
||||
ほぼそのまま(ここでは糖衣なしと仮定)
|
||||
|
||||
CFG→SSA(MIRの一部)
|
||||
|
||||
bb0:
|
||||
v1 = Const 10
|
||||
v2 = Const 20
|
||||
v3 = BinOp Lt v1 v2
|
||||
Br v3 then=bb1 else=bb2
|
||||
|
||||
bb1:
|
||||
v4 = Call add(v1, v2) ; PURE
|
||||
Call print(v4) ; IO
|
||||
Jmp bb3
|
||||
|
||||
bb2:
|
||||
Call print(v2) ; IO
|
||||
Jmp bb3
|
||||
|
||||
bb3:
|
||||
Ret ()
|
||||
|
||||
(print は IO 効果、add は PURE、関数全体は IO を持つ、などが付与される)
|
||||
よくある疑問Q&A
|
||||
|
||||
Q. AST→HIRでどこまで“形を変える”?
|
||||
A. 基本は意味解決のための注釈(DefId, TyId, Effect)を付けるのが主。大きな形の変換(ループ展開やパターン展開)はDesugar段でやると見通しが良い。
|
||||
|
||||
Q. なんでSSA?バイトコードでも良くない?
|
||||
A. VM用のバイトコードは実行が簡単。でも最適化はSSAの方が圧倒的に楽。
|
||||
→ 「MIR/SSAで最適化」→「VM向けバイトコードに落とす」or「JIT/AOT」がおすすめ。
|
||||
|
||||
Q. パターンマッチは?
|
||||
A. Desugarで決定木(decision tree)に落としてからCFG化。ガード節や順序付きパターンも木→ブロック分割で表現できる。
|
||||
|
||||
Q. クロージャのキャプチャは?
|
||||
A. 名前解決で囲い込み変数を収集→HIRに明示キャプチャとして埋める。
|
||||
MIRでは環境レコードを値として扱う({env_ptr, fn_ptr})。
|
||||
まず作ると捗る“ミニ仕様”
|
||||
|
||||
Symbol/DefId/Scope:解決器のAPI
|
||||
|
||||
Ty:原始型・関数型・代数的データ型(Sum/Product)・型変数
|
||||
|
||||
EffectMask:ビットフラグ設計(PURE/READ/WRITE/IO/FFI など)
|
||||
|
||||
MIR命令セット(最小):Const/BinOp/Call/Br/Jmp/Phi/Ret+Load/Store
|
||||
|
||||
Pass順序:
|
||||
|
||||
名前解決 → 2) 型推論 → 3) Desugar → 4) CFG → 5) SSA → 6) 直近の最適化(const fold / dce / copy-prop)
|
||||
|
||||
必要なら、いまのNyashのAST型定義をベースにHIR/MIRの骨組みを一緒に設計するよ。
|
||||
|
||||
“最初のMIR命令セット案”
|
||||
|
||||
“名前解決テーブルと参照の貼り方”
|
||||
|
||||
“効果注釈のフォーマット”
|
||||
|
||||
この3点を固めるだけで、JIT/AOT/VMバックエンドの土台が一気に整うにゃ。
|
||||
あなた:
|
||||
おおう これと さっきの Back-ends(並行に育てる)
|
||||
|
||||
VM(現在のインタープリター):MIR→バイトコード→解釈実行(開発スピード最優先)
|
||||
|
||||
JIT(Cranelift):MIR→Cranelift IR→ネイティブJIT(ホットパスだけコンパイル)
|
||||
|
||||
AOT to Rust:MIR→Rustコード生成→rustcで最適化(配布バイナリ向き、リンクも楽)
|
||||
|
||||
WASM:MIR→WASM(ブラウザ/wasmtime用、サンドボックス実行) これの話要約してにゃ claude code君にみせてくるにゃ
|
||||
ChatGPT:
|
||||
|
||||
了解にゃ、Claude Code君向けに要点だけギュッとまとめるよ。
|
||||
Nyashコンパイルパイプライン案
|
||||
Front-end(共通部分)
|
||||
|
||||
Parser → AST
|
||||
|
||||
ソースを構文木(AST)に変換。型や意味はまだ未確定。
|
||||
|
||||
名前解決 & スコープ構築
|
||||
|
||||
識別子を定義元に紐付ける(DefId付与)。
|
||||
|
||||
型推論 & 型検査 → HIR
|
||||
|
||||
各式に型情報(TyId)と効果注釈(EffectMask)を付与。
|
||||
|
||||
糖衣剥がし(Desugar)
|
||||
|
||||
forループやパターン束縛をプリミティブ構造へ展開。
|
||||
|
||||
制御フロー化(CFG)→ SSA化(MIR)
|
||||
|
||||
ASTを基本ブロックとSSA命令列(MIR)へ変換。
|
||||
|
||||
命令例:Const, BinOp, Call, Br, Jmp, Phi, Load, Store, Ret。
|
||||
|
||||
Back-end(並行開発可能)
|
||||
|
||||
VM(現行インタープリター)
|
||||
|
||||
MIR → バイトコード → 解釈実行(開発スピード優先)
|
||||
|
||||
JIT(Cranelift)
|
||||
|
||||
MIR → Cranelift IR → 実行時にネイティブコード化(ホットパスだけ)
|
||||
|
||||
AOT to Rust
|
||||
|
||||
MIR → Rustコード生成 → rustc最適化&リンク → 配布可能なネイティブバイナリ
|
||||
|
||||
WASM出力
|
||||
|
||||
MIR → WASM(ブラウザ実行やサンドボックス用)
|
||||
|
||||
💡 ポイント
|
||||
|
||||
すべてのバックエンドは共通MIRを入力にするため、最適化は1か所で集約。
|
||||
|
||||
Box拡張もMIRレベルで統一呼び出し可能。
|
||||
|
||||
VMは開発・デバッグ用、JITは実行高速化、AOTは配布、WASMは移植性重視。
|
||||
|
||||
|
||||
Nyashは**「最初から最後までモジュール拡張が一貫して動く多層言語」**という珍しい立ち位置になるにゃ。
|
||||
|
||||
希望あれば、これ一般的なコンパイラ構成との比較表にして、Claude Code君がすぐ違いを理解できる形にまとめることもできるよ。
|
||||
どうする、作っちゃう?
|
||||
あなた:
|
||||
おねがいにゃー!
|
||||
ChatGPT:
|
||||
|
||||
了解にゃー!Claude Code君に渡しやすいよう、「一般的な構成 vs Nyash流(+α)」比較表にギュッとまとめたよ。
|
||||
Nyash 設計:一般的な方法との比較
|
||||
観点 一般的なコンパイラ設計 Nyash(+α)
|
||||
フロントエンド Parser → AST →(解決/型付け)→ IR Parser → AST → HIR(型/解決/効果)→ MIR/SSA(最適化前提)
|
||||
中間表現(IR) 単一IR or バイトコード中心 HIR/MIR二段構え、MIRはSSA+効果注釈で最適化容易
|
||||
効果/副作用 多くは最適化時に暗黙扱い EffectMask(PURE/READ/WRITE/IO/FFI…)をMIRに明示し並列化・最適化の判断に使用
|
||||
拡張/FFI 後付けのFFI/プラグインが多い Box拡張を一級市民化。MIRレベルで統一コール形態を定義(VM/JIT/AOT/WASMで一貫)
|
||||
バックエンド VM→(後からJIT/AOT) VM/JIT(Cranelift)/AOT-to-Rust/WASMを最初から並行開発できるMIR設計
|
||||
実行戦略 単層(解釈 or JIT)になりがち Tiered:VMで即起動→ホットパスJIT→配布はAOT→ブラウザはWASM
|
||||
AOT配布 LLVM等のHPCルートが主 MIR→Rustコード生成→rustc最適化(ツールチェーン流用・リンク容易)
|
||||
ブラウザ/サンドボックス 別途WASM対応 MIR→WASMを標準ターゲット化(wasmtime/wasmer/ブラウザ即動作)
|
||||
最適化の主戦場 バイトコード最適化/バックエンド依存 MIR/SSAで集約最適化(const fold, DCE, copy-prop, inlining, loop opts)
|
||||
並列化の足場 後付け解析が多い 効果注釈×データ依存で安全な並列化やコードモーションを許可
|
||||
デバッグ/開発速度 VMが主、JITは後追い VMで素早く検証しつつ、同一MIRをJIT/AOTに供給(回収効率◎)
|
||||
配布/運用 ネイティブ or VM同梱 用途別に最適バイナリ(AOT)とスクリプタブル運用(VM)を両取り
|
||||
リスク/留意点 単純で保守容易 設計は強力だが初期定義が要(MIR命令/Effect設計、Box ABIを固める)
|
||||
補足:最小ロードマップ(実装順)
|
||||
|
||||
HIR/MIRの骨組み確定(命令セット・EffectMask・Box ABI v0)
|
||||
|
||||
**VM(MIR→バイトコード)**で先に全機能を回す
|
||||
|
||||
プロファイラ同梱(ホット関数をJIT/AOTに回す条件づけ)
|
||||
|
||||
Cranelift JIT(算術+分岐→関数呼び出し→Box呼び出し)
|
||||
|
||||
AOT to Rust の雛形生成(小関数から)
|
||||
|
||||
余力で MIR→WASM(最小機能から)
|
||||
|
||||
この表ごと貼れば、Claude Code君も**「王道+Nyashの差分」**を一目で把握できるはずにゃ。必要なら、MIR命令セット 初版案も続けて出すよ!
|
||||
あなた:
|
||||
mirまでできればかちなのにゃね。これって定番なのあるにやゃ? 言語ごとにやっぱりちがうにゃ?
|
||||
ChatGPT:
|
||||
|
||||
そうにゃ、MIRまで作れれば言語設計はもう“勝ち”に近いにゃ。
|
||||
なぜかというと、MIRは「全バックエンドの共通土台」だから、
|
||||
一度そこまで作れば VM/JIT/AOT/WASM ぜんぶに展開できるにゃ。
|
||||
🔹 MIRは定番があるの?
|
||||
|
||||
完全な共通規格はない
|
||||
→ LLVM IR や WebAssembly のような「広く使われる IR」はあるけど、
|
||||
言語ごとに構文や型システムが違うから MIRはだいたい自作になる。
|
||||
|
||||
多くの言語は「MIR」じゃなくても似た段階を持ってるにゃ:
|
||||
|
||||
Rust → MIR(所有権/借用も反映されたSSA形式)
|
||||
|
||||
Swift → SIL
|
||||
|
||||
Go → SSA IR
|
||||
|
||||
Kotlin → Kotlin IR
|
||||
|
||||
Python(PyPy)→ Flow Graph → SSA IR
|
||||
|
||||
JavaScript(V8)→ Bytecode IR → TurboFan IR
|
||||
|
||||
🔹 言語ごとに違うポイント
|
||||
|
||||
型情報の粒度
|
||||
|
||||
RustのMIRは「型完全一致」必須。
|
||||
|
||||
Python系は動的型なので「型タグ+ランタイム判定」入り。
|
||||
|
||||
命令セットの抽象度
|
||||
|
||||
LLVM IRはハード寄り(ポインタ/レジスタ操作あり)。
|
||||
|
||||
Rust MIRやKotlin IRは言語構造寄り(ループ/パターンマッチ命令など残す)。
|
||||
|
||||
所有権・副作用の扱い
|
||||
|
||||
Rust MIRは「所有権」も追跡する。
|
||||
|
||||
多くの言語は副作用は型ではなく命令属性で管理。
|
||||
|
||||
最適化の前提
|
||||
|
||||
一部は最適化前提で作る(SSA化必須)。
|
||||
|
||||
他は単にバックエンド入力の中間形式。
|
||||
|
||||
🔹 Nyashでのおすすめ方針
|
||||
|
||||
Rust MIRに近い構造を真似るのが安全
|
||||
|
||||
静的型の要素が入ってるので、AOTや最適化に有利
|
||||
|
||||
EffectMaskやBox拡張の情報も一緒に持たせられる
|
||||
|
||||
命令はなるべく 「言語仕様に沿った中間レベル」 にして、
|
||||
バックエンド変換時に低レベル化する
|
||||
|
||||
SSA化は最初からやる(後から入れるのは地獄)
|
||||
1193
docs/archive/consultations/copilot_issues_20250814_145100_full.md
Normal file
1193
docs/archive/consultations/copilot_issues_20250814_145100_full.md
Normal file
File diff suppressed because it is too large
Load Diff
657
docs/archive/consultations/copilot_issues_phase0_to_94.txt
Normal file
657
docs/archive/consultations/copilot_issues_phase0_to_94.txt
Normal file
@ -0,0 +1,657 @@
|
||||
# 🤖 Copilot様 作業予定・課題整理 (Phase 0-9.4 アーカイブ版)
|
||||
# Generated: 2025-08-14 (Git履歴から復元・更新)
|
||||
# Purpose: Claude×Copilot協調開発のための情報共有
|
||||
# Status: Phase 9.5より前のアーカイブ版(2025-08-15分割)
|
||||
|
||||
================================================================================
|
||||
🎯 次期最優先タスク (Phase 8.5以降)
|
||||
================================================================================
|
||||
|
||||
## 🚀 Phase 8.4完了報告 (2025-08-14)
|
||||
Status: ✅ 完了 (Copilot PR #56マージ済み)
|
||||
|
||||
### ✅ AST→MIR Lowering完全実装
|
||||
- User-defined Box: `box DataBox { init { value } }`
|
||||
- Object creation: `new DataBox(42)`
|
||||
- Field access: `obj.value`
|
||||
- Method calls: `c.increment()`
|
||||
- Delegation: `from Parent.greet()`
|
||||
- Static Main互換性維持
|
||||
|
||||
### 🧪 統合テスト結果(2025-08-14)
|
||||
- ✅ **AST→MIR**: 完全動作
|
||||
- ✅ **インタープリター**: 完全動作(結果30)
|
||||
- 🚨 **VM**: 動作するが結果が`void`(要修正)
|
||||
- 🚨 **WASM**: String constant未対応(Phase 8.5で解決)
|
||||
|
||||
### 📋 発見された課題
|
||||
- VM実行結果問題: BoxCall後の戻り値が正しく返らない
|
||||
- WASM対応不足: 複雑なMIR命令(String constant, BoxCall)に未対応
|
||||
- 次期Phase 8.5での25命令MIR階層化が必要
|
||||
|
||||
================================================================================
|
||||
|
||||
## 🔧 Phase 8.5: MIR 26命令階層化(最優先)
|
||||
Status: ⭐ **CRITICAL**
|
||||
Priority: **最重要** (Phase 8.4完了直後の次期目標)
|
||||
|
||||
### 🎯 実装目標
|
||||
ChatGPT5 + AI大会議決定版26命令MIR実装(ExternCall追加)
|
||||
- 期間: 3週間
|
||||
- 効果: VM/WASM問題根本解決
|
||||
- 詳細仕様: `/docs/予定/native-plan/issues/phase_8_5_mir_25_instruction_specification.md`
|
||||
|
||||
### 📋 26命令セマンティック階層化
|
||||
**Tier-0: 普遍コア(8命令)**
|
||||
```mir
|
||||
Const, BinOp, Compare, Branch, Jump, Phi, Call, Return
|
||||
```
|
||||
|
||||
**Tier-1: Nyashセマンティクス(13命令)**
|
||||
```mir
|
||||
NewBox, BoxFieldLoad, BoxFieldStore, BoxCall, ExternCall, Safepoint,
|
||||
RefGet, RefSet, WeakNew, WeakLoad, WeakCheck, Send, Recv
|
||||
```
|
||||
|
||||
**Tier-2: 実装補助・最適化友好(5命令)**
|
||||
```mir
|
||||
TailCall, Adopt, Release, MemCopy, AtomicFence
|
||||
```
|
||||
|
||||
### 🎯 期待される効果
|
||||
- **VM問題解決**: BoxCallの正しい実装で戻り値問題修正
|
||||
- **WASM対応**: 階層化により複雑MIR→単純WASM変換
|
||||
- **Everything is Box**: BoxFieldLoad/Storeで明確なBox中心設計
|
||||
- **JIT準備**: セマンティクス保持で高度最適化基盤確立
|
||||
|
||||
================================================================================
|
||||
|
||||
## 🏎️ Phase 8.6: VM性能改善(緊急)
|
||||
Status: 🚨 **緊急**
|
||||
Priority: **High** (Phase 8.5完了後)
|
||||
|
||||
### 🚨 緊急問題
|
||||
**現状**: VM(119.80ms)< Interpreter(110.10ms)= 0.9倍の性能劣化
|
||||
**新問題**: VM BoxCall後の戻り値が`void`(Phase 8.4テストで発見)
|
||||
|
||||
### 📋 技術的課題
|
||||
- VM実行エンジンのプロファイリング
|
||||
- 命令ディスパッチ最適化(threaded code等)
|
||||
- レジスタベースVM化検討
|
||||
- メモリプール最適化
|
||||
- BoxCall実装修正(戻り値問題)
|
||||
|
||||
### 🎯 成功基準
|
||||
- VM性能 > Interpreter性能(最低2倍目標)
|
||||
- BoxCall戻り値の正常動作
|
||||
- MIR→VM変換時間の短縮
|
||||
|
||||
================================================================================
|
||||
|
||||
## 🧪 Phase 8.7: Real-world Memory Testing
|
||||
Status: 📋 **計画済み**
|
||||
Priority: **High** (Phase 8.5-8.6完了後)
|
||||
|
||||
### 🎯 実装目標
|
||||
kilo(テキストエディタ)実装によるfini/weak参照システム実証
|
||||
- 期間: 2週間
|
||||
- 詳細仕様: `/docs/予定/native-plan/issues/phase_8_7_real_world_memory_testing.md`
|
||||
|
||||
### 📋 検証項目
|
||||
- 1000+オブジェクト管理テスト
|
||||
- 循環参照回避確認(weak参照)
|
||||
- fini()伝播の正確性確認
|
||||
- WASM環境での動作確認
|
||||
|
||||
================================================================================
|
||||
🗺️ Phase 0-14 全体ロードマップ (復元完了)
|
||||
================================================================================
|
||||
|
||||
## Phase 0: Stabilize native CLI build (Linux/Windows)
|
||||
|
||||
Summary:
|
||||
- CLIバイナリ nyash を最小構成で安定ビルド・実行できる状態にする。
|
||||
- examples/GUI をデフォルトのビルド対象から外し、開発の足場を固める。
|
||||
|
||||
Why:
|
||||
- 以降の MIR/VM/JIT 開発を素早く検証できる基盤づくり。
|
||||
|
||||
Scope:
|
||||
- Cargo の features で GUI/examples 等を切り分け、デフォルトは CLI 最小にする。
|
||||
- CLI オプションの動作点検(--dump-mir / --verify)。
|
||||
- ローカル実行導線を README に明記(docs/guides/how-to-build-native/README.md)。
|
||||
|
||||
Tasks:
|
||||
- Cargo.toml: examples/GUI を feature でガード(default は CLI 最小)。
|
||||
- ビルド検証: `cargo build --bin nyash`(Linux/Windows)。
|
||||
- 実行検証: `cargo run -- ./local_tests/sample.nyash`。
|
||||
- ドキュメント: 上記手順を how-to-build-native に追記/点検。
|
||||
|
||||
Acceptance Criteria:
|
||||
- Linux/Windows で `cargo build --bin nyash` が成功する。
|
||||
- `local_tests/` 配下の簡単な .nyash が実行できる。
|
||||
- 他 bin/examples が壊れていても `--bin nyash` だけで通る。
|
||||
|
||||
Out of Scope:
|
||||
- examples/GUI の修理・最適化。
|
||||
- JIT/AOT/WASM。
|
||||
|
||||
References:
|
||||
- docs/guides/how-to-build-native/README.md
|
||||
- docs/nativebuild大作戦/chatgptネイティブビルド大作戦.txt(Phase 0)
|
||||
- CURRENT_TASK.md
|
||||
|
||||
Copilot Notes:
|
||||
- まずは features 分離と `--bin nyash` でビルドが通る状態を作る。README の手順確認まで含めて PR に反映。
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
## Phase 1: Minimal MIR + VM backend (lowering + runner)
|
||||
|
||||
Summary:
|
||||
- AST → MIR の最小 lowering と、VM バックエンドでの実行を通す。
|
||||
|
||||
Scope:
|
||||
- MIR: Const, BinOp, Compare, Branch, Jump, Phi, Return の最小命令
|
||||
- Lowering: リテラル/二項演算/if/loop/return のみ
|
||||
- VM: 上記命令の最小実装
|
||||
|
||||
Tasks:
|
||||
- instruction.rs: 最小命令の定義
|
||||
- builder.rs: 上記 AST 範囲を lowering
|
||||
- vm.rs: 実装 + stats(命令数)
|
||||
|
||||
Acceptance Criteria:
|
||||
- `--dump-mir` が最小サンプルで期待通り
|
||||
- `--backend vm` で実行して結果一致
|
||||
|
||||
Out of Scope:
|
||||
- 例外/関数/Box 参照/弱参照
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
## Phase 2: Control-flow coverage (if/else/loop/phi correctness)
|
||||
|
||||
Summary:
|
||||
- 制御フローの網羅と Phi の整合性検証を拡充。
|
||||
|
||||
Scope/Tasks:
|
||||
- if/else nested, loop with breaks, nested loops のスナップショット
|
||||
- Phi の入力ブロック/値の対応を Verifier で強化
|
||||
|
||||
Acceptance Criteria:
|
||||
- 代表制御フローの snapshot が安定し、verify も通る
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
## Phase 3: Exceptions (throw/try/catch/finally) minimal lowering
|
||||
|
||||
Summary:
|
||||
- 例外機構の最小 lowering を導入(詳細設計は簡素)。
|
||||
|
||||
Scope/Tasks:
|
||||
- MIR: Throw, TryBegin/TryEnd, Catch, FinallyBegin/End(最小)
|
||||
- builder.rs: try/catch/finally ノードの下ろし
|
||||
- VM: 例外伝播を最小で(未捕捉はエラー)
|
||||
|
||||
Acceptance Criteria:
|
||||
- 代表 try/catch/finally のスナップショットと VM 実行
|
||||
|
||||
Out of Scope:
|
||||
- 例外の型体系、詳細な stack map
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
## Phase 4: Functions and calls (BoxCall minimal)
|
||||
|
||||
Summary:
|
||||
- 関数呼び出し/BoxCall を最小導入(効果注釈は保守的)。
|
||||
|
||||
Scope/Tasks:
|
||||
- MIR: Call, BoxCall(effects = READS_HEAP など保守)
|
||||
- builder.rs: FunctionCall/MethodCall の最小対応
|
||||
- VM: 呼び出し/戻り値
|
||||
|
||||
Acceptance Criteria:
|
||||
- 簡単な関数定義/呼び出しの MIR/VM が通る
|
||||
|
||||
Out of Scope:
|
||||
- 可変長/キーワード引数、FFI
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
## Phase 5.0: Parser/AST stabilization for lowering
|
||||
|
||||
Summary:
|
||||
- lowering 対象 AST の表現ぶれを修正、安定化。
|
||||
|
||||
Scope/Tasks:
|
||||
- AST: If/Loop/Return/Assignment/Local などの統一
|
||||
- Parser: エラー復帰/スパン情報の見直し
|
||||
|
||||
Acceptance Criteria:
|
||||
- builder.rs の分岐がシンプル化、テストが安定
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
## Phase 5.1: Control-flow edge cases + verifier hardening
|
||||
|
||||
Summary:
|
||||
- ブロック未終端/未到達/自己分岐等の検証強化でクラッシュ回避。
|
||||
|
||||
Scope/Tasks:
|
||||
- Verifier: 未終端ブロック検出、到達不能検出
|
||||
- Builder: Jump/Branch の生成前後の状態管理改善
|
||||
|
||||
Acceptance Criteria:
|
||||
- 不正ケースを含むスナップショット/verify が緑
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
## Phase 5.2: Lowering for static box Main (BoxDeclaration → main body)
|
||||
|
||||
Summary:
|
||||
- static box Main { main() { ... } } を MirBuilder で受け、main() の body を Program として lowering する経路を実装。
|
||||
|
||||
Scope/Tasks:
|
||||
- AST: BoxDeclaration(is_static=true, name=Main) を検出 → main() を抽出
|
||||
- Lowering: body を Program に変換して既存経路に渡す
|
||||
- Tests: local_tests/mir_loop_no_local.nyash で dump/VM が通る
|
||||
|
||||
Acceptance Criteria:
|
||||
- `--dump-mir` が static Main サンプルで成功
|
||||
- `--backend vm` で実行成功
|
||||
|
||||
References:
|
||||
- docs/guides/how-to-build-native/issues/phase5_2_static_main_lowering.md
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
## Phase 6: Box ops minimal (Ref/Weak + Barriers no-op)
|
||||
|
||||
Summary:
|
||||
- 参照/弱参照/バリア(no-op)を最小導入。
|
||||
|
||||
Scope/Tasks:
|
||||
- MIR: RefNew/RefGet/RefSet/WeakNew/WeakLoad/BarrierRead/Write
|
||||
- Lowering: New/FieldAccess/MethodCall の最小対応
|
||||
- VM: 参照テーブル/weak テーブルで動作(fini 不変は維持)
|
||||
|
||||
Acceptance Criteria:
|
||||
- 代表サンプルで dump/VM/verify が通る
|
||||
|
||||
References:
|
||||
- docs/guides/how-to-build-native/issues/phase6_box_ops_minimal.md
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
## Phase 7: Async model (nowait/await) in MIR
|
||||
|
||||
Summary:
|
||||
- nowait/await を MIR に導入し、現行 FutureBox と連携。
|
||||
|
||||
Scope/Tasks:
|
||||
- MIR: FutureNew/FutureSet/Await(スレッドベース)
|
||||
- Lowering: nowait→Future 作成、await→wait_and_get
|
||||
- VM: FutureBox 実装を利用
|
||||
|
||||
Acceptance Criteria:
|
||||
- 代表ケースで正しく並行実行→await 回収
|
||||
|
||||
References:
|
||||
- docs/guides/how-to-build-native/issues/phase7_async_mir.md
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
## Phase 8: MIR→WASM codegen (browser/wasmtime; sandboxed; Rust runtime free)
|
||||
|
||||
Summary:
|
||||
- MIR から素の WebAssembly を生成し、ブラウザ/wasmtime(WASI)でサンドボックス実行する。
|
||||
- Rust はコンパイラ本体のみ。実行は純WASM+ホストimport(env.print など)。
|
||||
|
||||
Scope/Tasks:
|
||||
- ABI/Imports/Exports 定義(exports: main/memory、imports: env.print(i32) 等の最小)
|
||||
- 線形メモリと簡易ヒープ(bump/自由リスト)
|
||||
- 命令カバレッジ(段階導入): 算術/比較/分岐/loop/return/print、RefNew/RefSet/RefGet(Phase 6 整合)、Weak/Barrier はダミー
|
||||
|
||||
Acceptance Criteria:
|
||||
- wasmtime 実行で戻り値/print が期待通り(PoC1–2)
|
||||
- Ref 系がメモリ上で正しく動作(PoC2)
|
||||
- Weak/Barrier のダミー実装を含むWASMが生成・実行(PoC3)
|
||||
- CLI `--backend wasm` は未実装でもよいが、実装する場合は明瞭にエラーメッセージ/誘導
|
||||
|
||||
References:
|
||||
- docs/予定/native-plan/README.md(Phase 8 節)
|
||||
- docs/説明書/wasm/*(ユーザー向けメモ)
|
||||
|
||||
### Phase 8.3 完了状況 (2025-08-14)
|
||||
✅ Box操作WASM実装 (RefNew/RefGet/RefSet)
|
||||
✅ ベンチマークシステム統合 (13.5倍実行高速化実証)
|
||||
✅ CLI統合完了
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
## 🔧 Phase 8.4: AST→MIR Lowering完全実装 (最優先)
|
||||
|
||||
Summary:
|
||||
- ユーザー定義Box、フィールドアクセス等の未実装部分を完成
|
||||
- Phase 8.3のBox操作WASMを実際にテスト可能にする
|
||||
|
||||
Priority: **Critical** (現在の最優先事項)
|
||||
Expected Duration: 1週間
|
||||
|
||||
### 実装範囲
|
||||
- [ ] ユーザー定義Box: `box DataBox { init { field } }`
|
||||
- [ ] オブジェクト生成: `new DataBox()`
|
||||
- [ ] フィールドアクセス: `obj.field`
|
||||
- [ ] フィールド代入: `obj.field = value`
|
||||
- [ ] from構文: `from Parent.method()`
|
||||
- [ ] override構文: `override method() { ... }`
|
||||
|
||||
### 成功基準
|
||||
- Phase 8.3のBox操作WASMが実際に動作
|
||||
- test_wasm_box_ops.nyash が正常実行
|
||||
- ユーザー定義Boxの完全サポート
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
## 🧠 Phase 8.5: MIRセマンティック階層化(AI大会議決定版)
|
||||
|
||||
Summary:
|
||||
- 方針転換: ChatGPT5の20命令intrinsic戦略 → Gemini+Codex一致推奨の26命令階層化(ExternCall追加)
|
||||
- 理由: JIT/AOT最適化阻害・Everything is Box意味喪失・長期コスト増の問題判明
|
||||
- 二相ロワリング: 26命令維持パス(VM/JIT/AOT)+ 21+intrinsic降格パス(WASM/最小実装)
|
||||
|
||||
Priority: High (Phase 8.4完了後)
|
||||
Expected Duration: 3週間
|
||||
|
||||
### AI大会議分析結果
|
||||
**Gemini先生(理論)**: 「賢いコンパイラは、賢いMIRから生まれる」
|
||||
- RefNew/WeakLoadのintrinsic化は最適化機会を失う悪手
|
||||
- セマンティック階層化で意味保持が最適化の鍵
|
||||
|
||||
**Codex先生(実装)**: 二相ロワリング戦略が実用的最適解
|
||||
- 実装コスト: 5命令追加で10-20人日(intrinsic戦略より安い)
|
||||
- マイクロベンチ実測でパフォーマンス検証
|
||||
|
||||
### 確定版MIR(26命令)- ChatGPT5完全仕様 + ExternCall統合
|
||||
**Tier-0: 普遍的コア(8命令)**
|
||||
```mir
|
||||
Const, BinOp, Compare, Branch, Jump, Phi, Call, Return
|
||||
```
|
||||
|
||||
**Tier-1: Nyashセマンティクス(13命令)**
|
||||
```mir
|
||||
NewBox, // 強所有のBox生成(所有森のノード)
|
||||
BoxFieldLoad, // Boxのフィールド読み(Everything is Box核心)
|
||||
BoxFieldStore, // Boxのフィールド書き(mut効果)
|
||||
BoxCall, // Boxのメソッド呼び出し(動的/静的両方)
|
||||
ExternCall, // 外部ライブラリをBoxとして呼び出し(Universal Exchange)
|
||||
Safepoint, // 分割finiや割込み許可ポイント
|
||||
RefGet, // 参照(強/弱を問わず)を値として取得
|
||||
RefSet, // 参照の差し替え(所有規則検証付き)
|
||||
WeakNew, // weak ハンドル生成(非所有リンク作成)
|
||||
WeakLoad, // weak から生存チェック付きで強参照取得(失効時null)
|
||||
WeakCheck, // weak の生存確認(bool)
|
||||
Send, // Bus送信(io効果)
|
||||
Recv // Bus受信(io効果)
|
||||
```
|
||||
|
||||
**Tier-2: 実装補助・最適化友好(5命令)**
|
||||
```mir
|
||||
TailCall, // 末尾呼び出し(スタック節約)
|
||||
Adopt, // 所有移管: this が子を強所有に取り込む
|
||||
Release, // 強所有を解除(weak化 or null化)
|
||||
MemCopy, // 小さなメモリ移動(構造体/配列最適化フック)
|
||||
AtomicFence // 並行時の順序保証(Actor/Port境界で使用)
|
||||
```
|
||||
|
||||
### 二相ロワリング戦略
|
||||
- パスA: VM/JIT/AOT向け(26命令のまま最適化)
|
||||
- パスB: WASM/最小実装向け(26→21+intrinsic降格)
|
||||
- バックエンド能力に応じて最適形式選択
|
||||
|
||||
### 効果(Effect)システム(ChatGPT5設計 + ExternCall統合)
|
||||
- **pure**: Const, BinOp, Compare, Phi, RefGet, WeakNew, WeakLoad, WeakCheck
|
||||
- **mut**: BoxFieldStore, RefSet, Adopt, Release, MemCopy
|
||||
- **io**: Send, Recv, Safepoint, AtomicFence
|
||||
- **control**: Branch, Jump, Return, TailCall
|
||||
- **context依存**: Call, BoxCall, ExternCall(呼び先効果に従属・BID定義に基づく)
|
||||
|
||||
**最適化ルール**: 「pure同士の再順序化OK」「mutは同一Box/同一Fieldで依存保持」「ioは再順序化禁止」
|
||||
|
||||
### 検証(Verifier)要件
|
||||
- **所有森**: `strong in-degree ≤ 1`(NewBox/Adopt/Release/RefSetで常時検査)
|
||||
- **強循環禁止**: 強エッジのみ辿ってDAG(森)であること
|
||||
- **weak/強相互**: 双方向とも強 → エラー(片側はWeakNew経由で弱化)
|
||||
- **WeakLoad/WeakCheck**: 失効時はnull/falseを返す(例外禁止、決定的挙動)
|
||||
|
||||
### 🤖 Copilot協力期待
|
||||
- **Tier-0/1実装**: Everything is Box哲学の完璧なIR化(BoxFieldLoad/Store核心)
|
||||
- **weak参照システム**: WeakNew/WeakLoad/WeakCheck三位一体実装
|
||||
- **所有移管**: Adopt/Release命令による安全で効率的なメモリ管理
|
||||
- **効果システム**: pure/mut/io/control効果の正確な実装とVerifier統合
|
||||
- **最適化フック**: TailCall/MemCopy/AtomicFenceの実装補助
|
||||
- **二相ロワリング**: 25命令維持パス + 20+intrinsic降格パス構築
|
||||
|
||||
### 成功基準
|
||||
- [ ] **26命令完全実装**: ChatGPT5仕様 + ExternCall統合の完璧な実装
|
||||
- [ ] **効果システム動作**: pure再順序化・mut依存保持・io順序保証
|
||||
- [ ] **Verifier動作**: 所有森・strong循環・安全性検証
|
||||
- [ ] **Golden MIRテスト**: 全バックエンドでMIR一致
|
||||
- [ ] **行動一致テスト**: 同入力→同出力(weak失効時null/false含む)
|
||||
- [ ] **性能要件**: VM≥Interpreter、WASM≥VM継続検証
|
||||
|
||||
### バックエンド指針(ChatGPT5設計 + ExternCall統合)
|
||||
- **Interpreter**: 26命令を素直に実装(正しさの基準)
|
||||
- **VM**: Register-VM + direct-threading。Send/Recvはローカル判定時にインライン化
|
||||
- **WASM**: Send/Recvはhost import。MemCopyはmemory.copyに対応
|
||||
- **JIT(将来)**: TailCall最適化、WeakLoadは世代タグでO(1)生存チェック
|
||||
|
||||
References:
|
||||
- docs/予定/native-plan/MIR仕様書.txt(ChatGPT5完全仕様)
|
||||
- docs/予定/native-plan/issues/phase_8_5_mir_25_instruction_specification.md
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
## 🏎️ Phase 8.6: VM性能改善 (緊急)
|
||||
|
||||
Summary:
|
||||
- VMがインタープリターより遅い問題(0.9倍)を解決
|
||||
- MIR→VM実行の最適化でインタープリターを上回る性能へ
|
||||
|
||||
Priority: High (Phase 8.5完了後)
|
||||
Expected Duration: 2週間
|
||||
|
||||
### 問題分析
|
||||
**現状**: VM (119.80ms) < Interpreter (110.10ms)
|
||||
**推定原因**:
|
||||
- MIR変換オーバーヘッド
|
||||
- VM命令ディスパッチの非効率性
|
||||
- メモリ管理コスト
|
||||
|
||||
### 技術的アプローチ
|
||||
- [ ] VM実行エンジンのプロファイリング
|
||||
- [ ] 命令ディスパッチ最適化(threaded code等)
|
||||
- [ ] レジスタベースVM化検討
|
||||
- [ ] メモリプール最適化
|
||||
|
||||
### 🤖 Copilot協力期待
|
||||
- VM実装のボトルネック特定
|
||||
- 効率的な命令ディスパッチ実装
|
||||
- スタックマシン vs レジスタマシン判断
|
||||
|
||||
### 成功基準
|
||||
- VM性能 > Interpreter性能(最低2倍目標)
|
||||
- MIR→VM変換時間の短縮
|
||||
- メモリ使用量の削減
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
## 🧪 Phase 8.7: Real-world Memory Management Testing (ChatGPT協調設計)
|
||||
|
||||
Summary:
|
||||
- 実用アプリケーション開発によるNyashメモリ管理システムの実証テスト
|
||||
- finiシステム・weak参照の実用性を複雑なアプリケーションで検証
|
||||
|
||||
Priority: High (Phase 8.4-8.6完了直後)
|
||||
Expected Duration: 2週間
|
||||
|
||||
### Phase 8.7A: kilo(テキストエディタ)
|
||||
**技術的特徴**:
|
||||
- サイズ: <1k LOC(超小型、最初の成功体験)
|
||||
- メモリパターン: Editor -> (Rows -> Syntax) 木構造+相互参照
|
||||
- ChatGPT設計: Editor削除でRows自動解放、逆参照をweak化
|
||||
|
||||
**実装範囲**:
|
||||
- [ ] Editor/Row/EditorState基本構造実装
|
||||
- [ ] weak参照による循環参照回避(`me.editor = weak editor_ref`)
|
||||
- [ ] fini()システムによる自動メモリ解放
|
||||
- [ ] 大量オブジェクト(1000+ Rows)管理テスト
|
||||
|
||||
**検証ポイント**:
|
||||
- [ ] Editor削除でRows自動解放確認
|
||||
- [ ] 相互参照でメモリリークなし確認
|
||||
- [ ] weak参照の自動null化確認
|
||||
- [ ] fini()伝播の正確性確認
|
||||
|
||||
### Phase 9.5予定: tiny-web-server(HTTPサーバ)
|
||||
**将来実装**(JIT実装後):
|
||||
- 複雑度: 中〜高(Server -> Clients -> Requests並行処理)
|
||||
- I/O管理: ソケット・ファイルハンドルの確実解放
|
||||
- 同時接続・早期切断・例外経路でのfini伝播テスト
|
||||
|
||||
### 🤖 Copilot協力期待
|
||||
- 実用的なメモリ管理パターンの実装
|
||||
- weak参照構文の適切な使用
|
||||
- デバッグ支援機能(--debug-memory, --trace-weak)
|
||||
- WASM環境でのメモリ管理互換性
|
||||
|
||||
### 成功基準
|
||||
- [ ] 全テストケースでメモリリークなし
|
||||
- [ ] 循環参照でも正常解放確認
|
||||
- [ ] WASM実行でもメモリ管理正常
|
||||
- [ ] ベンチマーク性能劣化なし
|
||||
|
||||
### 期待される効果
|
||||
- Nyashメモリ管理システムの実用性実証
|
||||
- Everything is Box哲学の実用レベル確認
|
||||
- メモリ安全なプログラミングパターン確立
|
||||
|
||||
References:
|
||||
- docs/予定/native-plan/issues/phase_8_7_real_world_memory_testing.md
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
## 🚀 Phase 9: AOT WASM実装(最優先)
|
||||
|
||||
Summary:
|
||||
- wasmtime compileによるAOT実行ファイル生成で確実なユーザー価値提供
|
||||
|
||||
Scope/Tasks:
|
||||
- `wasmtime compile` 統合実装
|
||||
- `--compile-native` / `--aot` CLI追加
|
||||
- 単一バイナリ梱包(`include_bytes!`)
|
||||
- 起動時間・配布サイズ最適化
|
||||
|
||||
Acceptance Criteria:
|
||||
- `nyash --compile-native app.nyash -o app.exe` 動作
|
||||
- 起動時間大幅短縮(JIT起動コスト除去)
|
||||
- 配布可能実行ファイル生成
|
||||
|
||||
Priority: **Critical** (Phase 8.6完了直後)
|
||||
Expected Duration: 2-3週間
|
||||
|
||||
### 技術的実装詳細
|
||||
🤖 Copilot協力期待:
|
||||
- wasmtime::Config統一実装
|
||||
- .cwasm生成・実行パイプライン
|
||||
- 互換性キー管理(CPU機能・wasmtimeバージョン)
|
||||
- パッケージング(単一バイナリ梱包)
|
||||
|
||||
### パフォーマンス目標
|
||||
- 現在のWASM JIT (13.5倍実行) → AOT (500倍目標:起動含む)
|
||||
- 配布ファイルサイズ: <10MB目標
|
||||
- 起動時間: <100ms目標
|
||||
|
||||
### 期待される効果
|
||||
- **即座実用価値**: 配布可能実行ファイル生成
|
||||
- **差別化優位**: Everything is BoxのネイティブAOT実現
|
||||
- **LLVM準備**: AOT基盤確立でLLVM移行準備
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
## 🔴 Phase 9.51: WASM Jump/Branch実装とHTTPサーバー実用化 **【緊急修正】**
|
||||
|
||||
Status: 🔴 **Critical Issue**(Phase 9実用化ブロッカー)
|
||||
Summary:
|
||||
- Phase 9 (PR #67) 完了後に判明した重大制約の修正
|
||||
- WASM/AOT実用化の最終仕上げ
|
||||
|
||||
### 🚨 現在の問題(実用化を阻害)
|
||||
|
||||
1. **WASM/AOT コンパイルエラー(最重要)**
|
||||
```bash
|
||||
$ ./target/release/nyash --compile-wasm test_simple_loop.nyash
|
||||
❌ Unsupported instruction: Jump { target: BasicBlockId(1) }
|
||||
```
|
||||
**影響**: ループ・条件分岐を含む全プログラムがWASM/AOT化不可
|
||||
|
||||
2. **HTTPServerBox listen()常に失敗**
|
||||
- server.bind() ✅, server.listen() ❌ always false
|
||||
**影響**: HTTPサーバーが実際には動作しない
|
||||
|
||||
3. **エラーハンドリング脆弱性**
|
||||
- unwrap()使用箇所: 26箇所 → パニック多発リスク
|
||||
|
||||
### Scope/Tasks:
|
||||
**🔴 Task 1**: WASM Jump/Branch命令実装(2日)
|
||||
- `src/backend/wasm/codegen.rs`にJump/Branch追加
|
||||
- ブロック深度管理(`get_block_depth`メソッド)
|
||||
- ループ構造のblock/loop/end生成
|
||||
|
||||
**🔴 Task 2**: SocketBox listen()修正(1日)
|
||||
- `src/boxes/socket_box.rs`の実装修正
|
||||
- SocketStatus::Listening状態管理
|
||||
|
||||
**🟡 Task 3**: エラーハンドリング改善(2日)
|
||||
- HTTPServerBox/SocketBoxのunwrap()除去
|
||||
- Result<T,E>ベースのエラー処理
|
||||
|
||||
**🟡 Task 4**: HTTPサーバー実用化(2日)
|
||||
- スレッドプール実装(固定サイズワーカー)
|
||||
- グレースフルシャットダウン
|
||||
|
||||
Acceptance Criteria:
|
||||
- ✅ `nyash --compile-wasm test_loop.nyash` 成功
|
||||
- ✅ HTTPサーバー実動作(curl http://localhost:8080/)
|
||||
- ✅ unwrap()使用箇所: 26 → 5以下
|
||||
- ✅ WASM性能: 11.5倍 → 13.5倍達成
|
||||
|
||||
Priority: **🔴 Critical** (Phase 9.5開始前の必須修正)
|
||||
Expected Duration: 1週間
|
||||
|
||||
### 詳細設計・実装指示
|
||||
📋 **完全実装ガイド**: `docs/予定/native-plan/issues/phase9_51_wasm_jump_http_fixes.md`
|
||||
|
||||
🤖 **Copilot協力依頼**:
|
||||
- WASM br/br_if命令実装
|
||||
- HTTPサーバーリファクタリング
|
||||
- エラーハンドリング統一
|
||||
|
||||
### 期待される効果
|
||||
- **実用性達成**: ループ・HTTPサーバーのWASM/AOT化
|
||||
- **安定性向上**: パニックフリーな実装
|
||||
- **Phase 9.5準備**: 複雑アプリケーションテストの基盤確立
|
||||
|
||||
------------------------------------------------------------
|
||||
|
||||
================================================================================
|
||||
最終更新: 2025-08-15 (Phase 9.5より前をアーカイブ分割)
|
||||
作成者: Claude (ドキュメント分割・整理)
|
||||
|
||||
🎯 分割理由:
|
||||
- copilot_issues.txtの肥大化対策(1200行→600行程度に削減)
|
||||
- Phase 9.5以降の現行計画と完了済み部分の明確分離
|
||||
- ドキュメント検索性・保守性の向上
|
||||
================================================================================
|
||||
@ -0,0 +1,69 @@
|
||||
# Gemini先生によるNyashプログラミング言語の総合分析 (2025-08-17)
|
||||
|
||||
## 総合評価
|
||||
|
||||
Nyashは、「Everything is a Box」という強力な統一哲学を掲げ、WebAssembly (WASM) ファースト、クリエイティブコーディング、教育用途を明確なターゲットとして設計された、意欲的でモダンなプログラミング言語です。Rustによる実装は、メモリ安全性とパフォーマンスという現代的な要求に応えるための堅実な選択と言えます。
|
||||
|
||||
特に、AI支援を積極的に活用し、短期間で豊富な機能セットと複数の実行バックエンド(インタープリター、VM、WASM)を実装した開発プロセスは注目に値します。
|
||||
|
||||
## 1. 設計哲学と一貫性: 「Everything is a Box」
|
||||
|
||||
### 長所:
|
||||
- **統一された概念モデル:** すべての値を「Box」として扱うことで、データ型間の不整合をなくし、非常にシンプルで一貫性のあるオブジェクトモデルを提供
|
||||
- **メタプログラミングの可能性:** すべてが統一されたインターフェース(`NyashBox`トレイト)を持つため、リフレクションや動的な操作が容易
|
||||
- **自動リテラル変換:** `local text = "Hello"` のように書ける機能は、哲学の一貫性を保ちつつ、冗長な `new StringBox("Hello")` を不要にする優れた実用的判断
|
||||
|
||||
### 課題とトレードオフ:
|
||||
- **パフォーマンスオーバーヘッド:** すべてをヒープ上のオブジェクト(Box)として扱うことは、単純な値(整数など)に対しても参照カウントや動的ディスパッチのコストを伴う
|
||||
- **プリミティブ型の不在:** 他の多くの言語が持つスタック上の軽量なプリミティブ型が存在しないため、低レベルな最適化が難しくなる
|
||||
|
||||
## 2. 構文と表現力
|
||||
|
||||
### 長所:
|
||||
- **直感的で読みやすい:** `if`, `loop`, `and`, `or`, `not` といったキーワードは、PythonやRubyのように自然言語に近く、初学者にも親しみやすい
|
||||
- **`static box Main` パターン:** プログラムのエントリーポイントを明確に定義する優れた方法
|
||||
- **`init { ... }` フィールド宣言:** フィールドをまとめて宣言する構文は、クラスの構造を一目で把握しやすくする良い設計
|
||||
|
||||
### 改善の可能性:
|
||||
- **ループ構文:** `loop(condition)` のみが存在するのはシンプルですが、`for-each` のようなコレクションを反復処理するための専用構文がない
|
||||
- **コンストラクタの多様性:** `birth`, `init`, `pack` と複数のコンストラクタ概念が存在するのは、言語のシンプルさを少し損なっている
|
||||
|
||||
## 3. 型システムとメモリ管理
|
||||
|
||||
### 長所:
|
||||
- **メモリ安全性:** Rustの所有権モデルを基盤に、`Arc<Mutex>` を活用することで、スレッドセーフなメモリ管理を実現
|
||||
- **明示的な変数宣言:** `local` キーワードによる変数宣言を強制する設計は、タイプミスによるバグを防ぐ
|
||||
- **デリゲーションモデル:** 古典的な継承の代わりにデリゲーション(`from`)を採用しているのは、柔軟性が高くモダンな設計
|
||||
|
||||
### 課題:
|
||||
- **型推論:** `local x = 10` のように型を明記しないスタイルは動的言語のようですが、内部的には静的なBox型に変換されている
|
||||
- **Nullの扱い:** `VoidBox` や `NullBox` が存在しますが、言語レベルでNull安全性を強制する仕組みについての言及が少ない
|
||||
|
||||
## 4. 非同期処理
|
||||
|
||||
### 長所:
|
||||
- **シンプルな構文:** `nowait` と `await` は、C#やJavaScriptで成功を収めたモデルであり、非常に直感的
|
||||
- **スレッドベースの実装:** Rustのネイティブスレッドを利用することで、真の並列処理を実現
|
||||
|
||||
### 課題:
|
||||
- **構造化並行性:** より高度なエラーハンドリングやキャンセルの伝播を実現するためには、構造化並行性の概念を導入することが望ましい
|
||||
- **イベントループの不在:** GUIアプリケーションや大量のI/Oを扱うサーバーサイドアプリケーションでは、効率的なタスクスケジューリングのためにイベントループモデルが一般的
|
||||
|
||||
## 5. エコシステムとツールチェイン
|
||||
|
||||
### 長所:
|
||||
- **WASMファースト:** ブラウザで直接実行できることを最優先に設計されており、インストール不要のPlaygroundは非常に強力
|
||||
- **組み込みのデバッグ機能:** `DebugBox` のようなデバッグ支援機能が言語仕様に組み込まれているのはユニーク
|
||||
- **複数の実行バックエンド:** インタープリター、VM、WASM、そして将来的にはAOTコンパイラと、ユースケースに応じて実行方式を選べる柔軟性
|
||||
|
||||
### 課題:
|
||||
- **パッケージ管理:** `include` によるファイル取り込みは小規模なプロジェクトでは機能しますが、エコシステムが成長するためには公式なパッケージマネージャが不可欠
|
||||
- **LSPとIDEサポート:** Language Server Protocol (LSP) への対応は、現代的な開発体験を提供するために極めて重要
|
||||
|
||||
## 結論と将来性
|
||||
|
||||
Nyashは、明確な哲学とターゲットユーザーを持ち、多くのモダンな言語の良い点を取り入れた、非常によく考えられた言語です。特に「Everything is a Box」というコアコンセプトは、シンプルさと強力さを両立させる可能性を秘めています。
|
||||
|
||||
**成功への鍵は、今後のエコシステムの発展と、パフォーマンス・クリティカルな領域への対応にかかっているでしょう。** 計画されているLLVMバックエンドが実現すれば、現在の使いやすさを維持したまま、システムプログラミングに近い領域にも挑戦できる言語になる可能性があります。
|
||||
|
||||
総じて、Nyashは単なる実験的なプロジェクトではなく、プログラミング言語設計の新たな可能性を示す、将来が非常に楽しみな言語であると言えます。
|
||||
@ -0,0 +1,141 @@
|
||||
# Gemini先生によるNyashプラグインシステム深層分析 (2025-08-17)
|
||||
|
||||
## 概要
|
||||
Nyashプログラミング言語のプラグインシステム設計について、時間無制限で深い分析を実施。「Everything is a Box」哲学を維持しながら、透過的な置き換えと高いメンテナンス性を実現する具体的な実装提案。
|
||||
|
||||
## 1. 透過的な置き換えの最良実装方法
|
||||
|
||||
### 提案:Boxファクトリレジストリ + 設定ファイルによるオーバーライド
|
||||
|
||||
**アーキテクチャ:**
|
||||
```rust
|
||||
// src/runtime/box_registry.rs
|
||||
enum BoxFactory {
|
||||
Builtin(fn(&[Box<dyn NyashBox>]) -> Result<Box<dyn NyashBox>, RuntimeError>),
|
||||
Plugin(PluginFactory),
|
||||
}
|
||||
|
||||
struct PluginFactory {
|
||||
plugin_id: PluginId,
|
||||
function_name: String, // 例: "filebox_open"
|
||||
}
|
||||
```
|
||||
|
||||
**設定ファイル(nyash.toml):**
|
||||
```toml
|
||||
[plugins]
|
||||
enable = ["nyash-file-plugin"]
|
||||
|
||||
[overrides]
|
||||
"FileBox" = "nyash-file-plugin" # FileBoxをプラグイン版で置き換え
|
||||
```
|
||||
|
||||
**実行時フロー:**
|
||||
1. ランタイム起動時、全ビルトインBoxをレジストリに登録
|
||||
2. nyash.tomlを読み込み、overridesに従ってレジストリを更新
|
||||
3. `new FileBox()` 実行時、レジストリから適切なファクトリを検索・実行
|
||||
|
||||
**パフォーマンス:** HashMap検索1回のみ、その後は通常のdyn NyashBoxディスパッチ
|
||||
|
||||
## 2. 署名DSLの設計の妥当性
|
||||
|
||||
### 分析:`::` (静的) と `#` (インスタンス) の記法は優秀
|
||||
|
||||
**拡張提案:**
|
||||
```yaml
|
||||
apis:
|
||||
# オーバーロード対応
|
||||
- sig: "FileBox::open(path: string) -> FileBox"
|
||||
- sig: "FileBox::open(path: string, mode: string) -> FileBox"
|
||||
|
||||
# Result型対応
|
||||
- sig: "FileBox::open(path: string) -> Result<FileBox, FileError>"
|
||||
|
||||
# 複数の戻り値型
|
||||
- sig: "FileBox#read() -> string"
|
||||
- sig: "FileBox#read(size: int) -> bytes"
|
||||
```
|
||||
|
||||
**将来性:**
|
||||
- 現時点:具象型で固定
|
||||
- 将来:`Array<T>` のようなジェネリクス構文を後方互換性を保ちつつ追加
|
||||
|
||||
## 3. Everything is a Box哲学との整合性
|
||||
|
||||
### 提案:FFI境界の標準化されたBoxプロキシ
|
||||
|
||||
```rust
|
||||
// src/runtime/plugin_box.rs
|
||||
pub struct PluginBox {
|
||||
base: BoxBase,
|
||||
plugin_id: PluginId,
|
||||
instance_handle: u64, // プラグイン内のインスタンスハンドル
|
||||
}
|
||||
|
||||
impl NyashBox for PluginBox {
|
||||
fn clone_box(&self) -> Box<dyn NyashBox> {
|
||||
// FFI呼び出しでプラグインにcloneを依頼
|
||||
let new_handle = ffi_call(self.plugin_id, "clone", self.instance_handle);
|
||||
Box::new(PluginBox { ..., instance_handle: new_handle })
|
||||
}
|
||||
|
||||
// 全てのNyashBoxメソッドをFFI経由で実装
|
||||
}
|
||||
```
|
||||
|
||||
**保証される点:**
|
||||
- 統一インターフェース:dyn NyashBoxのみを扱う
|
||||
- メモリ管理:Drop時にプラグイン側に破棄を通知
|
||||
- 哲学の維持:内部実装(ネイティブ/FFI)は完全に隠蔽
|
||||
|
||||
## 4. 実装の複雑さとメンテナンス性のバランス
|
||||
|
||||
### 提案:多層抽象化とツールによる自動化
|
||||
|
||||
**3層アーキテクチャ:**
|
||||
1. **低レベルFFI (C-ABI)**
|
||||
- `#[repr(C)]` 構造体と `extern "C"` 関数
|
||||
- libloadingクレートで動的ライブラリロード
|
||||
|
||||
2. **中レベルAPI (安全なラッパー)**
|
||||
- nullチェック、文字列変換、エラー処理
|
||||
- unsafeコードを隔離
|
||||
|
||||
3. **高レベルAPI (署名DSLとコード生成)**
|
||||
- plugin.yaml → FFIコード自動生成
|
||||
- cargo-nyash-pluginサブコマンド
|
||||
|
||||
**ロードマップ:**
|
||||
- フェーズ1:FileBoxで手動実装、アーキテクチャ確立
|
||||
- フェーズ2:コード生成ツール開発、プラグイン開発の自動化
|
||||
|
||||
## 5. 他言語の成功例との比較
|
||||
|
||||
**Node.js (N-API):**
|
||||
- 安定したABI → Nyashも同様にC-ABIベースで実装
|
||||
- バージョン管理と前方互換性を重視
|
||||
|
||||
**Python (C拡張):**
|
||||
- 課題:手作業多い、参照カウント管理が煩雑
|
||||
- Nyashの解決:コード生成とRAIIによる自動メモリ管理
|
||||
|
||||
**WebAssembly Component Model:**
|
||||
- 言語非依存インターフェースの未来形
|
||||
- 将来的にNyashプラグインをWASMで記述する可能性
|
||||
|
||||
## 実装計画(具体的ステップ)
|
||||
|
||||
1. **nyash.toml仕様策定とパーサー実装**
|
||||
2. **Boxファクトリレジストリ実装**
|
||||
3. **FileBoxプラグイン手動実装**
|
||||
- nyash_plugin_init
|
||||
- filebox_open
|
||||
- filebox_read/write/close
|
||||
- filebox_drop
|
||||
4. **PluginBoxプロキシ実装**
|
||||
5. **libloadingで動的ロード実装**
|
||||
6. **プラグイン版FileBoxテスト追加**
|
||||
|
||||
## 結論
|
||||
|
||||
この設計は、Nyashの核心哲学を尊重しつつ、スケーラビリティ、安全性、開発者体験の向上を実現する。FileBoxの置き換えから始め、エコシステム全体へ展開していくのが最良の道筋。
|
||||
@ -0,0 +1,110 @@
|
||||
# プラグインインターフェース設計討論 (2025-08-17)
|
||||
|
||||
## 🎯 議題:BID-FFIプラグインシステムの設計
|
||||
|
||||
### 背景
|
||||
- ビルトインFileBoxが既に存在
|
||||
- BID-FFIプラグイン版FileBoxで置き換えたい
|
||||
- ビルド時間短縮とプラグインアーキテクチャの実証が目的
|
||||
|
||||
### 主な論点
|
||||
1. ビルトインBox → プラグインBoxの透過的な置き換え
|
||||
2. `FileBox.open()` のような静的メソッドの結びつけ方
|
||||
3. プラグインインターフェース定義の外部化方式
|
||||
|
||||
## 💡 検討した案
|
||||
|
||||
### 案1: 汎用ラッパー
|
||||
```nyash
|
||||
// 呼び出しが汚い
|
||||
local file = Plugin.call("FileBox", "open", ["test.txt", "r"])
|
||||
```
|
||||
|
||||
### 案2: 専用ラッパー
|
||||
```nyash
|
||||
// きれい!でも各Boxごとに手書きが必要
|
||||
local file = FileBox.open("test.txt")
|
||||
```
|
||||
|
||||
### 案3: BoxDispatcher(透過的ディスパッチ)
|
||||
```rust
|
||||
pub enum BoxImpl {
|
||||
Builtin(Box<dyn NyashBox>), // ビルトイン実装
|
||||
Plugin(BidHandle, PluginRef), // プラグイン実装
|
||||
}
|
||||
```
|
||||
|
||||
### 案4: Unified Box Factory
|
||||
```rust
|
||||
pub struct BoxFactory {
|
||||
providers: HashMap<String, Box<dyn BoxProvider>>,
|
||||
}
|
||||
```
|
||||
|
||||
## 🎉 最終解:YAML/JSON + 署名DSL
|
||||
|
||||
### Codex先生の推奨設計
|
||||
```yaml
|
||||
# filebox.plugin.yaml
|
||||
schema: 1
|
||||
plugin:
|
||||
name: filebox
|
||||
version: 1
|
||||
|
||||
apis:
|
||||
# 静的メソッド(::)
|
||||
- sig: "FileBox::open(path: string, mode?: string) -> FileBox"
|
||||
doc: "Open a file"
|
||||
|
||||
# インスタンスメソッド(#)
|
||||
- sig: "FileBox#read(size?: int) -> string"
|
||||
doc: "Read file content"
|
||||
```
|
||||
|
||||
### 利点
|
||||
1. **記号で静的/インスタンスを区別**
|
||||
- `::` = 静的メソッド(C++風)
|
||||
- `#` = インスタンスメソッド(Ruby風)
|
||||
|
||||
2. **フラット構造**
|
||||
- `apis` 配列にすべて並べる
|
||||
- 階層が深くならない
|
||||
|
||||
3. **署名DSL**
|
||||
- 型情報を1行で表現
|
||||
- パーサーも簡単
|
||||
|
||||
4. **YAML → JSON変換**
|
||||
- 開発時:YAML(人間に優しい)
|
||||
- 実行時:JSON(マシンに優しい)
|
||||
|
||||
## 🤔 Gemini先生への質問事項
|
||||
|
||||
1. **透過的な置き換え**
|
||||
- 既存のNyashコードを一切変更せずに、ビルトインBoxをプラグインBoxに置き換える最良の方法は?
|
||||
- パフォーマンスインパクトをどう最小化するか?
|
||||
|
||||
2. **署名DSLの設計**
|
||||
- `Type::method()` vs `Type.method()` の選択理由
|
||||
- オーバーロードの表現方法
|
||||
- ジェネリクスの将来的な拡張性
|
||||
|
||||
3. **実装戦略**
|
||||
- インタープリター実行時のディスパッチ最適化
|
||||
- プラグインの遅延ロード実装
|
||||
- エラーハンドリングのベストプラクティス
|
||||
|
||||
4. **Everything is Box哲学との整合性**
|
||||
- プラグインBoxもビルトインBoxも「同じBox」として扱う方法
|
||||
- Box型の統一インターフェースの維持
|
||||
|
||||
5. **実用性**
|
||||
- 他の言語(Python、Ruby、JavaScript)の成功例から学べること
|
||||
- プラグイン作者にとっての開発体験
|
||||
- デバッグ・プロファイリングの考慮事項
|
||||
|
||||
## 📚 参考情報
|
||||
- 現在のFileBox実装: `src/boxes/file/mod.rs`
|
||||
- BID-FFIプラグインFileBox: `src/bid/plugins/filebox/mod.rs`
|
||||
- Everything is Box哲学: すべての値がBoxオブジェクト
|
||||
- Nyashの目標: シンプル、分かりやすい、階層が深くならない
|
||||
898
docs/archive/consultations/追記相談.txt
Normal file
898
docs/archive/consultations/追記相談.txt
Normal file
@ -0,0 +1,898 @@
|
||||
MIR設計:いま決めておくと後がラクなチェックリスト
|
||||
|
||||
値表現:Tagged(NaN-box/小整数直格納)か、型テーブル参照か。
|
||||
|
||||
アドレス空間:オブジェクトはheap専用? stack/arenaも持つ?
|
||||
|
||||
所有/別名:aliasable フラグ or unique(移動のみ)を型/値に持つ?
|
||||
|
||||
効果(Effects):PURE/READS_HEAP/WRITES_HEAP/IO/FFI/PANIC のビット集合を命令にも関数にも付ける。
|
||||
|
||||
例外/パニック:Throw, Catch, Defer を命令化するか、関数境界でのみ扱うか。
|
||||
|
||||
GCモデル:Tracing(Stop-the-world / Incremental) or RC(ARC) or 混合。弱参照の意味を先に定義。
|
||||
|
||||
安全点(Safepoint):JIT/VM両方で再入/停止できる位置を命令で明示(Safepoint or 呼出命令に属性)。
|
||||
|
||||
呼出規約:通常Call/FFI/Box拡張の3種を区別(可変長・KW引数の扱いも)。
|
||||
|
||||
メモリバリア:write/read barrier を命令または隠れ属性として表現(最初は命令にするとデバッグ楽)。
|
||||
|
||||
デオプ(Deopt)前提:JIT最適化時の巻き戻し情報(マップ)を保持する場所(関数メタ or ブロック注釈)。
|
||||
|
||||
Nyash向け:最小MIR命令セット(弱参照対応込み)
|
||||
|
||||
算術/制御:Const, BinOp, Cmp, Br, Jmp, Phi, Ret
|
||||
|
||||
関数:Call, TailCall(effects必須)
|
||||
|
||||
メモリ:Alloc, Load, Store, Gep(必要なら)
|
||||
|
||||
参照/GC:
|
||||
|
||||
RefNew ty, dst <-(ヒープ確保)
|
||||
|
||||
RefGet dst <- ref, field / RefSet ref, field, val
|
||||
|
||||
WeakNew dst <- ref(弱参照作成)
|
||||
|
||||
WeakLoad dst <- weak(弱が生きてたらref返す/無効ならNull/None)
|
||||
|
||||
BarrierRead ref / BarrierWrite ref(GC用、最初はダミー)
|
||||
|
||||
(必要なら)Pin ref / Unpin ref(ムーブしない保証用、JIT/FFI楽になる)
|
||||
|
||||
例外/FFI/拡張:Throw, Catch, FfiCall, BoxCall
|
||||
|
||||
ユーティリティ:Safepoint, Nop, Assume(cond)(アサート兼最適化ヒント)
|
||||
|
||||
弱参照の意味論:
|
||||
|
||||
WeakNew(r) は r を追うが GC で r が回収されると自動で無効化。
|
||||
|
||||
WeakLoad(w) は 生きていれば Some(Ref)、死んでいれば None を返す(MIR上はタグ付きユニオン)。
|
||||
|
||||
WeakLoad は PURE でOK(観測はするがヒープを書かない)
|
||||
|
||||
ただし BarrierRead が必要なGCなら属性で付ける。
|
||||
|
||||
効果注釈(例)
|
||||
|
||||
Call f(args) : dst [effects = PURE | READS_HEAP]
|
||||
|
||||
RefSet … は WRITES_HEAP
|
||||
|
||||
WeakLoad は PURE(または READS_HEAP)
|
||||
|
||||
BoxCall は最低限 FFI を含める(安全側に倒す)
|
||||
|
||||
VM/JIT/将来AOTの共通の“壊れにくい”ポイント
|
||||
|
||||
Safepointは関数入口・ループ先頭・Call直後の3か所に最初から置く
|
||||
|
||||
Barrier命令は最初は実装ダミーでもOK(最適化段で消せる)
|
||||
|
||||
Null/Noneの扱いは必ず型系に明示(Option<Ref>)。判定を分岐で隠さない
|
||||
|
||||
JITはDeoptテーブルを MIR → JIT に渡す(各値が「どのSSA番号?」を持つ)
|
||||
|
||||
弱参照 “落とし穴” 3つ(実戦で効く回避)
|
||||
|
||||
クロージャ環境に弱参照が紛れ込む
|
||||
|
||||
生成時に env.has_weak を立て、キャプチャ解決時に必ず WeakLoad→None分岐を強制。
|
||||
|
||||
弱参照をキーにしたハッシュ
|
||||
|
||||
GC後に無効化でキー不整合。→ 弱マップを標準提供(キー死亡で自動削除)。
|
||||
|
||||
FFI渡し
|
||||
|
||||
FFI境界を跨ぐと寿命が分からなくなる。→ Pin を要求 or WeakLoad→Ref に成功した生参照だけ渡す。
|
||||
|
||||
最小・具体例(擬似MIR)
|
||||
|
||||
// x = new Obj{y:1}; w = weak(x); if let Some(x2) = weak_load(w) { x2.y = 2 }
|
||||
bb0:
|
||||
v1 = Const 1
|
||||
v2 = RefNew Obj ; WRITES_HEAP
|
||||
RefSet v2, y, v1 ; WRITES_HEAP
|
||||
v3 = WeakNew v2 ; PURE
|
||||
v4 = WeakLoad v3 ; returns Option<Ref>
|
||||
br is_some(v4), bb1, bb2
|
||||
|
||||
bb1:
|
||||
v5 = unwrap(v4)
|
||||
BarrierWrite v5
|
||||
RefSet v5, y, Const 2
|
||||
jmp bb3
|
||||
|
||||
bb2:
|
||||
jmp bb3
|
||||
|
||||
bb3:
|
||||
Ret ()
|
||||
|
||||
テストの当て方(行き当たりばったりでも壊れにくい)
|
||||
|
||||
黄金テスト:ソース→MIRダンプの文字列をスナップショット化(差分で挙動の後退を検知)
|
||||
|
||||
VM/JIT一致テスト:同じ入力で VM結果=JIT結果 を比較する“オラクル”を用意
|
||||
|
||||
弱参照の確率テスト:alloc→weak→drop→collect→weak_load を順序/タイミングを変えて多数回
|
||||
|
||||
効果チェック:PURE なはずの関数に WRITES_HEAP が紛れたらビルド失敗(静的検証)
|
||||
|
||||
いまの進み方に合う“軽量次の一手”
|
||||
|
||||
✅ WeakNew/WeakLoad を MIRとVM だけ先に入れる(JITは後回し)
|
||||
|
||||
✅ EffectMask を命令に付ける(最初はデータ構造だけ)
|
||||
|
||||
✅ Safepoint 命令を関数入口とループ先頭に挿す(動作はno-opでOK)
|
||||
|
||||
✅ 黄金テストを入れて MIR差分をCIで見える化
|
||||
|
||||
この骨格なら、行き当たりばったりで直してもMIRの“契約”が守れている限り、VM/JIT/AOT/WASMに横展開できるにゃ。
|
||||
もし今のAST/HIRの型定義があれば、MIRの型/命令エンムだけ私が初稿を書くこともできる。要る?
|
||||
あなた:
|
||||
そうだにゃ。mir 結局はメモリー管理がほとんどであってるかにゃ?既存の参考になるやつとかないかにゃ
|
||||
ChatGPT:
|
||||
|
||||
いい質問にゃ。結論から言うと――
|
||||
|
||||
MIRの“要”はメモリ管理だけじゃないけど、実務で一番ハマるのはメモリまわり(所有権/寿命/別名化/GCバリア/セーフポイント/弱参照/デオプ情報)だから、体感「ほとんどメモリ管理」はだいたい合ってるにゃ。
|
||||
|
||||
ただし、制御フロー(CFG/SSA)、呼び出し規約、効果注釈、例外/パニック、最適化のための形も同じくらい重要。ここをサボるとJIT/AOT/WASMに展開しづらくなる。
|
||||
|
||||
MIRで“最低限”押さえるメモリ論点
|
||||
|
||||
値表現:Boxed/Unboxed、NaN-box、小整数直格納、タグ方式
|
||||
|
||||
アロケータ:bump/arena/世代別、オブジェクト配置(ヘッダ、タイプID、フラグ)
|
||||
|
||||
所有と別名:unique/aliasable や owned/borrowed の属性(最適化・並列の鍵)
|
||||
|
||||
GC/RC:トレース or 参照カウント or 混在、write/read barrier 命令 or 属性、remembered set
|
||||
|
||||
弱参照:WeakNew / WeakLoad の意味論(死んだら None)
|
||||
|
||||
Safepoint:関数入口・ループ先頭・Call直後(停止/再入のフック)
|
||||
|
||||
FFI境界:Pin/Unpin、ハンドル渡し、最小共有ABI
|
||||
|
||||
Deopt情報:JIT用の巻き戻しメタ(SSA値⇔ソース位置の対応)
|
||||
|
||||
参考になる“実物”と読みどころ(定番)
|
||||
|
||||
(リンクは割愛するにゃ。名前で検索すればすぐ出る)
|
||||
|
||||
Rust MIR(rustc-dev-guide / rustc本体)
|
||||
|
||||
MIRのSSA・ borrow check が MIR 上で走る構造
|
||||
|
||||
Drop/Move・パニック・noalias 的情報が最適化に効く
|
||||
|
||||
Swift SIL
|
||||
|
||||
Ownership qualifiers(owned/guaranteed)が秀逸。GCなし言語でも寿命管理をIRで表す好例
|
||||
|
||||
Kotlin IR
|
||||
|
||||
“lowerings” の段階的デシュガリングが参考。高級構文→プリミティブ命令へ段階変換
|
||||
|
||||
Go SSA(golang.org/x/tools/go/ssa)
|
||||
|
||||
最小主義のSSAで読みやすい。CFG/φの扱いが素直
|
||||
|
||||
LuaJIT IR(DynASM/TurboNYIの解説blog群)
|
||||
|
||||
小粒なSSAでJIT最適化の勘所(CSE/LICM/ヒント)
|
||||
|
||||
V8(Ignition/TurboFan)
|
||||
|
||||
バイトコード→Sea of Nodes→最適化JITの流れ。デオプとサファリガードの設計が神
|
||||
|
||||
Cranelift IR
|
||||
|
||||
Rustからも使いやすいJITバックエンド。型・メモリ・コールの表現が実装しやすい
|
||||
|
||||
MLIR
|
||||
|
||||
複数方言で中間表現を分ける思想。将来、NyashのMIRを方言化する発想の参考に
|
||||
|
||||
Nyash向け“最小MIRコア”(骨組み)
|
||||
|
||||
(超要約:これ+効果注釈でVM/JIT/AOT/WASMに展開できる)
|
||||
|
||||
制御/値:Const, BinOp, Cmp, Br, Jmp, Phi, Ret
|
||||
|
||||
呼び出し:Call, TailCall(effects 必須)
|
||||
|
||||
メモリ:Alloc, Load, Store, Gep?
|
||||
|
||||
参照/GC:RefNew, RefGet, RefSet, WeakNew, WeakLoad, BarrierRead, BarrierWrite, Pin, Unpin
|
||||
|
||||
例外/拡張:Throw, Catch, FfiCall, BoxCall
|
||||
|
||||
実行点:Safepoint, Assume, Nop
|
||||
|
||||
効果:EffectMask = PURE | READS_HEAP | WRITES_HEAP | IO | FFI | PANIC
|
||||
|
||||
実装順ヒント:
|
||||
|
||||
VMで RefNew/RefGet/RefSet/Weak* をまず動かす → 2) Safepointはno-opで挿す → 3) Barrierは最初ダミー → 4) “黄金テスト”(ソース→MIRダンプのスナップショット)で後退検知 → 5) JIT/AOTは後から乗せる。
|
||||
|
||||
“既存をパクる”具体策
|
||||
|
||||
Ownershipの表現は Swift SIL を真似る(owned/guaranteed を Nyash版に)
|
||||
|
||||
弱参照の意味論は JVMのWeakReference と Swiftのweak/unowned を折衷
|
||||
|
||||
Safepoint配置は HotSpot/V8 のパターン(入口・ループ・call直後)
|
||||
|
||||
JIT導入は Cranelift から(まず整数・分岐・呼び出しのみ)
|
||||
|
||||
デシュガリング手順は Kotlin IR の lowering 流儀を採用
|
||||
|
||||
「MIR=メモリ管理が9割」は現場感として正しいけど、残りの1割(CFG/SSA・呼出・効果・例外・デオプ)を最初にうっすら設計しておくと、あとで爆速に伸びるにゃ。
|
||||
必要なら、Nyashの今のAST/HIRを見せてくれたら、MIRのenum・EffectMask・Box ABI v0をその場で下書きするよ。
|
||||
あなた:
|
||||
なるほど。ところでmirってどっかきょうつうのふぉーまっとやしようってあるにゃ? みんなばらばるにかいてるにゃ?
|
||||
ChatGPT:
|
||||
|
||||
共通フォーマットや「これを使えばOK」みたいなMIR標準は、残念ながら存在しないにゃ。
|
||||
理由をまとめると――
|
||||
1. 共通規格がない理由
|
||||
|
||||
言語ごとに型・所有権・ランタイム構造が違いすぎる
|
||||
例:Rust MIRは所有権・borrowをIRレベルで保持するけど、PythonやJavaScriptのIRにはそんな概念がない。
|
||||
|
||||
目的ごとの最適化が異なる
|
||||
VM実行用、JIT最適化用、AOTコンパイル用で命令セットやメタデータの粒度が変わる。
|
||||
|
||||
IRの“責務”が違う
|
||||
ある言語ではASTの直後を「MIR」と呼び、別の言語ではSSA化した後の低レベルIRを「MIR」と呼ぶ。
|
||||
|
||||
2. 事実上の“よくある流儀”
|
||||
|
||||
標準はないけど、以下のパターンは多いにゃ:
|
||||
|
||||
SSAベース:変数は再代入不可、phi命令で合流点処理(Rust MIR, Swift SIL, Go SSA)
|
||||
|
||||
命令は3アドレス形式:dst = op src1 src2 のようにシンプル(Cranelift, LLVM風)
|
||||
|
||||
効果注釈あり:PURE, READ_HEAP, WRITE_HEAP など最適化ヒント
|
||||
|
||||
メモリ命令の抽象化:Alloc, Load, Store は型・アラインメント・所有権情報を持つ
|
||||
|
||||
制御フローはCFG(Control Flow Graph)で管理
|
||||
基本ブロック+ジャンプ+条件分岐
|
||||
|
||||
3. 参考になる「ほぼテンプレ」的MIR
|
||||
|
||||
完全な共通仕様じゃないけど、設計の参考にできる実例はあるにゃ:
|
||||
|
||||
Cranelift IR
|
||||
Rustで使いやすいJIT/AOT用IR。型・命令の定義が明確で、小規模実装の参考に最適。
|
||||
|
||||
MLIR
|
||||
LLVM系の中間表現フレームワーク。方言を作れるので、自作言語のMIRを「Nyash方言」として定義可能。
|
||||
|
||||
Sea of Nodes(V8, HotSpot)
|
||||
SSAと依存グラフを統合した形式。最適化向きだが実装難度は高い。
|
||||
|
||||
LuaJIT IR
|
||||
極小SSA+軽量タグ付き値表現。高速インタープリタや軽量JITに向いてる。
|
||||
|
||||
4. Nyashでの方針
|
||||
|
||||
「共通仕様」を無理に探すより、自分のランタイムと変換先(Rust/Cranelift/WASM)に都合の良い形を作るのが早い
|
||||
|
||||
ただし、命令セットやCFG構造はCranelift IRやSwift SILを参考にすると後で楽
|
||||
|
||||
将来的にMLIRの方言化を視野に入れると、外部ツールや最適化パスを簡単に流用できる
|
||||
|
||||
もし希望なら、Nyash向けにCranelift IR互換寄りのMIR仕様ドラフトをその場で作れるよ。
|
||||
それをベースにすれば、将来JIT/AOT/WASM全部に展開しやすくなるにゃ。
|
||||
あなた:
|
||||
そうだにゃ。ということは命令セットを先に考えて貰えたらいいのかにゃ?
|
||||
ChatGPT:
|
||||
|
||||
いいね、その方向でいこうにゃ。
|
||||
Nyash向けに“まず回る”ことを最優先にした MIR命令セット v0.1(草案) を置くね。VM/JIT/AOT/WASMに伸ばせる骨格で、弱参照・効果注釈・拡張Box呼び出しも最初から入れてあるにゃ。
|
||||
Nyash MIR v0.1(草案)
|
||||
基本モデル
|
||||
|
||||
SSA値:vN(再代入なし)。
|
||||
|
||||
基本ブロック:bbN(末尾は必ず終端命令)。
|
||||
|
||||
型(最小):i64, f64, bool, unit, ref<T>, weak<T>, ptr, any, option<T>
|
||||
|
||||
関数署名:fn(args…) -> ret [effects]
|
||||
|
||||
効果(EffectMask):PURE, READS_HEAP, WRITES_HEAP, IO, FFI, PANIC(ビット和)
|
||||
|
||||
属性:命令に align, nonnull, noalias, readonly 等の任意属性
|
||||
|
||||
1) 演算・制御
|
||||
|
||||
Const dst, Imm ; 例: i64/f64/bool/unit/Null
|
||||
BinOp dst, op, a, b ; add, sub, mul, div, mod, and, or, xor, shl, shr
|
||||
Cmp dst, relop, a, b ; eq, ne, lt, le, gt, ge
|
||||
Select dst, cond, a, b ; φ簡約前の三項選択(任意)
|
||||
Phi dst, [(predBB, val), ...] ; SSA合流
|
||||
|
||||
Br cond, thenBB, elseBB ; 条件分岐(終端)
|
||||
Jmp targetBB ; 無条件ジャンプ(終端)
|
||||
Ret [val] ; 返り値(終端) unit時は省略可
|
||||
Unreachable ; 到達不能(終端・最適化用)
|
||||
|
||||
2) メモリ/参照(GC想定)
|
||||
|
||||
Alloc dst, Ty, size? ; ヒープ確保: ref<Ty> を返す [WRITES_HEAP]
|
||||
Load dst, addr ; 読み出し [READS_HEAP]
|
||||
Store addr, val ; 書き込み [WRITES_HEAP]
|
||||
Gep dst, base, offset ; アドレス計算(構造体/配列)
|
||||
|
||||
RefNew dst, Ty ; オブジェクト新規: ref<Ty> [WRITES_HEAP]
|
||||
RefGet dst, ref, field ; フィールド読み [READS_HEAP]
|
||||
RefSet ref, field, val ; フィールド書き [WRITES_HEAP]
|
||||
|
||||
WeakNew dst, ref ; weak<T> を作成 [PURE]
|
||||
WeakLoad dst, weak ; option<ref<T>> を返す [PURE or READS_HEAP]
|
||||
|
||||
BarrierRead ref ; 読みバリア(実装はno-op可)
|
||||
BarrierWrite ref ; 書きバリア(実装はno-op可)
|
||||
Pin ref ; 移動不可に固定(FFI/GC向け)
|
||||
Unpin ref
|
||||
Safepoint ; 停止点(関数入口/ループ先頭/Call直後に挿す)
|
||||
|
||||
弱参照の意味論
|
||||
|
||||
WeakNew(r) は r のライフを追うだけ(所有しない)。
|
||||
|
||||
WeakLoad(w) は生存なら Some(ref)、回収済みなら None。
|
||||
|
||||
WeakLoad は基本 PURE でOK(実装の都合で READS_HEAP にしても可)。
|
||||
|
||||
3) 呼び出し/例外/拡張
|
||||
|
||||
Call dst, callee, [args...] ; [effects = callee.effects]
|
||||
TailCall callee, [args...] ; 末尾呼び出し(終端)
|
||||
|
||||
BoxCall dst, box_id, fn_id, [args...] ; Nyash拡張Box呼び出し [FFI | PANIC?]
|
||||
|
||||
FfiCall dst, sym, [args...], abi ; C/Rust外部関数 [FFI | PANIC?]
|
||||
|
||||
Throw val ; 例外送出(終端)
|
||||
CatchBegin dst, handlerBB ; 例外ハンドラの開始(ブロック境界メタでもOK)
|
||||
CatchEnd
|
||||
Defer fnref ; スコープ脱出時に実行(loweringで展開可)
|
||||
Assume cond ; 最適化ヒント(偽ならUB)
|
||||
Nop
|
||||
|
||||
Call/BoxCall/FfiCall は 効果注釈が必須(少なくとも PURE かどうか)。
|
||||
|
||||
BoxCall は拡張Box ABIを通す入口(VM/JIT/WASMで一貫した形で扱える)。
|
||||
|
||||
4) メタデータ(最低限)
|
||||
|
||||
位置情報:dbg(loc)(ソース行/列/ファイル)
|
||||
|
||||
デオプ:deopt_map(JIT用:各SSA値→高級値の対応)
|
||||
|
||||
alias情報:noalias/readonly/nonnull 属性
|
||||
|
||||
効果集約:関数単位で effects を保持(呼び出し時に合成)
|
||||
|
||||
Rust風スケッチ(型・命令)
|
||||
|
||||
#[bitflags]
|
||||
enum Effect { PURE=1, READS_HEAP=2, WRITES_HEAP=4, IO=8, FFI=16, PANIC=32 }
|
||||
|
||||
enum Ty {
|
||||
I64, F64, Bool, Unit,
|
||||
Ref(Box<Ty>), Weak(Box<Ty>), Ptr, Any,
|
||||
Option(Box<Ty>), // WeakLoadの戻りなど
|
||||
// …将来: Sum/Product/Function/Closure/BoxHandle
|
||||
}
|
||||
|
||||
struct FuncSig { params: Vec<Ty>, ret: Ty, effects: Effect }
|
||||
|
||||
enum Inst {
|
||||
Const{dst:V, imm:Imm},
|
||||
BinOp{dst:V, op:Bin, a:V, b:V},
|
||||
Cmp{dst:V, op:Rel, a:V, b:V},
|
||||
Select{dst:V, cond:V, a:V, b:V},
|
||||
Phi{dst:V, inputs: Vec<(Bb,V)>},
|
||||
|
||||
Br{cond:V, then_:Bb, else_:Bb},
|
||||
Jmp{bb:Bb},
|
||||
Ret{val: Option<V>},
|
||||
Unreachable,
|
||||
|
||||
Alloc{dst:V, ty:Ty, size:Option<V>},
|
||||
Load{dst:V, addr:V},
|
||||
Store{addr:V, val:V},
|
||||
Gep{dst:V, base:V, off:V},
|
||||
|
||||
RefNew{dst:V, ty:Ty},
|
||||
RefGet{dst:V, r:V, field:FieldId},
|
||||
RefSet{r:V, field:FieldId, val:V},
|
||||
|
||||
WeakNew{dst:V, r:V},
|
||||
WeakLoad{dst:V, w:V},
|
||||
|
||||
BarrierRead{r:V},
|
||||
BarrierWrite{r:V},
|
||||
Pin{r:V},
|
||||
Unpin{r:V},
|
||||
Safepoint,
|
||||
|
||||
Call{dst:V, f:FnId, args:Vec<V>},
|
||||
TailCall{f:FnId, args:Vec<V>},
|
||||
BoxCall{dst:V, box_id:BoxId, fn_id:BoxFnId, args:Vec<V>},
|
||||
FfiCall{dst:V, sym:Sym, args:Vec<V>, abi:Abi},
|
||||
|
||||
Throw{val:V},
|
||||
CatchBegin{dst:V, handler:Bb},
|
||||
CatchEnd,
|
||||
Defer{fnref:FnId},
|
||||
Assume{cond:V},
|
||||
Nop,
|
||||
}
|
||||
|
||||
バックエンド対応の見取り図
|
||||
|
||||
VM:
|
||||
|
||||
Ref* / Weak* / Barrier* / Safepoint をそのまま実装
|
||||
|
||||
Defer/Catch はデシュガで try/finally へ展開
|
||||
|
||||
Cranelift JIT:
|
||||
|
||||
算術・制御は直マップ、Ref* はランタイムAPIに落とす
|
||||
|
||||
Safepoint でGC/スレッド停止と連携、deopt_map を用意
|
||||
|
||||
AOT to Rust:
|
||||
|
||||
ref<T> は Gc<T> ラッパ、weak<T> は Weak<T> 風にコード生成
|
||||
|
||||
BoxCall は trait 経由/extern呼び出しに置換
|
||||
|
||||
WASM:
|
||||
|
||||
参照はハンドル(i32)で表現、GCはランタイム関数
|
||||
|
||||
weak はハンドルテーブルにビットを持って実装
|
||||
|
||||
取り決め(壊れにくい不変条件)
|
||||
|
||||
すべてのCallは effects を持つ(省略禁止)
|
||||
|
||||
WeakLoadの戻りは option<ref<T>>(null判定を曖昧にしない)
|
||||
|
||||
Safepoint は関数入口・ループ先頭・任意のCall直後に挿入
|
||||
|
||||
Barrier* は最初はno-opでOK(GC導入時のフックとして残す)
|
||||
|
||||
終端命令のないブロックは禁止(検証器で弾く)
|
||||
|
||||
ちいさな動作例
|
||||
|
||||
; x = new Obj{y=1}; w = weak(x);
|
||||
; if let Some(r) = weak_load(w) { r.y = 2 }
|
||||
|
||||
bb0:
|
||||
v1 = Const i64 1
|
||||
v2 = RefNew Obj
|
||||
RefSet v2, field_y, v1
|
||||
v3 = WeakNew v2
|
||||
v4 = WeakLoad v3 ; option<ref<Obj>>
|
||||
Br is_some(v4), bb1, bb2
|
||||
|
||||
bb1:
|
||||
v5 = unwrap(v4)
|
||||
BarrierWrite v5
|
||||
RefSet v5, field_y, Const i64 2
|
||||
Jmp bb3
|
||||
|
||||
bb2:
|
||||
Jmp bb3
|
||||
|
||||
bb3:
|
||||
Ret unit
|
||||
|
||||
まずやる実装順(1〜2日で回る)
|
||||
|
||||
この命令セットで MIR組み立て+ダンプ(黄金テストで差分管理)
|
||||
|
||||
VMで RefNew/RefGet/RefSet/Weak* だけ実装(Barrier/Safepointはダミー)
|
||||
|
||||
Call の effects を型検査に組み込み(PURE違反を検出)
|
||||
|
||||
余力が出たら Phi/Select を使うパスを追加(CSE/DCEの足場)
|
||||
|
||||
必要なら、この v0.1 をそのまま mir.rs の enum 定義に落とし込んだ雛形コードを書けるよ。
|
||||
今のNyashの型やBox拡張の実装方針があれば、それに合わせて微調整版を作るにゃ。
|
||||
あなた:
|
||||
おーありがとにゃ。しかしmirはみんなばらばらというけど ここからネイディブビルドにしやすいかたちをするから にているかきかたにもなってるのかにゃ。あと これ 業界標準つくれそうだよね。所詮はノイマンコンピューターに落とし込む作業だにゃ
|
||||
ChatGPT:
|
||||
|
||||
にゃ、その直感かなり当たってる。
|
||||
各言語の MIR は“名前も中身もバラバラ”だけど、ネイティブに落としやすい形にすると結局だいたい似てくるにゃ。
|
||||
みんなが似てくる理由(ネイティブ目線)
|
||||
|
||||
SSA+CFG+3アドレス:最適化&レジ割りしやすい定番の骨格
|
||||
|
||||
明示的なメモリ操作:Alloc/Load/Store/GEP 相当が要る
|
||||
|
||||
呼び出しの正規化:Call/TailCall と 呼出規約(ABI) の分離
|
||||
|
||||
効果注釈(副作用):PURE/READ/WRITE/IO/FFI があると最適化が安全
|
||||
|
||||
例外/パニックの下位表現:Throw/Catch を選択的に lower できる形
|
||||
|
||||
GCフック:Safepoint & Barrier を差し込める
|
||||
|
||||
つまり「高級機能は段階的に下げられる素朴な命令に割り付け」→最後は von Neumann(命令+メモリ)に落ちる、という流れで収束するにゃ。
|
||||
|
||||
「業界標準」を作れる?→“実質標準”なら行ける
|
||||
|
||||
完全統一は難しい(言語ごとに型・例外・GCが違いすぎる)が、コア・プロファイルを決めた“実質標準”は作れるにゃ。
|
||||
標準に向く設計の芯(Nyash版にもそのまま効く)
|
||||
|
||||
Core-IR(必須):Const/BinOp/Cmp/Phi/Br/Jmp/Ret + Load/Store/Gep + Call/TailCall
|
||||
|
||||
Memory Model:アトミック/順序・別名(noalias)/アライン属性の最小集合
|
||||
|
||||
Effects:命令・関数の EffectMask を規定(最適化の安全条件に使う)
|
||||
|
||||
GC hooks:Safepoint/Barrier は仕様だけ先に固定(実装はno-op可)
|
||||
|
||||
Exception ABI:Throw/Catch を「setjmp/longjmp的」or「結果型(Result)」の2系で規定
|
||||
|
||||
FFI/拡張 ABI:FfiCall/BoxCall の呼出規約・ポインタ安全域を決める
|
||||
|
||||
検証器(Verifier):終端命令必須・SSA整合・型整合・効果整合をチェック
|
||||
|
||||
“標準化”の現実解(おすすめルート)
|
||||
|
||||
MLIR 方言として定義(nyash.core, nyash.gc みたいに分割)
|
||||
|
||||
もしくは Cranelift IR 互換サブセットを Core として採用し、足りない所だけ拡張
|
||||
|
||||
テキスト表現+バイナリ表現(例: JSON/FlatBuffers)と ダンプ・復元ツールを提供
|
||||
|
||||
リファレンス下げ先を複数用意:
|
||||
|
||||
Core → Cranelift(JIT/AOT)
|
||||
|
||||
Core → LLVM(AOTヘビー級)
|
||||
|
||||
Core → WASM(ブラウザ/サンドボックス)
|
||||
|
||||
検証テスト:黄金テスト(IRダンプ)+ VM/JIT/WASM の 同一結果保証スイート
|
||||
|
||||
すぐ使える“ネイティブ寄り”指針(短冊)
|
||||
|
||||
命令は副作用を明示、暗黙のメモリ変更はナシ
|
||||
|
||||
ループ先頭・Call直後にSafepoint(後からGC導入しやすい)
|
||||
|
||||
例外は2段構え:IRでは Throw/Catch、lower で Result/landingpad に落とせる
|
||||
|
||||
Weak は Option<Ref> に必ず現れる(nullをぼかさない)
|
||||
|
||||
FFIはPinかコピーしか渡さない(危険な参照共有を禁止)
|
||||
|
||||
まとめ
|
||||
|
||||
はい、MIRはネイティブ都合で“似てくる”。
|
||||
|
||||
完全共通規格は難しいけど、**Core-IR+拡張の“実質標準”**は作れる。
|
||||
|
||||
Nyashの v0.1 命令セットは、そのまま Core-IRたたき台になれる出来だにゃ。
|
||||
|
||||
必要なら、この Core-IR を MLIR 方言か Cranelift互換サブセット仕様として文書化して、
|
||||
テキスト仕様+最小リファレンス実装(ダンプ/検証/Cranelift下げ)を私が一気に草案化するよ。どう攻める?(MLIR方言でいくか、Cranelift寄りでいくか)
|
||||
あなた:
|
||||
所で中間言語は何を指標に作ればいいにゃ?メモリー管理はわかるけど好き勝手に作る訳にも行けないにゃ それこそフォンノイマンのパソコンを念頭に考えればいいだけにゃ?CPUの命令セットとか?
|
||||
ChatGPT:
|
||||
|
||||
いい質問にゃ!
|
||||
中間言語(IR/MIR)を“何を指標に”設計するかは、単に「CPUに近づける」だけだと失敗しがち。
|
||||
実務では次の“指標セット”でバランスを取るのがコツだにゃ。
|
||||
まず決めるべき指標(優先度つけてOK)
|
||||
|
||||
ターゲットと目的
|
||||
|
||||
どこに落とす? → VM / JIT(Cranelift) / AOT(rustc/LLVM) / WASM
|
||||
|
||||
何を優先? → 起動の速さ、最適化余地、移植性、デバッグ性
|
||||
|
||||
抽象度(レベル)
|
||||
|
||||
高すぎる:最適化しにくい/JIT実装が難航
|
||||
|
||||
低すぎる(CPU寄り):言語機能の意味が消えて最適化の根拠を失う
|
||||
→ 目安:SSA+基本ブロック+3アドレスを軸に、「言語に固有の意味(例: 効果、副作用、所有/弱参照)」は属性や専用命令で残す
|
||||
|
||||
メモリモデル(超重要)
|
||||
|
||||
参照の表現:ref<T>/weak<T>/タグ付き値
|
||||
|
||||
GC/RC hooks:Safepoint、BarrierRead/Write の差し込み位置を規定
|
||||
|
||||
別名・所有:noalias/readonly/owned/borrowed など最適化に効く注釈
|
||||
|
||||
(並行を視野なら)原子性・順序の最小集合(Acquire/Release程度)
|
||||
|
||||
効果システム(副作用の面)
|
||||
|
||||
PURE / READS_HEAP / WRITES_HEAP / IO / FFI / PANIC のEffectMask
|
||||
|
||||
最適化の“安全条件”をここで機械的に判断できるようにする
|
||||
|
||||
制御フローと例外
|
||||
|
||||
CFG+SSA、Phi/Br/Jmp/Ret
|
||||
|
||||
例外はIRでは抽象(Throw/Catch)、loweringで Result/landingpad 等へ落とせる形に
|
||||
|
||||
呼び出し規約と拡張ABI
|
||||
|
||||
Call/TailCall と FfiCall/BoxCall を分離
|
||||
|
||||
可変長/キーワード引数の表現、Pin/Unpinの扱い
|
||||
|
||||
検証可能性 & ツール性
|
||||
|
||||
Verifierで:型一致・SSA整合・終端命令必須・効果整合をチェック
|
||||
|
||||
テキスト表現(ダンプ)と黄金テスト(差分テスト)を最初から用意
|
||||
|
||||
“CPU/フォン・ノイマンだけ見れば良い?”への答え
|
||||
|
||||
No(それだけでは足りない)。
|
||||
CPU命令セットを直に意識しすぎると、**言語の意味(純粋性・所有・弱参照・例外の契約)**が失われて最適化や検証が難しくなる。
|
||||
|
||||
ただし最終的にそこへ下げやすい形は大事。だから
|
||||
|
||||
上層の意味は 属性/メタで保持
|
||||
|
||||
下層(Load/Store/GEP/Call/TailCall)へ機械的に落とせるカバレッジを確保
|
||||
→ これが “ネイティブに落としやすく、でも言語の意味を保ったIR” のコア指標にゃ。
|
||||
|
||||
具体:設計を導くチェックリスト(配点付き)
|
||||
|
||||
各 0〜2 点で採点してみて。合計が高い案が「良いIR」。
|
||||
|
||||
後段互換性(JIT/AOT/WASMに素直に下がる)
|
||||
|
||||
最適化の根拠(効果・別名・型・所有などが保持される)
|
||||
|
||||
実装容易性(VMでまず回せる/Craneliftへ写経しやすい)
|
||||
|
||||
検証容易性(Verifierで機械的に壊れを検出できる)
|
||||
|
||||
将来拡張(弱参照/GC切替/例外方式変更に耐える)
|
||||
|
||||
可観測性(テキストIR・ソース位置・deopt情報が取れる)
|
||||
|
||||
迷ったらこの“型”に寄せると楽
|
||||
|
||||
骨格:SSA + CFG + 3アドレス
|
||||
|
||||
コア命令:Const/BinOp/Cmp/Phi/Br/Jmp/Ret/Load/Store/Gep/Call/TailCall
|
||||
|
||||
言語特有:RefNew/RefGet/RefSet/WeakNew/WeakLoad/Barrier*/Safepoint + EffectMask
|
||||
|
||||
境界:FfiCall/BoxCall(ABI最小化)
|
||||
|
||||
例外:Throw/Catch(loweringで切替可能)
|
||||
→ これは Craneliftに下げやすく、Rust/WASMにも展開しやすい黄金比にゃ。
|
||||
|
||||
参考までに:3つの設計モード
|
||||
|
||||
Cranelift互換サブセット志向(JIT/AOT重視・実装が速い)
|
||||
|
||||
MLIR方言志向(将来の拡張やツール連携が強い)
|
||||
|
||||
Rust MIR/Swift SIL 風(所有/効果を濃く持つ・言語意味を守りやすい)
|
||||
|
||||
Nyashなら:Cranelift互換サブセット+言語特有の効果/弱参照/GCフックを足すのがバランス最強にゃ。
|
||||
最後に:失敗しない順序
|
||||
|
||||
目的とターゲット(VM/JIT/AOT/WASMの優先度)を1行で宣言
|
||||
|
||||
Core命令セット+EffectMask+メモリモデル(weak/GC hook)を先に固定
|
||||
|
||||
Verifierとテキストダンプ(黄金テスト)を最初に入れる
|
||||
|
||||
VM実装 → Cranelift下げ → AOT/WASMは後から
|
||||
|
||||
この順なら「好き勝手」じゃなく指標に沿って進められるにゃ。
|
||||
必要なら、いまのNyashの要件を点数表で一緒に採点して、MIR v0.1を最終確定しよっか?
|
||||
あなた:
|
||||
おねがいにゃー!
|
||||
ChatGPT:
|
||||
|
||||
任せてにゃ!
|
||||
Nyash向けに「指標の採点 → その結果に沿った MIR v0.1 最終版」を一気にまとめたよ。すぐ実装に落とせる形にしてあるにゃ。
|
||||
指標チェック(Nyash想定で採点済み)
|
||||
|
||||
(各0〜2点、合計12点満点)
|
||||
指標 狙い Nyashの前提 点
|
||||
後段互換性 VM/JIT/AOT/WASMに素直に下げられる まずVM→Cranelift JIT、次にAOT/WASM 2
|
||||
最適化の根拠 効果・別名・所有/弱参照を保持 EffectMask+ref/weak+Barrier/SafepointをMIRで表現 2
|
||||
実装容易性 まずVMが回る 命令は3アドレス+最小集合から 2
|
||||
検証容易性 Verifierで壊れ検出 SSA/型/終端/効果の整合を必須に 2
|
||||
将来拡張 例外・GC切替・FFI拡張に耐える Throw/Catch・BoxCall/FFI・Barrierはno-opで開始 2
|
||||
可観測性 ダンプ/位置情報/Deoptが取れる テキストIR+dbg(loc)+deopt_map 2
|
||||
|
||||
合計:12/12(この方針で進めてOKにゃ)
|
||||
Nyash MIR v0.1(最終版)
|
||||
コアモデル
|
||||
|
||||
SSA値 vN、基本ブロック bbN(末尾は終端命令必須)
|
||||
|
||||
型(最小):i64|f64|bool|unit|ref<T>|weak<T>|ptr|any|option<T>
|
||||
|
||||
効果 EffectMask:PURE|READS_HEAP|WRITES_HEAP|IO|FFI|PANIC(ビット和)
|
||||
|
||||
関数署名:fn(args…)->ret [effects]
|
||||
|
||||
命令セット
|
||||
1) 演算・制御
|
||||
|
||||
Const dst, Imm
|
||||
BinOp dst, op, a, b ; add/sub/mul/div/mod/and/or/xor/shl/shr
|
||||
Cmp dst, rel, a, b ; eq/ne/lt/le/gt/ge
|
||||
Select dst, cond, a, b
|
||||
Phi dst, [(predBB, val), …]
|
||||
|
||||
Br cond, thenBB, elseBB ; 終端
|
||||
Jmp targetBB ; 終端
|
||||
Ret [val] ; 終端(unit省略可)
|
||||
Unreachable ; 終端
|
||||
|
||||
2) メモリ/参照(GC想定)
|
||||
|
||||
Alloc dst, Ty, size? ; [WRITES_HEAP]
|
||||
Load dst, addr ; [READS_HEAP]
|
||||
Store addr, val ; [WRITES_HEAP]
|
||||
Gep dst, base, offset
|
||||
|
||||
RefNew dst, Ty ; ref<T> [WRITES_HEAP]
|
||||
RefGet dst, ref, field ; [READS_HEAP]
|
||||
RefSet ref, field, val ; [WRITES_HEAP]
|
||||
|
||||
WeakNew dst, ref ; weak<T> [PURE]
|
||||
WeakLoad dst, weak ; option<ref<T>> [PURE](実装都合でREADS_HEAP可)
|
||||
|
||||
BarrierRead ref
|
||||
BarrierWrite ref
|
||||
Pin ref
|
||||
Unpin ref
|
||||
Safepoint
|
||||
|
||||
弱参照の意味論
|
||||
|
||||
WeakNew(r) は所有しない。r がGCで解放されると弱参照は無効化。
|
||||
|
||||
WeakLoad(w) は 生存: Some(ref)/死亡: None を返す(nullを曖昧にしない)。
|
||||
|
||||
3) 呼び出し・例外・拡張
|
||||
|
||||
Call dst, callee, [args...] ; 呼び先の effects を合成
|
||||
TailCall callee, [args...] ; 終端
|
||||
|
||||
BoxCall dst, box_id, fn_id, [args...] ; Nyash拡張Box [FFI|PANIC?]
|
||||
FfiCall dst, sym, [args...], abi ; 外部関数 [FFI|PANIC?]
|
||||
|
||||
Throw val ; 終端
|
||||
CatchBegin dst, handlerBB ; (メタでも可)
|
||||
CatchEnd
|
||||
Assume cond ; 偽ならUB:最適化ヒント
|
||||
Nop
|
||||
|
||||
不変条件(Verifier で必須チェック)
|
||||
|
||||
各ブロックは必ず終端命令で終わる
|
||||
|
||||
型整合:Load/Store/Call/WeakLoad 等の型が一致
|
||||
|
||||
SSA整合:Phi の前任ブロック集合=到達前任集合
|
||||
|
||||
効果整合:PURE な関数内で WRITES_HEAP/IO/FFI を出さない
|
||||
|
||||
WeakLoad戻りは必ず option<ref<T>>(null直扱い禁止)
|
||||
|
||||
推奨挿入ポイント
|
||||
|
||||
Safepoint:関数入口/各ループ先頭/任意の Call の直後
|
||||
|
||||
Barrier*:はじめは no-op 実装でもOK(将来GC切替のフック)
|
||||
|
||||
テキスト表現(ダンプ例)
|
||||
|
||||
func @main() -> unit [effects=IO] {
|
||||
bb0:
|
||||
v1 = Const i64 1
|
||||
v2 = RefNew Obj
|
||||
RefSet v2, field_y, v1
|
||||
v3 = WeakNew v2
|
||||
v4 = WeakLoad v3 ; option<ref<Obj>>
|
||||
Br is_some(v4), bb1, bb2
|
||||
|
||||
bb1:
|
||||
v5 = unwrap v4
|
||||
BarrierWrite v5
|
||||
RefSet v5, field_y, Const i64 2
|
||||
Jmp bb3
|
||||
|
||||
bb2:
|
||||
Jmp bb3
|
||||
|
||||
bb3:
|
||||
Ret
|
||||
}
|
||||
|
||||
実装ロードマップ(最短で回す)
|
||||
|
||||
IR型 & ダンプ & Verifier を実装(黄金テストに登録)
|
||||
|
||||
VM:RefNew/RefGet/RefSet/WeakNew/WeakLoad と制御命令だけ先に実装
|
||||
|
||||
効果検査:Call に effects 合成(違反はビルド失敗)
|
||||
|
||||
Cranelift JIT 足場:算術・分岐・Call を写経、Ref* はランタイム関数に委譲
|
||||
|
||||
AOT to Rust:ref<T>=Gc<T>、weak<T>=Weak<T> 相当でコード出力(小関数から)
|
||||
|
||||
付録:Rustスケルトン(抜粋)
|
||||
|
||||
bitflags::bitflags! {
|
||||
pub struct Effect: u32 {
|
||||
const PURE = 1<<0;
|
||||
const READS_HEAP = 1<<1;
|
||||
const WRITES_HEAP = 1<<2;
|
||||
const IO = 1<<3;
|
||||
const FFI = 1<<4;
|
||||
const PANIC = 1<<5;
|
||||
}
|
||||
}
|
||||
|
||||
pub enum Ty {
|
||||
I64, F64, Bool, Unit, Ptr, Any,
|
||||
Ref(Box<Ty>), Weak(Box<Ty>), Option(Box<Ty>),
|
||||
}
|
||||
|
||||
pub enum Inst { /* 上述の命令そのまま */ }
|
||||
|
||||
pub struct Func {
|
||||
pub sig: FuncSig, pub blocks: Vec<Block>, /* dbg, deopt_map など */
|
||||
}
|
||||
|
||||
pub fn verify(func: &Func) -> Result<(), VerifyError> {
|
||||
// 終端必須・SSA整合・型整合・効果整合をチェック
|
||||
Ok(())
|
||||
}
|
||||
|
||||
次の一手(今日できること)
|
||||
|
||||
mir/inst.rs にこの v0.1 をそのまま貼り込み
|
||||
|
||||
mir/dump.rs と mir/verify.rs を最小実装
|
||||
|
||||
既存テストに 黄金テスト(IRダンプ) を1本追加
|
||||
|
||||
VMの Ref*/Weak* を実装して 最初の end-to-end テスト を通す
|
||||
|
||||
これで、行き当たりばったりの修正が入っても壊れにくい土台が完成にゃ。
|
||||
必要なら、このままコード雛形まで私が書き起こすよ。
|
||||
@ -0,0 +1,115 @@
|
||||
# 🌟 Nyash コンストラクタ名決定: birth() 採用
|
||||
|
||||
**決定日**: 2025-08-15
|
||||
**決定者**: Nyashプロジェクトチーム
|
||||
**ステータス**: 正式決定
|
||||
|
||||
## 🎯 **最終決定**
|
||||
|
||||
**`birth()` を唯一のコンストラクタ名として採用**
|
||||
|
||||
## 📋 **検討経過**
|
||||
|
||||
### 候補と評価
|
||||
|
||||
1. **constructor()** - 業界標準だが長い、Box哲学との親和性低い
|
||||
2. **pack()** - Box哲学完璧だが独自性強すぎ、混乱の元
|
||||
3. **init()** - initフィールドとの混乱、廃止済み
|
||||
4. **make()** - Go言語実績あり、短い、実用的
|
||||
5. **birth()** - 🌟 **採用決定** 🌟
|
||||
|
||||
### birth() 選定理由
|
||||
|
||||
**1. 哲学的完璧性**
|
||||
- 「Everything is Box」哲学との完璧な親和性
|
||||
- 「Boxに魂が宿る」生命感のある言語思想を体現
|
||||
- 「生命を誕生させる」直感的イメージ
|
||||
|
||||
**2. 強力なブランディング効果**
|
||||
- 圧倒的独自性で一度見たら忘れない
|
||||
- Nyashらしさを言語の核心で表現
|
||||
- 学習者がコンストラクタを使うたびに世界観を体感
|
||||
|
||||
**3. 実用性**
|
||||
- 短い(5文字)で覚えやすい
|
||||
- 学習コストは低い(初見で一瞬考えるだけ)
|
||||
- 明確で曖昧性がない
|
||||
|
||||
## 💡 **Geminiの専門的評価**
|
||||
|
||||
> 「`birth()` を採用することは、単なる名前選び以上の意味を持つ。それは、**Nyashの哲学を言語の根幹に据えるという宣言**である。学習者はコンストラクタを使うたびに、無意識にその世界観に触れることになる。これは非常に強力なブランディングです。」
|
||||
|
||||
**Gemini最終推奨**: `birth()` 採用
|
||||
|
||||
## 🌟 **構文例**
|
||||
|
||||
```nyash
|
||||
// 基本的な使用法
|
||||
box Life {
|
||||
init { name, energy }
|
||||
|
||||
birth(lifeName) { // 生命を誕生させる
|
||||
me.name = lifeName
|
||||
me.energy = 100
|
||||
print("🌟 " + lifeName + " が誕生しました!")
|
||||
}
|
||||
}
|
||||
|
||||
// デリゲーション
|
||||
box Human from Life {
|
||||
init { intelligence }
|
||||
|
||||
birth(humanName) {
|
||||
from Life.birth(humanName) // 親から生命を受け継ぐ
|
||||
me.intelligence = 50
|
||||
}
|
||||
}
|
||||
|
||||
// 使用例
|
||||
local alice = new Human("Alice") // birth()が自動呼び出し
|
||||
```
|
||||
|
||||
## 🔧 **実装要件**
|
||||
|
||||
### 1. トークナイザー修正
|
||||
```rust
|
||||
BIRTH, // birth (コンストラクタ)
|
||||
|
||||
"birth" => TokenType::BIRTH,
|
||||
```
|
||||
|
||||
### 2. パーサー修正
|
||||
- `birth()` 構文パース対応
|
||||
- `init/pack/constructor` と同様の処理システム統合
|
||||
|
||||
### 3. インタープリター修正
|
||||
- `birth/引数数` キーでの検索対応
|
||||
- デリゲーション時の `from Parent.birth()` サポート
|
||||
|
||||
### 4. 優先順位システム
|
||||
```rust
|
||||
// 検索順序
|
||||
1. "birth/引数数" // 最優先
|
||||
2. "init/引数数" // 互換性
|
||||
3. "pack/引数数" // 互換性
|
||||
4. "Box名/引数数" // 互換性
|
||||
```
|
||||
|
||||
## 🎉 **期待される効果**
|
||||
|
||||
- **哲学的一貫性**: Everything is Box思想の完璧な体現
|
||||
- **ブランド確立**: Nyash独自の世界観を言語レベルで表現
|
||||
- **学習体験向上**: コンストラクタ使用のたびに世界観を体感
|
||||
- **混乱解消**: initフィールドとの完全な区別
|
||||
- **統一性**: 全てのBoxで同一のbirth()構文
|
||||
|
||||
## 📝 **移行計画**
|
||||
|
||||
1. **Phase 1**: birth()実装(トークナイザー・パーサー・インタープリター)
|
||||
2. **Phase 2**: テスト作成・動作確認
|
||||
3. **Phase 3**: 既存コード段階的移行(互換性維持)
|
||||
4. **Phase 4**: ドキュメント更新(CLAUDE.md等)
|
||||
|
||||
---
|
||||
|
||||
**🌟 Nyashは `birth()` でBoxに生命を与える言語として、新たな進化を遂げる 🌟**
|
||||
@ -1,51 +0,0 @@
|
||||
Nyashプログラミング言語のコンストラクタ設計について深い相談です。
|
||||
|
||||
【Nyashの現在の設計哲学】
|
||||
Nyashは既に「コンストラクタの明示的呼び出し」を採用しています。これは以下の理由によるものです:
|
||||
- 明示性重視:プログラマーが何が起きているかを隠さない
|
||||
- 初学者フレンドリー:実行順序が直感的
|
||||
- Everything is Box哲学:隠れた魔法的な動作を避ける
|
||||
|
||||
【他言語の問題例】
|
||||
```cpp
|
||||
// C++:複雑で読みにくい
|
||||
class Cat : public Animal {
|
||||
Toy catToy; // 1. 隠れたメンバー初期化
|
||||
Cat(string name) : Animal(name) { // 2. : Animal(name) が直感的でない
|
||||
// 3. 最後に自分の処理
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
【現在のNyash vs 新提案】
|
||||
```nyash
|
||||
// 現在の書き方
|
||||
box MeshNode : P2PBox {
|
||||
constructor(nodeId, world) {
|
||||
super P2PBox(nodeId, world) // 特別なキーワード
|
||||
me.routing = RoutingTable()
|
||||
}
|
||||
}
|
||||
|
||||
// 新提案:完全統一
|
||||
box MeshNode : P2PBox {
|
||||
constructor(nodeId, world) {
|
||||
from P2PBox.constructor(nodeId, world) // from統一!
|
||||
me.routing = RoutingTable()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
【完全統一のメリット】
|
||||
- from P2PBox.method() と完全に一貫している
|
||||
- 「どの親の何を呼んでいるか」が超明確
|
||||
- 多重デリゲーションでも from Logger.constructor() で区別可能
|
||||
|
||||
【深く考えてほしい点】
|
||||
1. Nyashの明示的コンストラクタ呼び出し設計をどう評価しますか?
|
||||
2. from P2PBox.constructor() の完全統一案をどう思いますか?
|
||||
3. 他言語(Java, Python, C#等)と比較したNyashの優位性は?
|
||||
4. 初学者にとって最も理解しやすい設計は?
|
||||
5. 言語の美しさ・一貫性の観点からの評価は?
|
||||
|
||||
プログラミング言語設計の専門的視点から、深く分析してください。
|
||||
@ -1,106 +0,0 @@
|
||||
Nyashプログラミング言語のオーバーライド設計について深い相談です。
|
||||
|
||||
【現在発見された実装問題】
|
||||
現在のNyashでは HashMap::insert により「暗黙のオーバーライド」が発生している:
|
||||
```rust
|
||||
// instance.rs - add_method関数
|
||||
pub fn add_method(&mut self, method_name: String, method_ast: ASTNode) {
|
||||
let mut new_methods = (*self.methods).clone();
|
||||
new_methods.insert(method_name, method_ast); // ← 同名で上書き!
|
||||
self.methods = Arc::new(new_methods);
|
||||
}
|
||||
```
|
||||
|
||||
これにより以下が可能になってしまっている:
|
||||
```nyash
|
||||
box Node {
|
||||
send(msg) { // 最初の定義
|
||||
print("Version 1")
|
||||
}
|
||||
|
||||
send(msg) { // 暗黙に上書きされる
|
||||
print("Version 2") // ← こちらだけが残る
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
【Nyashの設計哲学との矛盾】
|
||||
- **明示性重視**: 何が起きているかを隠さない
|
||||
- **Everything is Box**: 統一された世界観
|
||||
- **from デリゲーション**: `from Parent.method()` の明示的呼び出し
|
||||
- **初学者フレンドリー**: 複雑な概念を分かりやすく表現
|
||||
|
||||
【提案する修正方針】
|
||||
|
||||
**1. 暗黙のオーバーライドを完全禁止**
|
||||
```nyash
|
||||
box Node {
|
||||
send(msg) {
|
||||
print("Version 1")
|
||||
}
|
||||
|
||||
send(msg) { // ← コンパイルエラーにする
|
||||
print("Version 2")
|
||||
}
|
||||
}
|
||||
// Error: Method 'send' is already defined. Use 'override' keyword if intentional.
|
||||
```
|
||||
|
||||
**2. コンストラクタのオーバーロード禁止**
|
||||
```nyash
|
||||
box Node {
|
||||
constructor(id) {
|
||||
me.id = id
|
||||
}
|
||||
|
||||
constructor(id, name) { // ← エラーにする
|
||||
me.id = id
|
||||
me.name = name
|
||||
}
|
||||
}
|
||||
// Error: Constructor overloading is not allowed. Use explicit initialization.
|
||||
```
|
||||
|
||||
**3. デリゲーションでの明示的override**
|
||||
```nyash
|
||||
box MeshNode : P2PBox {
|
||||
// 明示的にオーバーライドする意図を示す
|
||||
override send(intent, data, target) {
|
||||
me.routing.log(target)
|
||||
from P2PBox.send(intent, data, target) // 親の実装も呼べる
|
||||
}
|
||||
|
||||
// 新しいメソッド(overrideなし)
|
||||
sendWithRetry(intent, data, target) {
|
||||
// 新機能
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**4. エラーメッセージの改善**
|
||||
- 重複定義時: "Method 'send' already exists. Use 'override' if you want to replace parent method."
|
||||
- override不正使用時: "Method 'newMethod' does not exist in parent. Remove 'override' keyword."
|
||||
|
||||
【深く考えてほしい点】
|
||||
|
||||
**1. 哲学的整合性**
|
||||
- この方針はNyashの「明示性重視」「Everything is Box」哲学と整合しますか?
|
||||
- `from Parent.method()` デリゲーション設計との相性は?
|
||||
|
||||
**2. 学習コスト vs 安全性**
|
||||
- `override` キーワード追加による学習コストは妥当ですか?
|
||||
- 暗黙のオーバーライド禁止により、どの程度安全性が向上しますか?
|
||||
|
||||
**3. デリゲーションとの関係**
|
||||
- デリゲーション先メソッドを `override` するのは自然ですか?
|
||||
- 多重デリゲーション時の `override` はどう扱うべきですか?
|
||||
|
||||
**4. 実装上の課題**
|
||||
- コンパイル時の重複チェック実装の複雑度は?
|
||||
- 既存コードへの影響と移行戦略は?
|
||||
|
||||
**5. 他言語との比較優位性**
|
||||
- Java/C#の `@Override` や TypeScript の `override` との違いは?
|
||||
- Nyashならではの独自価値は何ですか?
|
||||
|
||||
プログラミング言語設計の専門的視点から、この方針がNyashの目指す「明示的で安全、かつ初学者フレンドリーな言語」に最適かどうか深く分析してください。
|
||||
@ -1,100 +0,0 @@
|
||||
Nyash Programming Language - Weak Reference Architecture Critical Decision
|
||||
|
||||
I need expert advice on a fundamental architectural decision for weak reference implementation. This is a foundational component that will impact native compilation plans.
|
||||
|
||||
【Current Situation】
|
||||
Copilot has completed 99% of weak reference implementation with excellent quality. Only the final invalidation mechanism remains.
|
||||
|
||||
【Two Competing Approaches】
|
||||
|
||||
## Approach A: Copilot's "Proper" Global Tracking
|
||||
```rust
|
||||
pub struct SharedState {
|
||||
// Existing fields...
|
||||
pub instance_registry: Arc<Mutex<Vec<Weak<Mutex<InstanceBox>>>>>,
|
||||
}
|
||||
|
||||
fn invalidate_weak_references(&mut self, target_info: &str) {
|
||||
// Linear search through ALL instances in the system
|
||||
for weak_instance in &self.instance_registry {
|
||||
if let Some(instance) = weak_instance.upgrade() {
|
||||
instance.lock().unwrap().invalidate_weak_references_to(target_info);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Pros**: Architecturally correct, immediate invalidation, theoretically perfect
|
||||
**Cons**: O(n) linear search, complex state management, heavyweight
|
||||
|
||||
## Approach B: Gemini's "On-Access" Lazy Invalidation
|
||||
```rust
|
||||
pub struct Interpreter {
|
||||
pub invalidated_ids: Arc<Mutex<HashSet<u64>>>, // Simple ID set
|
||||
}
|
||||
|
||||
fn trigger_weak_reference_invalidation(&mut self, target_info: &str) {
|
||||
if let Ok(id) = target_info.parse::<u64>() {
|
||||
self.invalidated_ids.lock().unwrap().insert(id); // O(1) operation
|
||||
}
|
||||
}
|
||||
|
||||
fn get_weak_field(&self, name: &str) -> Option<...> {
|
||||
if invalidated_ids.contains(&id) { // O(1) lookup
|
||||
return None; // Auto-nil on access
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Pros**: O(1) operations, minimal changes, leverages 99% existing implementation
|
||||
**Cons**: Delayed invalidation (only on access), not "immediate"
|
||||
|
||||
【Critical Considerations】
|
||||
|
||||
## 1. Native Compilation Impact
|
||||
This weak reference system will be compiled to native code. Performance characteristics matter significantly:
|
||||
- Approach A: O(n) linear search in native code = potential bottleneck
|
||||
- Approach B: O(1) HashSet operations = predictable performance
|
||||
|
||||
## 2. Foundation Quality vs Pragmatism
|
||||
- This is foundational memory safety infrastructure
|
||||
- Must balance correctness with performance
|
||||
- Real-world usage patterns matter more than theoretical perfection
|
||||
|
||||
## 3. Scaling Characteristics
|
||||
In applications with 1000+ objects:
|
||||
- Approach A: 1000+ instance traversal on each drop
|
||||
- Approach B: Single hash table insertion/lookup
|
||||
|
||||
## 4. Maintenance Complexity
|
||||
- Approach A: Complex global state, threading issues, lifecycle management
|
||||
- Approach B: Simple addition to existing interpreter state
|
||||
|
||||
【Specific Technical Questions】
|
||||
|
||||
1. **Performance Reality Check**: In a native-compiled language, is O(n) weak reference invalidation acceptable for real applications?
|
||||
|
||||
2. **Lazy vs Eager Trade-off**: Is "on-access invalidation" a viable pattern for systems programming? What are the hidden costs?
|
||||
|
||||
3. **Native Compilation Compatibility**: Which approach translates better to efficient native code generation?
|
||||
|
||||
4. **Memory Safety Guarantee**: Do both approaches provide equivalent memory safety guarantees?
|
||||
|
||||
5. **Industry Best Practices**: How do modern systems languages (Rust, Swift, etc.) handle this problem?
|
||||
|
||||
【Nyash Context】
|
||||
- Everything is Box philosophy (unified object model)
|
||||
- Target: P2P networking applications (performance-sensitive)
|
||||
- Native compilation planned (MIR → LLVM/Cranelift)
|
||||
- Developer experience priority (simplicity over theoretical perfection)
|
||||
|
||||
【Request】
|
||||
Please provide expert analysis focusing on:
|
||||
1. Real-world performance implications for native compilation
|
||||
2. Hidden complexity costs of each approach
|
||||
3. Recommendation for foundational language infrastructure
|
||||
4. Risk assessment for future scaling
|
||||
|
||||
This decision affects the entire language's memory management foundation. I need the most technically sound recommendation that balances correctness, performance, and maintainability.
|
||||
|
||||
Thank you for your expertise!
|
||||
@ -1,51 +0,0 @@
|
||||
Nyashプログラミング言語のコンストラクタ設計について深い相談です。
|
||||
|
||||
【Nyashの現在の設計哲学】
|
||||
Nyashは既に「コンストラクタの明示的呼び出し」を採用しています。これは以下の理由によるものです:
|
||||
- 明示性重視:プログラマーが何が起きているかを隠さない
|
||||
- 初学者フレンドリー:実行順序が直感的
|
||||
- Everything is Box哲学:隠れた魔法的な動作を避ける
|
||||
|
||||
【他言語の問題例】
|
||||
```cpp
|
||||
// C++:複雑で読みにくい
|
||||
class Cat : public Animal {
|
||||
Toy catToy; // 1. 隠れたメンバー初期化
|
||||
Cat(string name) : Animal(name) { // 2. : Animal(name) が直感的でない
|
||||
// 3. 最後に自分の処理
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
【現在のNyash vs 新提案】
|
||||
```nyash
|
||||
// 現在の書き方
|
||||
box MeshNode : P2PBox {
|
||||
constructor(nodeId, world) {
|
||||
super P2PBox(nodeId, world) // 特別なキーワード
|
||||
me.routing = RoutingTable()
|
||||
}
|
||||
}
|
||||
|
||||
// 新提案:完全統一
|
||||
box MeshNode : P2PBox {
|
||||
constructor(nodeId, world) {
|
||||
from P2PBox.constructor(nodeId, world) // from統一!
|
||||
me.routing = RoutingTable()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
【完全統一のメリット】
|
||||
- from P2PBox.method() と完全に一貫している
|
||||
- 「どの親の何を呼んでいるか」が超明確
|
||||
- 多重デリゲーションでも from Logger.constructor() で区別可能
|
||||
|
||||
【深く考えてほしい点】
|
||||
1. Nyashの明示的コンストラクタ呼び出し設計をどう評価しますか?
|
||||
2. from P2PBox.constructor() の完全統一案をどう思いますか?
|
||||
3. 他言語(Java, Python, C#等)と比較したNyashの優位性は?
|
||||
4. 初学者にとって最も理解しやすい設計は?
|
||||
5. 言語の美しさ・一貫性の観点からの評価は?
|
||||
|
||||
プログラミング言語設計の専門的視点から、深く分析してください。
|
||||
@ -1,106 +0,0 @@
|
||||
Nyashプログラミング言語のオーバーライド設計について深い相談です。
|
||||
|
||||
【現在発見された実装問題】
|
||||
現在のNyashでは HashMap::insert により「暗黙のオーバーライド」が発生している:
|
||||
```rust
|
||||
// instance.rs - add_method関数
|
||||
pub fn add_method(&mut self, method_name: String, method_ast: ASTNode) {
|
||||
let mut new_methods = (*self.methods).clone();
|
||||
new_methods.insert(method_name, method_ast); // ← 同名で上書き!
|
||||
self.methods = Arc::new(new_methods);
|
||||
}
|
||||
```
|
||||
|
||||
これにより以下が可能になってしまっている:
|
||||
```nyash
|
||||
box Node {
|
||||
send(msg) { // 最初の定義
|
||||
print("Version 1")
|
||||
}
|
||||
|
||||
send(msg) { // 暗黙に上書きされる
|
||||
print("Version 2") // ← こちらだけが残る
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
【Nyashの設計哲学との矛盾】
|
||||
- **明示性重視**: 何が起きているかを隠さない
|
||||
- **Everything is Box**: 統一された世界観
|
||||
- **from デリゲーション**: `from Parent.method()` の明示的呼び出し
|
||||
- **初学者フレンドリー**: 複雑な概念を分かりやすく表現
|
||||
|
||||
【提案する修正方針】
|
||||
|
||||
**1. 暗黙のオーバーライドを完全禁止**
|
||||
```nyash
|
||||
box Node {
|
||||
send(msg) {
|
||||
print("Version 1")
|
||||
}
|
||||
|
||||
send(msg) { // ← コンパイルエラーにする
|
||||
print("Version 2")
|
||||
}
|
||||
}
|
||||
// Error: Method 'send' is already defined. Use 'override' keyword if intentional.
|
||||
```
|
||||
|
||||
**2. コンストラクタのオーバーロード禁止**
|
||||
```nyash
|
||||
box Node {
|
||||
constructor(id) {
|
||||
me.id = id
|
||||
}
|
||||
|
||||
constructor(id, name) { // ← エラーにする
|
||||
me.id = id
|
||||
me.name = name
|
||||
}
|
||||
}
|
||||
// Error: Constructor overloading is not allowed. Use explicit initialization.
|
||||
```
|
||||
|
||||
**3. デリゲーションでの明示的override**
|
||||
```nyash
|
||||
box MeshNode : P2PBox {
|
||||
// 明示的にオーバーライドする意図を示す
|
||||
override send(intent, data, target) {
|
||||
me.routing.log(target)
|
||||
from P2PBox.send(intent, data, target) // 親の実装も呼べる
|
||||
}
|
||||
|
||||
// 新しいメソッド(overrideなし)
|
||||
sendWithRetry(intent, data, target) {
|
||||
// 新機能
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**4. エラーメッセージの改善**
|
||||
- 重複定義時: "Method 'send' already exists. Use 'override' if you want to replace parent method."
|
||||
- override不正使用時: "Method 'newMethod' does not exist in parent. Remove 'override' keyword."
|
||||
|
||||
【深く考えてほしい点】
|
||||
|
||||
**1. 哲学的整合性**
|
||||
- この方針はNyashの「明示性重視」「Everything is Box」哲学と整合しますか?
|
||||
- `from Parent.method()` デリゲーション設計との相性は?
|
||||
|
||||
**2. 学習コスト vs 安全性**
|
||||
- `override` キーワード追加による学習コストは妥当ですか?
|
||||
- 暗黙のオーバーライド禁止により、どの程度安全性が向上しますか?
|
||||
|
||||
**3. デリゲーションとの関係**
|
||||
- デリゲーション先メソッドを `override` するのは自然ですか?
|
||||
- 多重デリゲーション時の `override` はどう扱うべきですか?
|
||||
|
||||
**4. 実装上の課題**
|
||||
- コンパイル時の重複チェック実装の複雑度は?
|
||||
- 既存コードへの影響と移行戦略は?
|
||||
|
||||
**5. 他言語との比較優位性**
|
||||
- Java/C#の `@Override` や TypeScript の `override` との違いは?
|
||||
- Nyashならではの独自価値は何ですか?
|
||||
|
||||
プログラミング言語設計の専門的視点から、この方針がNyashの目指す「明示的で安全、かつ初学者フレンドリーな言語」に最適かどうか深く分析してください。
|
||||
@ -1,73 +0,0 @@
|
||||
Nyash言語のweak参照システム最終実装について技術的相談をお願いします。
|
||||
|
||||
【現在の状況】
|
||||
copilot様がweak参照システムを99%完成させました。驚くべき実装品質です。
|
||||
|
||||
【✅ 完成済みの素晴らしい実装】
|
||||
1. ハイブリッド構造: fields + fields_ng 併用システム
|
||||
2. weak参照専用メソッド: set_weak_field(), get_weak_field()
|
||||
3. 文字列ベース追跡: "WEAK_REF_TO:..." → "WEAK_REFERENCE_DROPPED"
|
||||
4. インタープリター統合: weak参照の検出・代入・アクセス完璧
|
||||
5. 5つの包括的テストケース
|
||||
|
||||
【⚠️ 残り1%の課題】
|
||||
単一関数 trigger_weak_reference_invalidation() が未実装:
|
||||
|
||||
```rust
|
||||
pub(super) fn trigger_weak_reference_invalidation(&mut self, target_info: &str) {
|
||||
eprintln!("🔗 DEBUG: Triggering global weak reference invalidation for: {}", target_info);
|
||||
|
||||
// TODO: Real implementation would require tracking all instances
|
||||
// and their weak references
|
||||
}
|
||||
```
|
||||
|
||||
【現在の動作】
|
||||
```
|
||||
✅ weak参照検出: 完璧 (🔗 DEBUG: Assigning to weak field 'parent')
|
||||
✅ ドロップ検出: 動作中 (🔗 DEBUG: Variable 'parent' set to 0)
|
||||
✅ 無効化呼び出し: 実行中 (🔗 DEBUG: Triggering global weak reference invalidation)
|
||||
❌ 実際のnil化: 未接続 (🔗 DEBUG: Weak field 'parent' still has valid reference)
|
||||
```
|
||||
|
||||
【copilot提案の実装アプローチ】
|
||||
グローバルインスタンス追跡システム:
|
||||
|
||||
```rust
|
||||
pub struct SharedState {
|
||||
// 既存フィールド...
|
||||
pub instance_registry: Arc<Mutex<Vec<Weak<Mutex<InstanceBox>>>>>,
|
||||
}
|
||||
|
||||
impl SharedState {
|
||||
fn register_instance(&mut self, instance: Weak<Mutex<InstanceBox>>) { ... }
|
||||
fn invalidate_weak_references(&mut self, target_info: &str) {
|
||||
// 全インスタンスを走査してweak参照を無効化
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
【技術的課題】
|
||||
1. 全InstanceBox作成時のグローバル登録必要
|
||||
2. 複雑なスレッドセーフティ管理
|
||||
3. デッドweak参照のガベージコレクション
|
||||
4. 5+ファイルにわたる変更
|
||||
|
||||
【代替案検討の観点】
|
||||
1. **より簡単な実装**: グローバル追跡なしで実現可能?
|
||||
2. **性能重視**: シンプルな文字列マッチングで十分?
|
||||
3. **段階的実装**: デモレベルで動作する最小実装?
|
||||
|
||||
【具体的質問】
|
||||
1. グローバルインスタンス追跡は本当に必要ですか?
|
||||
2. copilotの文字列ベース追跡をより簡単に完成できますか?
|
||||
3. 「target_info」による簡単なマッチング実装は可能ですか?
|
||||
4. デモ目的なら手動的な実装で十分ではないですか?
|
||||
|
||||
【Nyashの設計哲学】
|
||||
- Everything is Box: すべてがBoxオブジェクト
|
||||
- 明示性重視: 隠れた動作を避ける
|
||||
- シンプル重視: 初学者フレンドリー
|
||||
- 実用性優先: 完璧より動くもの
|
||||
|
||||
プログラミング言語実装の専門的観点から、最もシンプルで実装しやすいアプローチを提案してください。copilot様の99%完成した実装を活かしつつ、最後の1%を効率的に完成させる方法をお願いします。
|
||||
262
docs/archive/mir-26-specification.md
Normal file
262
docs/archive/mir-26-specification.md
Normal file
@ -0,0 +1,262 @@
|
||||
# 🤖 Nyash MIR 26命令仕様書 (ChatGPT5設計版)
|
||||
|
||||
*Everything is Box哲学・完璧なIR化実現 - 2025年8月17日版*
|
||||
|
||||
## 🎯 **概要**
|
||||
|
||||
Nyash MIR 26命令は、ChatGPT5 + AI大会議により設計された、「化け物に伸びる余白」と「実装の現実」の最適バランスを実現する中間表現です。
|
||||
|
||||
### **🌟 設計思想**
|
||||
- **RISC原則**: 直交性・シンプル性重視
|
||||
- **階層化設計**: Tier-0/1/2による段階的実装
|
||||
- **Everything is Box**: Box中心のセマンティクス
|
||||
- **Effect System**: 最適化安全性の確保
|
||||
- **所有権森**: メモリ安全性の言語レベル保証
|
||||
|
||||
## 🏗️ **26命令完全仕様**
|
||||
|
||||
### **Tier-0: 普遍的コア (8命令)**
|
||||
コンパイラ・仮想マシンの基盤となる必須命令
|
||||
|
||||
| 命令 | 形式 | 効果 | 説明 |
|
||||
|------|------|------|------|
|
||||
| **Const** | `%dst = const value` | pure | 定数値生成 |
|
||||
| **BinOp** | `%dst = %lhs op %rhs` | pure | 二項演算(+,-,*,/,==,!=,<,>,and,or等) |
|
||||
| **Compare** | `%dst = %lhs cmp %rhs` | pure | 比較演算(専用最適化用) |
|
||||
| **Branch** | `br %cond -> %then, %else` | control | 条件分岐 |
|
||||
| **Jump** | `jmp %target` | control | 無条件ジャンプ |
|
||||
| **Phi** | `%dst = phi [%val1:%bb1, %val2:%bb2]` | pure | SSA φ関数 |
|
||||
| **Call** | `%dst = call %func(%args...)` | context | 関数呼び出し |
|
||||
| **Return** | `ret %value?` | control | 関数戻り |
|
||||
|
||||
### **Tier-1: Nyashセマンティクス (13命令)**
|
||||
Everything is Box哲学の核心実装
|
||||
|
||||
| 命令 | 形式 | 効果 | 説明 |
|
||||
|------|------|------|------|
|
||||
| **NewBox** | `%dst = new_box "Type"(%args...)` | mut | 強所有Box生成(所有森ノード) |
|
||||
| **BoxFieldLoad** | `%dst = %box.field` | pure | Boxフィールド読み取り |
|
||||
| **BoxFieldStore** | `%box.field = %value` | mut | Boxフィールド書き込み |
|
||||
| **BoxCall** | `%dst = %box.method(%args...)` | context | Boxメソッド呼び出し |
|
||||
| **ExternCall** | `%dst = extern %iface.method(%args...)` | context | 外部ライブラリ呼び出し |
|
||||
| **Safepoint** | `safepoint` | io | 分割fini・割込み許可ポイント |
|
||||
| **RefGet** | `%dst = ref_get %ref` | pure | 参照から値取得 |
|
||||
| **RefSet** | `ref_set %ref = %value` | mut | 参照先差し替え(所有規則検証付き) |
|
||||
| **WeakNew** | `%dst = weak_new %box` | pure | weak参照生成 |
|
||||
| **WeakLoad** | `%dst = weak_load %weak` | pure | weak参照から値取得(失効時null) |
|
||||
| **WeakCheck** | `%dst = weak_check %weak` | pure | weak参照生存確認 |
|
||||
| **Send** | `send %data -> %target` | io | Bus送信 |
|
||||
| **Recv** | `%dst = recv %source` | io | Bus受信 |
|
||||
|
||||
### **Tier-2: 実装補助・最適化友好 (5命令)**
|
||||
JIT/AOT最適化の基盤
|
||||
|
||||
| 命令 | 形式 | 効果 | 説明 |
|
||||
|------|------|------|------|
|
||||
| **TailCall** | `tail_call %func(%args...)` | control | 末尾呼び出し最適化 |
|
||||
| **Adopt** | `adopt %parent <- %child` | mut | 所有権移管(親が子を取り込み) |
|
||||
| **Release** | `release %ref` | mut | 強所有解除(weak化/null化) |
|
||||
| **MemCopy** | `memcopy %dst <- %src, %size` | mut | 小規模メモリ移動最適化 |
|
||||
| **AtomicFence** | `atomic_fence %ordering` | io | 並行時順序保証 |
|
||||
|
||||
## 🎭 **Effect System - 最適化基盤**
|
||||
|
||||
### **効果分類と最適化ルール**
|
||||
|
||||
#### **Pure効果 (8命令)**
|
||||
```
|
||||
Const, BinOp, Compare, Phi, BoxFieldLoad, RefGet, WeakNew, WeakLoad, WeakCheck
|
||||
```
|
||||
- ✅ **再順序化可能**: 副作用なし
|
||||
- ✅ **共通部分式除去**: 同一計算結果再利用
|
||||
- ✅ **不変コード移動**: ループ外移動可能
|
||||
|
||||
#### **Mut効果 (5命令)**
|
||||
```
|
||||
NewBox, BoxFieldStore, RefSet, Adopt, Release, MemCopy
|
||||
```
|
||||
- ⚠️ **同一リソース順序保持**: 同じBox/同じFieldで依存関係維持
|
||||
- ✅ **異なるリソース並列化**: 別Box操作は並列実行可能
|
||||
|
||||
#### **Io効果 (4命令)**
|
||||
```
|
||||
Safepoint, Send, Recv, AtomicFence
|
||||
```
|
||||
- 🔒 **順序保持必須**: プログラム順序で実行
|
||||
- ❌ **再順序化禁止**: 副作用の整合性確保
|
||||
|
||||
#### **Control効果 (4命令)**
|
||||
```
|
||||
Branch, Jump, Return, TailCall
|
||||
```
|
||||
- 🌊 **制御フロー変更**: 基本ブロック境界制御
|
||||
- 📊 **静的解析対象**: CFG構築・到達可能性解析
|
||||
|
||||
#### **Context依存効果 (3命令)**
|
||||
```
|
||||
Call, BoxCall, ExternCall
|
||||
```
|
||||
- 🔄 **呼び出し先依存**: 関数・メソッドの効果を継承
|
||||
- 📝 **BID/型情報**: ExternCallはBID仕様から効果決定
|
||||
|
||||
## 🔧 **所有権森システム**
|
||||
|
||||
### **強参照森 (Ownership Forest)**
|
||||
```rust
|
||||
// 基本原則: strong in-degree ≤ 1
|
||||
%parent = NewBox "Parent"()
|
||||
%child = NewBox "Child"()
|
||||
Adopt %parent <- %child // 子を親の強所有に移管
|
||||
```
|
||||
|
||||
#### **検証ルール**
|
||||
- ✅ **DAG構造保証**: 強参照による循環禁止
|
||||
- ✅ **単一所有**: 各Boxは最大1つの強参照のみ
|
||||
- ✅ **所有移管**: Adopt/Releaseによる安全な移転
|
||||
|
||||
### **weak参照システム**
|
||||
```rust
|
||||
%weak = WeakNew %box // weak参照生成
|
||||
%alive = WeakCheck %weak // 生存確認 (bool)
|
||||
%value = WeakLoad %weak // 値取得 (失効時null)
|
||||
```
|
||||
|
||||
#### **決定的挙動**
|
||||
- 🎯 **失効時null**: WeakLoadは例外なしでnull返却
|
||||
- 🎯 **失効時false**: WeakCheckは例外なしでfalse返却
|
||||
- 🔒 **所有権なし**: weakは削除を阻止しない
|
||||
|
||||
## 🚀 **削減戦略 - 35命令からの移行**
|
||||
|
||||
### **削除対象命令 (17命令)**
|
||||
|
||||
#### **BinOpに統合**
|
||||
- `UnaryOp` → `BinOp`(not %a → %a xor true)
|
||||
|
||||
#### **BoxField操作に統合**
|
||||
- `Load/Store` → `BoxFieldLoad/BoxFieldStore`
|
||||
- `ArrayGet/ArraySet` → `BoxFieldLoad/BoxFieldStore`(配列もBoxのフィールド)
|
||||
|
||||
#### **intrinsic化**
|
||||
```rust
|
||||
// 削除前
|
||||
Print %value
|
||||
Debug %value "message"
|
||||
|
||||
// 削除後(intrinsic化)
|
||||
Call @print, %value
|
||||
Call @debug, %value, "message"
|
||||
```
|
||||
|
||||
#### **完全削除**
|
||||
- `Copy, Nop` → 最適化パス専用(MIRから除外)
|
||||
- `TypeCheck, Cast` → 型システム・最適化で処理
|
||||
- `Throw/Catch` → Call経由例外ハンドリング
|
||||
|
||||
#### **統合・置換**
|
||||
- `RefNew` → 削除(RefGetで代用)
|
||||
- `BarrierRead/BarrierWrite` → `AtomicFence`統合
|
||||
- `FutureNew/FutureSet/Await` → `NewBox + BoxCall`実装
|
||||
|
||||
### **新規追加命令 (10命令)**
|
||||
|
||||
#### **Box操作の明示化**
|
||||
- `BoxFieldLoad/BoxFieldStore` → Everything is Box核心
|
||||
- `Adopt/Release` → 所有権移管の明示
|
||||
|
||||
#### **弱参照完全対応**
|
||||
- `WeakCheck` → 生存確認の明示
|
||||
- `Send/Recv` → Bus操作の一次市民化
|
||||
|
||||
#### **最適化基盤**
|
||||
- `TailCall, MemCopy, AtomicFence` → JIT/AOT準備
|
||||
|
||||
## 📊 **段階的移行戦略**
|
||||
|
||||
### **Phase 1: 共存実装 (1週間)**
|
||||
- 新旧命令両対応のMIRパーサー実装
|
||||
- `BoxFieldLoad/BoxFieldStore`等の新命令追加
|
||||
- 既存命令は保持したまま新形式も受け入れ
|
||||
|
||||
### **Phase 2: フロントエンド移行 (1週間)**
|
||||
- AST→MIR生成を新形式のみに変更
|
||||
- `Load/Store`の代わりに`BoxFieldLoad/BoxFieldStore`生成
|
||||
- intrinsic化対象は`Call @intrinsic_name`形式で生成
|
||||
|
||||
### **Phase 3: 最適化パス移行 (1週間)**
|
||||
- 全最適化パスを新命令対応に修正
|
||||
- Effect分類の正確な実装
|
||||
- 所有権森検証ルール実装
|
||||
|
||||
### **Phase 4: バックエンド移行 (1週間)**
|
||||
- Interpreter/VM/WASMの新命令対応
|
||||
- intrinsic関数の実装(@print, @debug等)
|
||||
- 削除予定命令の段階的無効化
|
||||
|
||||
### **Phase 5: 旧命令削除 (1週間)**
|
||||
- 削除対象17命令の完全除去
|
||||
- テストスイート更新
|
||||
- ドキュメント整備
|
||||
|
||||
## 🧪 **検証・テスト戦略**
|
||||
|
||||
### **Golden MIR テスト**
|
||||
```bash
|
||||
# 全バックエンドでMIR出力一致確認
|
||||
./target/release/nyash --dump-mir-26 program.nyash > golden.mir
|
||||
./target/release/nyash --backend vm --dump-mir-26 program.nyash > vm.mir
|
||||
./target/release/nyash --backend wasm --dump-mir-26 program.nyash > wasm.mir
|
||||
diff golden.mir vm.mir && diff vm.mir wasm.mir
|
||||
```
|
||||
|
||||
### **所有権森検証**
|
||||
```rust
|
||||
// 検証項目
|
||||
fn verify_ownership_forest(mir: &MirModule) -> Result<(), VerifyError> {
|
||||
// 1. strong in-degree ≤ 1
|
||||
verify_strong_indegree_constraint()?;
|
||||
// 2. 強循環禁止(DAG構造)
|
||||
verify_no_strong_cycles()?;
|
||||
// 3. WeakLoad/WeakCheck決定的挙動
|
||||
verify_weak_determinism()?;
|
||||
}
|
||||
```
|
||||
|
||||
### **Effect System検証**
|
||||
```rust
|
||||
// 最適化安全性確認
|
||||
fn verify_effect_system(mir: &MirModule) -> Result<(), VerifyError> {
|
||||
// Pure命令の再順序化安全性
|
||||
verify_pure_reordering_safety()?;
|
||||
// Mut命令の依存関係保持
|
||||
verify_mut_dependency_preservation()?;
|
||||
// Io命令の順序保証
|
||||
verify_io_order_preservation()?;
|
||||
}
|
||||
```
|
||||
|
||||
## 🎯 **成功基準**
|
||||
|
||||
### **必須基準**
|
||||
- [ ] **26命令完全実装**: 全命令が仕様通り動作
|
||||
- [ ] **Effect System動作**: 4種効果の正確な分類・最適化
|
||||
- [ ] **所有権森検証**: 強参照森・weak参照の安全性保証
|
||||
- [ ] **Golden MIRテスト**: 全バックエンドでMIR一致
|
||||
- [ ] **性能維持**: 削減後も性能劣化なし
|
||||
|
||||
### **理想基準**
|
||||
- [ ] **最適化効果実証**: pure再順序化・CSE/LICM動作確認
|
||||
- [ ] **所有権森活用**: Adopt/Releaseによる効率的メモリ管理
|
||||
- [ ] **JIT準備完了**: TailCall/MemCopyの最適化基盤確立
|
||||
|
||||
## 📚 **関連ドキュメント**
|
||||
|
||||
- **ChatGPT5仕様**: `docs/予定/native-plan/copilot_issues_phase0_to_94.txt`
|
||||
- **実装移行計画**: `docs/予定/native-plan/issues/phase_8_5_mir_35_to_26_reduction.md`
|
||||
- **Effect System詳細**: `docs/nyir/effect-system-specification.md`
|
||||
|
||||
---
|
||||
|
||||
**策定**: ChatGPT5 + AI大会議
|
||||
**Gemini評価**: 「極めて健全」「断行推奨」
|
||||
**実装目標**: 2025年9月完了予定
|
||||
@ -1,668 +0,0 @@
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/simple_notepad_ascii.rs` found to be present in multiple build targets:
|
||||
* `bin` target `nyash_notepad_ascii`
|
||||
* `example` target `simple_notepad_ascii`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/nyash_explorer.rs` found to be present in multiple build targets:
|
||||
* `bin` target `nyash_explorer`
|
||||
* `example` target `nyash_explorer`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/test_icon_extraction.rs` found to be present in multiple build targets:
|
||||
* `bin` target `test_icon_extraction`
|
||||
* `example` target `test_icon_extraction`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/nyash_notepad_jp.rs` found to be present in multiple build targets:
|
||||
* `bin` target `nyash_notepad_jp`
|
||||
* `example` target `nyash_notepad_jp`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/simple_notepad.rs` found to be present in multiple build targets:
|
||||
* `bin` target `simple_notepad`
|
||||
* `example` target `simple_notepad`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/debug_notepad.rs` found to be present in multiple build targets:
|
||||
* `bin` target `debug_notepad`
|
||||
* `example` target `debug_notepad`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/nyash_explorer_with_icons.rs` found to be present in multiple build targets:
|
||||
* `bin` target `nyash_explorer_icons`
|
||||
* `example` target `nyash_explorer_with_icons`
|
||||
warning: file `/mnt/c/git/nyash-project/nyash/examples/simple_notepad_v2.rs` found to be present in multiple build targets:
|
||||
* `bin` target `nyash_notepad`
|
||||
* `example` target `simple_notepad_v2`
|
||||
warning: unused import: `next_box_id`
|
||||
--> src/boxes/math_box.rs:59:84
|
||||
|
|
||||
59 | use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox, BoxCore, BoxBase, next_box_id};
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unused_imports)]` on by default
|
||||
|
||||
warning: unused import: `next_box_id`
|
||||
--> src/boxes/debug_box.rs:105:42
|
||||
|
|
||||
105 | use crate::box_trait::{BoxCore, BoxBase, next_box_id, NyashBox, StringBox, BoolBox, VoidBox};
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `next_box_id`
|
||||
--> src/boxes/null_box.rs:87:72
|
||||
|
|
||||
87 | use crate::box_trait::{NyashBox, StringBox, BoolBox, BoxCore, BoxBase, next_box_id};
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `std::future::Future`
|
||||
--> src/boxes/future/mod.rs:7:5
|
||||
|
|
||||
7 | use std::future::Future;
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `std::pin::Pin`
|
||||
--> src/boxes/future/mod.rs:8:5
|
||||
|
|
||||
8 | use std::pin::Pin;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `crate::boxes::map_box::MapBox`
|
||||
--> src/boxes/http/mod.rs:9:5
|
||||
|
|
||||
9 | use crate::boxes::map_box::MapBox;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused imports: `Arc` and `Mutex`
|
||||
--> src/boxes/http/mod.rs:11:17
|
||||
|
|
||||
11 | use std::sync::{Arc, Mutex};
|
||||
| ^^^ ^^^^^
|
||||
|
||||
warning: unused import: `Mutex`
|
||||
--> src/boxes/regex/mod.rs:9:22
|
||||
|
|
||||
9 | use std::sync::{Arc, Mutex};
|
||||
| ^^^^^
|
||||
|
||||
warning: unused import: `self`
|
||||
--> src/boxes/intent_box.rs:38:16
|
||||
|
|
||||
38 | use std::fmt::{self, Debug};
|
||||
| ^^^^
|
||||
|
||||
warning: unused macro definition: `debug_fuel`
|
||||
--> src/parser/expressions.rs:38:14
|
||||
|
|
||||
38 | macro_rules! debug_fuel {
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unused_macros)]` on by default
|
||||
|
||||
warning: unused macro definition: `debug_fuel`
|
||||
--> src/parser/mod.rs:51:14
|
||||
|
|
||||
51 | macro_rules! debug_fuel {
|
||||
| ^^^^^^^^^^
|
||||
|
||||
warning: unused imports: `AddBox`, `DivideBox`, `MultiplyBox`, and `SubtractBox`
|
||||
--> src/interpreter/mod.rs:10:75
|
||||
|
|
||||
10 | use crate::box_trait::{NyashBox, StringBox, IntegerBox, BoolBox, VoidBox, AddBox, SubtractBox, MultiplyBox, DivideBox, CompareBox, ArrayB...
|
||||
| ^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^
|
||||
|
||||
warning: unused import: `FloatBox`
|
||||
--> src/interpreter/mod.rs:13:39
|
||||
|
|
||||
13 | use crate::boxes::math_box::{MathBox, FloatBox, RangeBox};
|
||||
| ^^^^^^^^
|
||||
|
||||
warning: unused import: `DateTimeBox`
|
||||
--> src/interpreter/mod.rs:14:39
|
||||
|
|
||||
14 | use crate::boxes::time_box::{TimeBox, DateTimeBox, TimerBox};
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `file::FileBox`
|
||||
--> src/interpreter/expressions.rs:12:104
|
||||
|
|
||||
12 | use crate::boxes::{FloatBox, MathBox, ConsoleBox, TimeBox, DateTimeBox, RandomBox, SoundBox, DebugBox, file::FileBox, MapBox};
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `std::sync::Arc`
|
||||
--> src/interpreter/objects.rs:12:5
|
||||
|
|
||||
12 | use std::sync::Arc;
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `StringBox`
|
||||
--> src/interpreter/methods/collection_methods.rs:11:24
|
||||
|
|
||||
11 | use crate::box_trait::{StringBox, IntegerBox, NyashBox, BoolBox};
|
||||
| ^^^^^^^^^
|
||||
|
||||
warning: unused imports: `IntegerBox` and `StringBox`
|
||||
--> src/interpreter/methods/data_methods.rs:11:34
|
||||
|
|
||||
11 | use crate::box_trait::{NyashBox, StringBox, IntegerBox};
|
||||
| ^^^^^^^^^ ^^^^^^^^^^
|
||||
|
||||
warning: unused import: `StringBox`
|
||||
--> src/interpreter/methods/network_methods.rs:10:34
|
||||
|
|
||||
10 | use crate::box_trait::{NyashBox, StringBox};
|
||||
| ^^^^^^^^^
|
||||
|
||||
warning: unused import: `BoolBox`
|
||||
--> src/interpreter/methods/p2p_methods.rs:9:45
|
||||
|
|
||||
9 | use crate::box_trait::{NyashBox, StringBox, BoolBox};
|
||||
| ^^^^^^^
|
||||
|
||||
warning: unused import: `crate::method_box::MethodBox`
|
||||
--> src/interpreter/methods/p2p_methods.rs:11:5
|
||||
|
|
||||
11 | use crate::method_box::MethodBox;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `basic_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:27:9
|
||||
|
|
||||
27 | pub use basic_methods::*;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `collection_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:28:9
|
||||
|
|
||||
28 | pub use collection_methods::*;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `io_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:29:9
|
||||
|
|
||||
29 | pub use io_methods::*;
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `data_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:30:9
|
||||
|
|
||||
30 | pub use data_methods::*;
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `network_methods::*`
|
||||
--> src/interpreter/methods/mod.rs:31:9
|
||||
|
|
||||
31 | pub use network_methods::*;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `std::sync::Arc`
|
||||
--> src/operator_traits.rs:16:5
|
||||
|
|
||||
16 | use std::sync::Arc;
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `std::sync::Arc`
|
||||
--> src/transport/mod.rs:10:5
|
||||
|
|
||||
10 | use std::sync::Arc;
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `Write`
|
||||
--> src/boxes/stream/mod.rs:10:21
|
||||
|
|
||||
10 | use std::io::{Read, Write, Result};
|
||||
| ^^^^^
|
||||
|
||||
warning: unused import: `Read`
|
||||
--> src/boxes/stream/mod.rs:10:15
|
||||
|
|
||||
10 | use std::io::{Read, Write, Result};
|
||||
| ^^^^
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:26:28
|
||||
|
|
||||
26 | pub fn http_get(&self, url: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
|
||||
= note: `#[warn(unused_variables)]` on by default
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:31:24
|
||||
|
|
||||
31 | pub fn post(&self, url: Box<dyn NyashBox>, body: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
||||
warning: unused variable: `body`
|
||||
--> src/boxes/http/mod.rs:31:48
|
||||
|
|
||||
31 | pub fn post(&self, url: Box<dyn NyashBox>, body: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^^ help: if this is intentional, prefix it with an underscore: `_body`
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:36:23
|
||||
|
|
||||
36 | pub fn put(&self, url: Box<dyn NyashBox>, body: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
||||
warning: unused variable: `body`
|
||||
--> src/boxes/http/mod.rs:36:47
|
||||
|
|
||||
36 | pub fn put(&self, url: Box<dyn NyashBox>, body: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^^ help: if this is intentional, prefix it with an underscore: `_body`
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:41:26
|
||||
|
|
||||
41 | pub fn delete(&self, url: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
||||
warning: unused variable: `method`
|
||||
--> src/boxes/http/mod.rs:46:27
|
||||
|
|
||||
46 | pub fn request(&self, method: Box<dyn NyashBox>, url: Box<dyn NyashBox>, options: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^^^^ help: if this is intentional, prefix it with an underscore: `_method`
|
||||
|
||||
warning: unused variable: `url`
|
||||
--> src/boxes/http/mod.rs:46:54
|
||||
|
|
||||
46 | pub fn request(&self, method: Box<dyn NyashBox>, url: Box<dyn NyashBox>, options: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^ help: if this is intentional, prefix it with an underscore: `_url`
|
||||
|
||||
warning: unused variable: `options`
|
||||
--> src/boxes/http/mod.rs:46:78
|
||||
|
|
||||
46 | pub fn request(&self, method: Box<dyn NyashBox>, url: Box<dyn NyashBox>, options: Box<dyn NyashBox>) -> Box<dyn NyashBox> {
|
||||
| ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_options`
|
||||
|
||||
warning: variable `arg_count` is assigned to, but never used
|
||||
--> src/parser/expressions.rs:246:33
|
||||
|
|
||||
246 | let mut arg_count = 0;
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: consider using `_arg_count` instead
|
||||
|
||||
warning: unused variable: `name`
|
||||
--> src/parser/statements.rs:69:35
|
||||
|
|
||||
69 | TokenType::IDENTIFIER(name) => {
|
||||
| ^^^^ help: if this is intentional, prefix it with an underscore: `_name`
|
||||
|
||||
warning: variable `statement_count` is assigned to, but never used
|
||||
--> src/parser/mod.rs:132:17
|
||||
|
|
||||
132 | let mut statement_count = 0;
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: consider using `_statement_count` instead
|
||||
|
||||
warning: unused variable: `i`
|
||||
--> src/interpreter/expressions.rs:554:22
|
||||
|
|
||||
554 | for (i, arg) in arguments.iter().enumerate() {
|
||||
| ^ help: if this is intentional, prefix it with an underscore: `_i`
|
||||
|
||||
warning: variable `result` is assigned to, but never used
|
||||
--> src/interpreter/expressions.rs:899:21
|
||||
|
|
||||
899 | let mut result: Box<dyn NyashBox> = Box::new(VoidBox::new());
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: consider using `_result` instead
|
||||
|
||||
warning: value assigned to `result` is never read
|
||||
--> src/interpreter/expressions.rs:901:17
|
||||
|
|
||||
901 | result = self.execute_statement(statement)?;
|
||||
| ^^^^^^
|
||||
|
|
||||
= help: maybe it is overwritten before being read?
|
||||
= note: `#[warn(unused_assignments)]` on by default
|
||||
|
||||
warning: value assigned to `result` is never read
|
||||
--> src/interpreter/expressions.rs:905:21
|
||||
|
|
||||
905 | result = return_val.clone_box();
|
||||
| ^^^^^^
|
||||
|
|
||||
= help: maybe it is overwritten before being read?
|
||||
|
||||
warning: unused variable: `current_instance`
|
||||
--> src/interpreter/expressions.rs:924:78
|
||||
|
|
||||
924 | fn execute_builtin_box_method(&mut self, parent: &str, method: &str, mut current_instance: Box<dyn NyashBox>, arguments: &[ASTNode])
|
||||
| ^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_current_instance`
|
||||
|
||||
warning: variable does not need to be mutable
|
||||
--> src/interpreter/expressions.rs:924:74
|
||||
|
|
||||
924 | fn execute_builtin_box_method(&mut self, parent: &str, method: &str, mut current_instance: Box<dyn NyashBox>, arguments: &[ASTNode])
|
||||
| ----^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| help: remove this `mut`
|
||||
|
|
||||
= note: `#[warn(unused_mut)]` on by default
|
||||
|
||||
warning: unused variable: `node_id`
|
||||
--> src/interpreter/objects.rs:545:21
|
||||
|
|
||||
545 | let node_id = if let Some(id_str) = node_id_value.as_any().downcast_ref::<StringBox>() {
|
||||
| ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_node_id`
|
||||
|
||||
warning: unused variable: `transport_str`
|
||||
--> src/interpreter/objects.rs:555:21
|
||||
|
|
||||
555 | let transport_str = if let Some(t_str) = transport_value.as_any().downcast_ref::<StringBox>() {
|
||||
| ^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_transport_str`
|
||||
|
||||
warning: unused variable: `existing_method`
|
||||
--> src/instance.rs:89:21
|
||||
|
|
||||
89 | if let Some(existing_method) = new_methods.get(&method_name) {
|
||||
| ^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_existing_method`
|
||||
|
||||
warning: field `evaluation_stack` is never read
|
||||
--> src/interpreter/core.rs:207:16
|
||||
|
|
||||
190 | pub struct NyashInterpreter {
|
||||
| ---------------- field in this struct
|
||||
...
|
||||
207 | pub(super) evaluation_stack: Vec<usize>,
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(dead_code)]` on by default
|
||||
|
||||
warning: methods `get_object_id` and `hash_string` are never used
|
||||
--> src/interpreter/expressions.rs:697:8
|
||||
|
|
||||
18 | impl NyashInterpreter {
|
||||
| --------------------- methods in this implementation
|
||||
...
|
||||
697 | fn get_object_id(&self, node: &ASTNode) -> Option<usize> {
|
||||
| ^^^^^^^^^^^^^
|
||||
...
|
||||
716 | fn hash_string(&self, s: &str) -> usize {
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
Compiling nyash-rust v0.1.0 (/mnt/c/git/nyash-project/nyash)
|
||||
warning: `nyash-rust` (lib) generated 53 warnings (run `cargo fix --lib -p nyash-rust` to apply 27 suggestions)
|
||||
error: couldn't read `examples/C:/Windows/Fonts/arial.ttf`: No such file or directory (os error 2)
|
||||
--> examples/simple_notepad_win.rs:32:57
|
||||
|
|
||||
32 | std::sync::Arc::new(egui::FontData::from_static(include_bytes!(
|
||||
| _________________________________________________________^
|
||||
33 | | "C:/Windows/Fonts/arial.ttf"
|
||||
34 | | ))),
|
||||
| |_________^
|
||||
|
||||
warning: unused import: `std::path::PathBuf`
|
||||
--> examples/nyash_explorer.rs:5:5
|
||||
|
|
||||
5 | use std::path::PathBuf;
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unused_imports)]` on by default
|
||||
|
||||
warning: use of deprecated method `eframe::egui::Ui::allocate_ui_at_rect`: Use `allocate_new_ui` instead
|
||||
--> examples/nyash_explorer.rs:287:28
|
||||
|
|
||||
287 | ui.allocate_ui_at_rect(response.rect, |ui| {
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(deprecated)]` on by default
|
||||
|
||||
warning: fields `letter` and `icon_data` are never read
|
||||
--> examples/nyash_explorer.rs:63:5
|
||||
|
|
||||
62 | struct DriveInfo {
|
||||
| --------- fields in this struct
|
||||
63 | letter: String,
|
||||
| ^^^^^^
|
||||
...
|
||||
68 | icon_data: Option<Vec<u8>>,
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: `DriveInfo` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
|
||||
= note: `#[warn(dead_code)]` on by default
|
||||
|
||||
warning: field `letter` is never read
|
||||
--> examples/nyash_explorer_with_icons.rs:70:5
|
||||
|
|
||||
69 | struct DriveInfo {
|
||||
| --------- field in this struct
|
||||
70 | letter: String,
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: `#[warn(dead_code)]` on by default
|
||||
|
||||
warning: associated function `load_bmp_icon` is never used
|
||||
--> examples/nyash_explorer_with_icons.rs:145:8
|
||||
|
|
||||
85 | impl NyashExplorer {
|
||||
| ------------------ associated function in this implementation
|
||||
...
|
||||
145 | fn load_bmp_icon(file_path: &str) -> Option<ColorImage> {
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
warning: fields `from_output` and `to_input` are never read
|
||||
--> development/egui_research/experiments/visual_node_prototype.rs:118:5
|
||||
|
|
||||
116 | struct Connection {
|
||||
| ---------- fields in this struct
|
||||
117 | from_node: usize,
|
||||
118 | from_output: String,
|
||||
| ^^^^^^^^^^^
|
||||
119 | to_node: usize,
|
||||
120 | to_input: String,
|
||||
| ^^^^^^^^
|
||||
|
|
||||
= note: `Connection` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
|
||||
= note: `#[warn(dead_code)]` on by default
|
||||
|
||||
warning: fields `connecting_from`, `pan_offset`, and `zoom` are never read
|
||||
--> development/egui_research/experiments/visual_node_prototype.rs:128:5
|
||||
|
|
||||
123 | struct VisualProgramming {
|
||||
| ----------------- fields in this struct
|
||||
...
|
||||
128 | connecting_from: Option<(usize, String)>,
|
||||
| ^^^^^^^^^^^^^^^
|
||||
129 | pan_offset: Vec2,
|
||||
| ^^^^^^^^^^
|
||||
130 | zoom: f32,
|
||||
| ^^^^
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> examples/simple_notepad_win.rs:32:9
|
||||
|
|
||||
30 | fonts.font_data.insert(
|
||||
| ------ arguments to this method are incorrect
|
||||
31 | "system".to_owned(),
|
||||
32 | / std::sync::Arc::new(egui::FontData::from_static(include_bytes!(
|
||||
33 | | "C:/Windows/Fonts/arial.ttf"
|
||||
34 | | ))),
|
||||
| |___________^ expected `FontData`, found `Arc<FontData>`
|
||||
|
|
||||
= note: expected struct `FontData`
|
||||
found struct `Arc<FontData>`
|
||||
help: the return type of this call is `Arc<FontData>` due to the type of the argument passed
|
||||
--> examples/simple_notepad_win.rs:30:5
|
||||
|
|
||||
30 | / fonts.font_data.insert(
|
||||
31 | | "system".to_owned(),
|
||||
32 | |/ std::sync::Arc::new(egui::FontData::from_static(include_bytes!(
|
||||
33 | || "C:/Windows/Fonts/arial.ttf"
|
||||
34 | || ))),
|
||||
| ||___________- this argument influences the return type of `insert`
|
||||
35 | | );
|
||||
| |______^
|
||||
note: method defined here
|
||||
--> /rustc/6b00bc3880198600130e1cf62b8f8a93494488cc/library/alloc/src/collections/btree/map.rs:1023:12
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
||||
error: could not compile `nyash-rust` (example "simple_notepad_win") due to 2 previous errors
|
||||
warning: build failed, waiting for other jobs to finish...
|
||||
warning: unused import: `std::collections::HashMap`
|
||||
--> tests/integration_tests.rs:9:5
|
||||
|
|
||||
9 | use std::collections::HashMap;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unused_imports)]` on by default
|
||||
|
||||
warning: function `execute_nyash_code` is never used
|
||||
--> tests/integration_tests.rs:12:4
|
||||
|
|
||||
12 | fn execute_nyash_code(code: &str) -> Result<String, String> {
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(dead_code)]` on by default
|
||||
|
||||
warning: unused import: `std::env`
|
||||
--> src/main.rs:33:5
|
||||
|
|
||||
33 | use std::env;
|
||||
| ^^^^^^^^
|
||||
|
||||
warning: unused imports: `BoolBox`, `IntegerBox`, and `StringBox`
|
||||
--> src/ast.rs:864:28
|
||||
|
|
||||
864 | use crate::box_trait::{StringBox, IntegerBox, BoolBox};
|
||||
| ^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^
|
||||
|
||||
error[E0063]: missing field `is_override` in initializer of `ast::ASTNode`
|
||||
--> src/ast.rs:915:48
|
||||
|
|
||||
915 | methods.insert("getValue".to_string(), ASTNode::FunctionDeclaration {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `is_override`
|
||||
|
||||
error[E0063]: missing fields `is_static`, `static_init` and `type_parameters` in initializer of `ast::ASTNode`
|
||||
--> src/ast.rs:932:24
|
||||
|
|
||||
932 | let box_decl = ASTNode::BoxDeclaration {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ missing `is_static`, `static_init` and `type_parameters`
|
||||
|
||||
For more information about this error, try `rustc --explain E0063`.
|
||||
warning: `nyash-rust` (bin "nyash" test) generated 53 warnings (52 duplicates)
|
||||
error: could not compile `nyash-rust` (bin "nyash" test) due to 2 previous errors; 53 warnings emitted
|
||||
error[E0599]: no method named `len` found for struct `boxes::array::ArrayBox` in the current scope
|
||||
--> src/tests/box_tests.rs:19:26
|
||||
|
|
||||
19 | assert_eq!(array.len(), 2);
|
||||
| ^^^
|
||||
|
|
||||
::: src/boxes/array/mod.rs:11:1
|
||||
|
|
||||
11 | pub struct ArrayBox {
|
||||
| ------------------- method `len` not found for this struct
|
||||
|
|
||||
= help: items from traits can only be used if the trait is implemented and in scope
|
||||
= note: the following traits define an item `len`, perhaps you need to implement one of them:
|
||||
candidate #1: `CacheTrait`
|
||||
candidate #2: `ExactSizeIterator`
|
||||
candidate #3: `avif_serialize::boxes::MpegBox`
|
||||
candidate #4: `nom::traits::AsChar`
|
||||
candidate #5: `rayon::iter::IndexedParallelIterator`
|
||||
candidate #6: `rayon::range::private::IndexedRangeInteger`
|
||||
candidate #7: `rayon::range_inclusive::private::IndexedRangeInteger`
|
||||
help: there is a method `length` with a similar name
|
||||
|
|
||||
19 | assert_eq!(array.length(), 2);
|
||||
| +++
|
||||
|
||||
error[E0599]: no method named `len` found for struct `buffer::BufferBox` in the current scope
|
||||
--> src/tests/box_tests.rs:35:27
|
||||
|
|
||||
35 | assert_eq!(buffer.len(), 5);
|
||||
| ^^^
|
||||
|
|
||||
::: src/boxes/buffer/mod.rs:38:1
|
||||
|
|
||||
38 | pub struct BufferBox {
|
||||
| -------------------- method `len` not found for this struct
|
||||
|
|
||||
= help: items from traits can only be used if the trait is implemented and in scope
|
||||
= note: the following traits define an item `len`, perhaps you need to implement one of them:
|
||||
candidate #1: `CacheTrait`
|
||||
candidate #2: `ExactSizeIterator`
|
||||
candidate #3: `avif_serialize::boxes::MpegBox`
|
||||
candidate #4: `nom::traits::AsChar`
|
||||
candidate #5: `rayon::iter::IndexedParallelIterator`
|
||||
candidate #6: `rayon::range::private::IndexedRangeInteger`
|
||||
candidate #7: `rayon::range_inclusive::private::IndexedRangeInteger`
|
||||
help: there is a method `length` with a similar name
|
||||
|
|
||||
35 | assert_eq!(buffer.length(), 5);
|
||||
| +++
|
||||
|
||||
error[E0600]: cannot apply unary operator `!` to type `Box<(dyn box_trait::NyashBox + 'static)>`
|
||||
--> src/tests/box_tests.rs:114:9
|
||||
|
|
||||
114 | assert!(success_result.is_ok());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot apply unary operator `!`
|
||||
|
|
||||
note: the foreign item type `Box<(dyn box_trait::NyashBox + 'static)>` doesn't implement `Not`
|
||||
--> /rustc/6b00bc3880198600130e1cf62b8f8a93494488cc/library/alloc/src/boxed.rs:231:1
|
||||
::: /rustc/6b00bc3880198600130e1cf62b8f8a93494488cc/library/alloc/src/boxed.rs:234:1
|
||||
|
|
||||
= note: not implement `Not`
|
||||
|
||||
error[E0600]: cannot apply unary operator `!` to type `Box<(dyn box_trait::NyashBox + 'static)>`
|
||||
--> src/tests/box_tests.rs:122:17
|
||||
|
|
||||
122 | assert!(!error_result.is_ok());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ cannot apply unary operator `!`
|
||||
|
|
||||
note: the foreign item type `Box<(dyn box_trait::NyashBox + 'static)>` doesn't implement `Not`
|
||||
--> /rustc/6b00bc3880198600130e1cf62b8f8a93494488cc/library/alloc/src/boxed.rs:231:1
|
||||
::: /rustc/6b00bc3880198600130e1cf62b8f8a93494488cc/library/alloc/src/boxed.rs:234:1
|
||||
|
|
||||
= note: not implement `Not`
|
||||
|
||||
error[E0599]: no method named `box_id` found for struct `boxes::array::ArrayBox` in the current scope
|
||||
--> src/tests/box_tests.rs:135:25
|
||||
|
|
||||
135 | assert_ne!(box1.box_id(), box2.box_id());
|
||||
| ^^^^^^ method not found in `ArrayBox`
|
||||
|
|
||||
::: src/boxes/array/mod.rs:11:1
|
||||
|
|
||||
11 | pub struct ArrayBox {
|
||||
| ------------------- method `box_id` not found for this struct
|
||||
|
|
||||
::: src/box_trait.rs:55:8
|
||||
|
|
||||
55 | fn box_id(&self) -> u64;
|
||||
| ------ the method is available for `boxes::array::ArrayBox` here
|
||||
|
|
||||
= help: items from traits can only be used if the trait is in scope
|
||||
help: trait `BoxCore` which provides `box_id` is implemented but not in scope; perhaps you want to import it
|
||||
|
|
||||
7 + use crate::box_trait::BoxCore;
|
||||
|
|
||||
|
||||
error[E0599]: no method named `box_id` found for struct `boxes::array::ArrayBox` in the current scope
|
||||
--> src/tests/box_tests.rs:135:40
|
||||
|
|
||||
135 | assert_ne!(box1.box_id(), box2.box_id());
|
||||
| ^^^^^^ method not found in `ArrayBox`
|
||||
|
|
||||
::: src/boxes/array/mod.rs:11:1
|
||||
|
|
||||
11 | pub struct ArrayBox {
|
||||
| ------------------- method `box_id` not found for this struct
|
||||
|
|
||||
::: src/box_trait.rs:55:8
|
||||
|
|
||||
55 | fn box_id(&self) -> u64;
|
||||
| ------ the method is available for `boxes::array::ArrayBox` here
|
||||
|
|
||||
= help: items from traits can only be used if the trait is in scope
|
||||
help: trait `BoxCore` which provides `box_id` is implemented but not in scope; perhaps you want to import it
|
||||
|
|
||||
7 + use crate::box_trait::BoxCore;
|
||||
|
|
||||
|
||||
warning: variable does not need to be mutable
|
||||
--> src/tests/box_tests.rs:90:13
|
||||
|
|
||||
90 | let mut stream = NyashStreamBox::from_data(vec![72, 101, 108, 108, 111]); // "Hello"
|
||||
| ----^^^^^^
|
||||
| |
|
||||
| help: remove this `mut`
|
||||
|
||||
Some errors have detailed explanations: E0063, E0599, E0600.
|
||||
For more information about an error, try `rustc --explain E0063`.
|
||||
warning: `nyash-rust` (lib test) generated 53 warnings (52 duplicates)
|
||||
error: could not compile `nyash-rust` (lib test) due to 8 previous errors; 53 warnings emitted
|
||||
warning: `nyash-rust` (bin "nyash_explorer_icons" test) generated 2 warnings (2 duplicates)
|
||||
warning: `nyash-rust` (bin "nyash_explorer" test) generated 3 warnings (3 duplicates)
|
||||
warning: `nyash-rust` (test "integration_tests") generated 2 warnings (run `cargo fix --test "integration_tests"` to apply 1 suggestion)
|
||||
@ -1,77 +0,0 @@
|
||||
Nyashプログラミング言語のBox型アーキテクチャ設計について深い技術相談です。
|
||||
|
||||
【現在の状況】
|
||||
- Rust実装のプログラミング言語Nyash開発中
|
||||
- "Everything is Box"哲学:全データがBoxオブジェクト
|
||||
- 現在16種類のBox型実装済み(StringBox, IntegerBox, P2PBox等)
|
||||
- Arc<Mutex>統一パターンでスレッドセーフ性確保
|
||||
|
||||
【現在のアーキテクチャ問題】
|
||||
現在、全Box型をtype aliasで統一しているが、実装で型エラー地獄が発生:
|
||||
|
||||
```rust
|
||||
// 現在の問題のある設計
|
||||
type StringBox = Arc<Mutex<StringBoxData>>;
|
||||
type IntegerBox = Arc<Mutex<IntegerBoxData>>;
|
||||
type P2PBox = Arc<Mutex<P2PBoxData>>;
|
||||
|
||||
// 問題:型エイリアス複雑化、trait object Debug実装困難
|
||||
// 結果:Copilot実装で型エラー多発、開発効率低下
|
||||
```
|
||||
|
||||
【検討中のシンプル設計】
|
||||
newtype patternによるシンプル化:
|
||||
|
||||
```rust
|
||||
// 案1: newtype pattern
|
||||
struct StringBox(Arc<Mutex<StringBoxData>>);
|
||||
struct IntegerBox(Arc<Mutex<IntegerBoxData>>);
|
||||
struct P2PBox(Arc<Mutex<P2PBoxData>>);
|
||||
|
||||
// 案2: 生構造体(必要時のみArc化)
|
||||
struct StringBox { data: String }
|
||||
struct IntegerBox { value: i64 }
|
||||
// 共有が必要な時だけArc::new()で包む
|
||||
```
|
||||
|
||||
【技術的検討ポイント】
|
||||
|
||||
1. **型安全性とシンプルさのバランス**
|
||||
- type alias vs newtype vs 生構造体
|
||||
- コンパイル時エラー検出 vs 実装しやすさ
|
||||
|
||||
2. **スレッドセーフ性の要件**
|
||||
- 全Box型で並行処理が必要か?
|
||||
- StringBox等の基本型にもMutex必要?
|
||||
- 必要な時だけArc<Mutex>化する方が良い?
|
||||
|
||||
3. **拡張性・保守性**
|
||||
- 新Box型追加時の実装コスト
|
||||
- エラーメッセージの分かりやすさ
|
||||
- 他開発者(AI含む)の理解しやすさ
|
||||
|
||||
4. **パフォーマンス**
|
||||
- Arc<Mutex>のオーバーヘッド
|
||||
- ゼロコスト抽象化の実現可能性
|
||||
- メモリ使用量の最適化
|
||||
|
||||
5. **現実的な実装戦略**
|
||||
- 段階的移行 vs 一括変更
|
||||
- 既存コードとの互換性
|
||||
- 開発スピード重視 vs 理想設計重視
|
||||
|
||||
【具体的相談事項】
|
||||
1. type alias vs newtype vs 生構造体、どの設計が最適?
|
||||
2. 全Box型に一律Arc<Mutex>は過剰?必要な箇所のみの方が良い?
|
||||
3. Rust専門家から見て推奨されるBox型統一アーキテクチャは?
|
||||
4. プログラミング言語実装において、型システムのベストプラクティスは?
|
||||
5. 実装効率と設計美学のバランスをどう取るべき?
|
||||
|
||||
【制約条件】
|
||||
- Rust実装必須
|
||||
- Everything is Box哲学維持
|
||||
- スレッドセーフ性確保
|
||||
- 16種類+今後追加予定のBox型すべてで統一
|
||||
- 実装・保守の現実性重視
|
||||
|
||||
プログラミング言語設計・Rust専門家の視点から、実装可能で美しく、長期保守に適したアーキテクチャ設計を提案してください。
|
||||
@ -1,64 +0,0 @@
|
||||
Nyashプログラミング言語の関数オーバーロード設計について深い技術的相談です。
|
||||
|
||||
【Nyashの技術的特徴】
|
||||
- Everything is Box哲学: 全データがBoxオブジェクト
|
||||
- Arc<Mutex>統一アーキテクチャ: 完全スレッドセーフ設計
|
||||
- 明示性重視: 変数宣言先の即座特定可能
|
||||
- Rust実装: メモリ安全性+高性能
|
||||
- 目的: 初学者フレンドリー + 実用性
|
||||
|
||||
【検討する技術的課題】
|
||||
現在P2PBox実装において、関数オーバーロード(引数数による分岐)採用の是非を検討中。
|
||||
|
||||
具体例:
|
||||
```rust
|
||||
// Option A: オーバーロードあり
|
||||
impl P2PBox {
|
||||
pub fn send(&self, message: IntentBox) -> Result<(), SendError> // ブロードキャスト
|
||||
pub fn send(&self, to: &str, message: IntentBox) -> Result<(), SendError> // 個別送信
|
||||
pub fn send(&self, to: &str, message: IntentBox, opts: SendOpts) -> Result<(), SendError> // オプション付き
|
||||
}
|
||||
|
||||
// Option B: オーバーロードなし(現在)
|
||||
impl P2PBox {
|
||||
pub fn broadcast(&self, message: IntentBox) -> Result<(), SendError>
|
||||
pub fn send(&self, to: &str, message: IntentBox) -> Result<(), SendError>
|
||||
pub fn send_with_options(&self, to: &str, message: IntentBox, opts: SendOpts) -> Result<(), SendError>
|
||||
}
|
||||
```
|
||||
|
||||
【技術的検討ポイント】
|
||||
|
||||
1. **Rust実装との整合性**
|
||||
- Rustにはメソッドオーバーロードがない
|
||||
- 引数数による分岐をインタープリターで実装する必要
|
||||
- パフォーマンスへの影響
|
||||
|
||||
2. **Arc<Mutex>アーキテクチャとの親和性**
|
||||
- 動的ディスパッチの複雑さ
|
||||
- エラーハンドリングの一貫性
|
||||
- スレッドセーフティの保持
|
||||
|
||||
3. **インタープリター実装の複雑度**
|
||||
- パーサーでの引数数判定
|
||||
- 実行時メソッド選択アルゴリズム
|
||||
- デバッグ情報の提供
|
||||
|
||||
4. **型安全性とパフォーマンス**
|
||||
- 実行時型チェックのオーバーヘッド
|
||||
- エラーメッセージの品質
|
||||
- 開発時デバッグ体験
|
||||
|
||||
5. **エコシステム設計との整合性**
|
||||
- 他のBox型との一貫性
|
||||
- 拡張性(新しいオーバーロード追加)
|
||||
- メンテナンス性
|
||||
|
||||
【深く検討してほしい点】
|
||||
1. 技術的実装の複雑さ vs ユーザー体験の向上
|
||||
2. Nyashの「明示性重視」哲学との技術的整合性
|
||||
3. 初学者がエラーに遭遇した時のデバッグ体験
|
||||
4. P2P通信という特定ドメインでの最適解
|
||||
5. 言語の長期進化における影響
|
||||
|
||||
プログラミング言語実装の専門的視点から、技術的に最良で保守しやすい設計を分析してください。
|
||||
@ -1,46 +0,0 @@
|
||||
Nyashプログラミング言語の関数オーバーロード採用可否について言語設計の専門的観点から相談です。
|
||||
|
||||
【背景】
|
||||
Nyashは「Everything is Box」哲学で、明示性重視・初学者フレンドリー・メモリ安全性を重視する言語です。現在Phase 2でP2PBox実装中で、関数オーバーロード(引数数による分岐)を採用するか重要な決断が必要です。
|
||||
|
||||
【具体的争点】
|
||||
send(a) と send(a, b) のような関数オーバーロードを許すか?
|
||||
|
||||
例:
|
||||
```nyash
|
||||
// オーバーロードありの場合
|
||||
node.send("hello") // ブロードキャスト
|
||||
node.send("bob", "hello") // 個別送信
|
||||
node.send("bob", msg, options) // オプション付き
|
||||
|
||||
// オーバーロードなしの場合(現在)
|
||||
node.broadcast("hello") // 明示的メソッド名
|
||||
node.send("bob", "hello") // 必ず2引数
|
||||
node.sendWithOptions("bob", msg, options) // 明示的メソッド名
|
||||
```
|
||||
|
||||
【メリット】
|
||||
1. API使いやすさ向上
|
||||
2. 他言語からの移行しやすさ
|
||||
3. 直感的な呼び出し
|
||||
|
||||
【デメリット】
|
||||
1. 間違った関数を呼ぶリスク
|
||||
2. デバッグ困難
|
||||
3. Nyashの明示性哲学と矛盾
|
||||
4. 初学者混乱
|
||||
5. 型推論複雑化
|
||||
|
||||
【Nyashの設計思想との照合】
|
||||
- 明示性重視: プログラマーが変数の宣言先を即座に特定可能
|
||||
- 初学者フレンドリー: 学習コストが低い
|
||||
- Everything is Box: 統一されたオブジェクトモデル
|
||||
|
||||
【質問】
|
||||
1. Nyashの設計思想から見て、関数オーバーロードは採用すべきか?
|
||||
2. 明示性 vs 利便性のトレードオフをどう判断すべきか?
|
||||
3. 初学者向け言語として適切な選択は?
|
||||
4. P2P通信APIにおける最良の設計は?
|
||||
5. 他の現代的言語設計トレンドとの整合性は?
|
||||
|
||||
プログラミング言語設計の専門的視点から、Nyashの将来を決めるアドバイスをお願いします。
|
||||
@ -1,40 +0,0 @@
|
||||
Nyash言語のweak参照実装で根本的な設計問題が発覚しました。専門的分析をお願いします。
|
||||
|
||||
【現在の問題】
|
||||
InstanceBox構造が原因でweak参照が実装できません:
|
||||
|
||||
```rust
|
||||
pub struct InstanceBox {
|
||||
pub fields: Arc<Mutex<HashMap<String, Box<dyn NyashBox>>>>, // 問題の核心
|
||||
}
|
||||
```
|
||||
|
||||
NyashValue::WeakBoxを作っても、Box<dyn NyashBox>にしか格納できず、弱参照情報が失われます。
|
||||
|
||||
【解決策の選択肢】
|
||||
|
||||
1. **根本解決**(理想だが影響大)
|
||||
```rust
|
||||
pub fields: Arc<Mutex<HashMap<String, NyashValue>>>, // 全面アーキテクチャ変更
|
||||
```
|
||||
|
||||
2. **暫定解決**(copilot提案)
|
||||
```rust
|
||||
pub struct InstanceBox {
|
||||
pub fields: Arc<Mutex<HashMap<String, Box<dyn NyashBox>>>>, // 既存維持
|
||||
pub weak_fields: Arc<Mutex<HashMap<String, Weak<Mutex<dyn NyashBox>>>>>, // 追加
|
||||
}
|
||||
```
|
||||
|
||||
【コンテキスト】
|
||||
- NyashValue革命は完了済み(Arc<Mutex>過剰症候群解決)
|
||||
- Everything is Box哲学必須
|
||||
- 実用性重視(完璧より動くもの優先)
|
||||
|
||||
【質問】
|
||||
1. 暫定解決策の技術的妥当性は?
|
||||
2. パフォーマンス・保守性への影響は?
|
||||
3. 根本解決は本当に必要か?
|
||||
4. 段階的移行戦略の是非は?
|
||||
|
||||
実装可能性と設計の美しさのバランスを重視した分析をお願いします。
|
||||
Reference in New Issue
Block a user