コンテンツにスキップ

YOYUにおけるスコープとクロージャの統一モデル

提供: ウィキバーシティ


概要

[編集]

YOYUは構文解析を支えるための柔軟かつ最小構成のインフラを目指す実装系である。本稿では、YOYUにおける変数スコープ管理とクロージャの扱いについて、実装志向の視点からその設計と実現法を記述する。


基本設計:変数スコープ管理

[編集]

YOYUでは、スコープ(変数束縛)の単位として HashTable 構造体を使用する。各 HashTable は親スコープへのポインタを持ち、スタック状に連結される。

NewHashTable():新たなグローバル(親なし)スコープを作成。

NewNextHashTable(parent):親スコープを指定して新しいスコープを作成。

HashInsert()、HashSearch() などで束縛を管理。


クロージャの実装

[編集]

関数定義時には、その時点のスコープ(HashTable*)を関数構造体に添付する。これにより、その関数は静的にスコープを保持したクロージャとなる。

クロージャ内部の変数参照は保持されたスコープポインタを起点に親方向に探索される。

クロージャはコピーではなく、スコープの実体を参照する。


変数束縛の枝分かれ構造

[編集]

1つの呼び出しチェーン中で複数のクロージャが生成される場合、スコープはそれぞれ独立して構築される(共有されない)。

ただし同一スコープ上で複数の関数を生成する場合、それらは同一のスコープを共有する。


例:

function outer() {
    let x = 42;
    function inner() {
        return x + 1;
    }
    return inner;
}

この例では inner が outer のスコープ(x=42)を閉じ込めたクロージャとなる。

スコープ管理の戦略

[編集]

スコープの縮小(returnなど):HashTable の pin 状態が false(外部参照なし)なら破棄可能。

スコープの拡張(新しい変数定義):NewNextHashTable() により枝分かれしたスコープを作成。


この方式により、スコープの共有・分離が明示的に管理される。


ガーベジコレクション不要論

[編集]

YOYUでは HashTable に "pin フラグ" を持たせることで、スコープの寿命管理を行う。

クロージャによって参照されているスコープは pin 状態となり破棄されない。

pin 状態でないスコープは return 時に破棄可能。


これにより、自動GCを用いずとも安全かつ効率的なスコープ管理が可能となる。


将来的な拡張の可能性

[編集]

このスコープ・クロージャモデルは、以下のような機能にも拡張可能:

例外処理:スコープごとの復帰点をスタックに記録

継続 (Continuation):関数位置+スコープをまとめて保存

並行処理:スコープスタックをスレッドごとに独立管理


結語

[編集]

> スタティックスコープとクロージャを構造体とポインタで制す。 それがYOYUの美学である。


この統一モデルにより、YOYUは記述力と実装の透明性を兼ね備えたスコープシステムを提供する。