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実装が実現できます! |