274 lines
9.0 KiB
Markdown
274 lines
9.0 KiB
Markdown
|
|
# PythonCompilerBox Property System活用実装
|
|||
|
|
|
|||
|
|
## 🎯 概要
|
|||
|
|
|
|||
|
|
Property System革命(stored/computed/once/birth_once)をPythonCompilerBoxで活用し、Python→Nyash transpilationを実現する技術実装設計。
|
|||
|
|
|
|||
|
|
## 🏗️ アーキテクチャ設計
|
|||
|
|
|
|||
|
|
### コアコンポーネント
|
|||
|
|
```nyash
|
|||
|
|
box PythonCompilerBox {
|
|||
|
|
// Property System を活用したコンパイラ実装
|
|||
|
|
classifier: PropertyClassifierBox
|
|||
|
|
generator: NyashCodeGeneratorBox
|
|||
|
|
validator: SemanticValidatorBox
|
|||
|
|
|
|||
|
|
// コンパイル結果のキャッシュ(once使用)
|
|||
|
|
once compilation_cache: MapBox { new MapBox() }
|
|||
|
|
|
|||
|
|
// 動的に計算される統計情報(computed使用)
|
|||
|
|
success_rate: FloatBox { me.get_success_statistics() }
|
|||
|
|
total_files_processed: IntegerBox { me.compilation_cache.size() }
|
|||
|
|
|
|||
|
|
birth() {
|
|||
|
|
me.classifier = new PropertyClassifierBox()
|
|||
|
|
me.generator = new NyashCodeGeneratorBox()
|
|||
|
|
me.validator = new SemanticValidatorBox()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🧠 PropertyClassifierBox実装
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
box PropertyClassifierBox {
|
|||
|
|
// 分類ルールのキャッシュ(once)
|
|||
|
|
once classification_rules: RuleSetBox { load_classification_rules() }
|
|||
|
|
|
|||
|
|
// 統計情報(computed)
|
|||
|
|
classified_count: IntegerBox { me.get_classification_stats().count }
|
|||
|
|
accuracy_rate: FloatBox { me.get_classification_stats().accuracy }
|
|||
|
|
|
|||
|
|
classify_python_property(ast_node) {
|
|||
|
|
// Python AST → Property type 分類
|
|||
|
|
if me.has_decorator(ast_node, "@property") {
|
|||
|
|
if me.is_simple_computation(ast_node) {
|
|||
|
|
return "computed" // 単純計算 → computed
|
|||
|
|
} else {
|
|||
|
|
return "once" // 複雑処理 → キャッシュ推奨
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if me.has_decorator(ast_node, "@functools.cached_property") {
|
|||
|
|
return "once" // 明示的キャッシュ
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if me.is_init_assignment(ast_node) {
|
|||
|
|
return "stored" // 通常フィールド
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if me.is_birth_once_candidate(ast_node) {
|
|||
|
|
return "birth_once" // 初期化時のみ評価
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return "unsupported" // Phase 2以降
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ヒューリスティック判定
|
|||
|
|
is_simple_computation(node) {
|
|||
|
|
// 副作用なし+計算量小 → computed適合性判定
|
|||
|
|
return me.has_no_side_effects(node) and me.is_lightweight(node)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
is_birth_once_candidate(node) {
|
|||
|
|
// 初期化時のみ必要な重い処理を検出
|
|||
|
|
return me.called_in_init_only(node) and me.is_expensive(node)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🏭 NyashCodeGeneratorBox実装
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
box NyashCodeGeneratorBox {
|
|||
|
|
// テンプレートエンジン(once)
|
|||
|
|
once property_templates: TemplateEngineBox {
|
|||
|
|
load_property_templates()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 生成コード統計(computed)
|
|||
|
|
generated_lines: IntegerBox { me.count_generated_code_lines() }
|
|||
|
|
compression_ratio: FloatBox { me.calculate_compression_ratio() }
|
|||
|
|
|
|||
|
|
generate_property_declaration(property_info) {
|
|||
|
|
local template = me.property_templates.get(property_info.type)
|
|||
|
|
|
|||
|
|
// Property typeごとの生成
|
|||
|
|
peek property_info.type {
|
|||
|
|
"stored" => me.generate_stored_property(property_info),
|
|||
|
|
"computed" => me.generate_computed_property(property_info),
|
|||
|
|
"once" => me.generate_once_property(property_info),
|
|||
|
|
"birth_once" => me.generate_birth_once_property(property_info),
|
|||
|
|
else => throw UnsupportedPropertyError(property_info.type)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
generate_computed_property(info) {
|
|||
|
|
// computed property テンプレート
|
|||
|
|
return info.name + ": " + info.type + " { " + info.expression + " }"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
generate_once_property(info) {
|
|||
|
|
// once property テンプレート(キャッシュ+例外安全)
|
|||
|
|
local code = "once " + info.name + ": " + info.type + " { " + info.expression + " }"
|
|||
|
|
|
|||
|
|
if info.has_exception_risk {
|
|||
|
|
code = code + " catch(ex) { poison(me." + info.name + ", ex); throw ex }"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return code
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
generate_birth_once_property(info) {
|
|||
|
|
// birth_once property テンプレート
|
|||
|
|
return "birth_once " + info.name + ": " + info.type + " { " + info.expression + " }"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔍 SemanticValidatorBox実装
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
box SemanticValidatorBox {
|
|||
|
|
// 検証ルール(once)
|
|||
|
|
once validation_rules: ValidationRuleSetBox {
|
|||
|
|
load_semantic_validation_rules()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 検証結果統計(computed)
|
|||
|
|
validation_success_rate: FloatBox { me.get_validation_stats().success_rate }
|
|||
|
|
error_categories: ArrayBox { me.get_validation_stats().error_types }
|
|||
|
|
|
|||
|
|
validate_property_semantics(python_ast, nyash_code) {
|
|||
|
|
local errors = new ArrayBox()
|
|||
|
|
|
|||
|
|
// 1. Property type一致性検証
|
|||
|
|
me.validate_property_type_consistency(python_ast, nyash_code, errors)
|
|||
|
|
|
|||
|
|
// 2. 例外安全性検証
|
|||
|
|
me.validate_exception_safety(python_ast, nyash_code, errors)
|
|||
|
|
|
|||
|
|
// 3. 性能特性検証
|
|||
|
|
me.validate_performance_characteristics(python_ast, nyash_code, errors)
|
|||
|
|
|
|||
|
|
return ValidationResult.new(errors)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
validate_property_type_consistency(python_ast, nyash_code, errors) {
|
|||
|
|
// Pythonの@propertyとNyashのcomputedが対応しているかチェック
|
|||
|
|
local python_properties = me.extract_python_properties(python_ast)
|
|||
|
|
local nyash_properties = me.extract_nyash_properties(nyash_code)
|
|||
|
|
|
|||
|
|
loop(python_properties.iter()) property {
|
|||
|
|
local expected_type = me.infer_nyash_property_type(property)
|
|||
|
|
local actual_type = nyash_properties.get(property.name).type
|
|||
|
|
|
|||
|
|
if expected_type != actual_type {
|
|||
|
|
errors.add(PropertyTypeMismatchError.new(property.name, expected_type, actual_type))
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🎯 統合ワークフロー
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
box PythonTranspilationWorkflow {
|
|||
|
|
compiler: PythonCompilerBox
|
|||
|
|
|
|||
|
|
birth() {
|
|||
|
|
me.compiler = new PythonCompilerBox()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
transpile_python_file(file_path) {
|
|||
|
|
// 1. Pythonファイル解析
|
|||
|
|
local python_ast = me.parse_python_file(file_path)
|
|||
|
|
|
|||
|
|
// 2. Property分類
|
|||
|
|
local classified_properties = me.compiler.classifier.classify_all_properties(python_ast)
|
|||
|
|
|
|||
|
|
// 3. Nyashコード生成
|
|||
|
|
local nyash_code = me.compiler.generator.generate_nyash_code(classified_properties)
|
|||
|
|
|
|||
|
|
// 4. セマンティック検証
|
|||
|
|
local validation_result = me.compiler.validator.validate_property_semantics(python_ast, nyash_code)
|
|||
|
|
|
|||
|
|
if validation_result.has_errors() {
|
|||
|
|
throw TranspilationError.new(validation_result.errors)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 5. コンパイル結果キャッシュ(once活用)
|
|||
|
|
me.compiler.compilation_cache.set(file_path, nyash_code)
|
|||
|
|
|
|||
|
|
return nyash_code
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🧪 テスト実装例
|
|||
|
|
|
|||
|
|
```nyash
|
|||
|
|
box PropertySystemTranspilationTest {
|
|||
|
|
test_computed_property_generation() {
|
|||
|
|
local python_code = '''
|
|||
|
|
class TestClass:
|
|||
|
|
@property
|
|||
|
|
def doubled_value(self):
|
|||
|
|
return self.value * 2
|
|||
|
|
'''
|
|||
|
|
|
|||
|
|
local compiler = new PythonCompilerBox()
|
|||
|
|
local result = compiler.transpile(python_code)
|
|||
|
|
|
|||
|
|
assert result.contains("doubled_value: IntegerBox { me.value * 2 }")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
test_once_property_generation() {
|
|||
|
|
local python_code = '''
|
|||
|
|
class TestClass:
|
|||
|
|
@functools.cached_property
|
|||
|
|
def expensive_calc(self):
|
|||
|
|
return heavy_computation()
|
|||
|
|
'''
|
|||
|
|
|
|||
|
|
local compiler = new PythonCompilerBox()
|
|||
|
|
local result = compiler.transpile(python_code)
|
|||
|
|
|
|||
|
|
assert result.contains("once expensive_calc: ResultBox { heavy_computation() }")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
test_poison_on_throw_integration() {
|
|||
|
|
local python_code = '''
|
|||
|
|
class TestClass:
|
|||
|
|
@functools.cached_property
|
|||
|
|
def risky_operation(self):
|
|||
|
|
if random.random() < 0.1:
|
|||
|
|
raise ValueError("Failed")
|
|||
|
|
return success_result()
|
|||
|
|
'''
|
|||
|
|
|
|||
|
|
local compiler = new PythonCompilerBox()
|
|||
|
|
local result = compiler.transpile(python_code)
|
|||
|
|
|
|||
|
|
assert result.contains("catch(ex) { poison(me.risky_operation, ex); throw ex }")
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📊 期待される効果
|
|||
|
|
|
|||
|
|
### 1. 実装効率の向上
|
|||
|
|
- Property System活用により、コンパイラ自体の実装がクリーン
|
|||
|
|
- once活用でコンパイルキャッシュ、computed活用で統計計算
|
|||
|
|
|
|||
|
|
### 2. 生成コードの高品質化
|
|||
|
|
- Python property → Nyash property の自然な1:1マッピング
|
|||
|
|
- poison-on-throw統合による例外安全性
|
|||
|
|
|
|||
|
|
### 3. 保守性の向上
|
|||
|
|
- Box化されたコンポーネント設計
|
|||
|
|
- 明確な責任分離(分類・生成・検証)
|
|||
|
|
|
|||
|
|
この設計により、Property System革命を最大限活用したPython transpilation実装が実現できます!
|