コンテンツにスキップ

YOYUにおけるスタックフレーム設計

提供: ウィキバーシティ

YOYU構文処理系では、関数呼び出しやインライン展開を極限まで軽量化するために、独自のスタックフレーム構造を採用している。

スタックフレームの構造

[編集]
typedef struct StackFrame {
    StackFrame* prev;      // 親フレームへのポインタ
    int refCount;          // リファレンスカウント(クロージャ管理用)
    void* returnAddress;   // 戻り先アドレス(省略可)
    void* varTail;         // ローカル変数領域の終端を指すポインタ
} StackFrame;

ローカル変数はこのフレーム直後のスタック領域に順に配置され、`varTail` によりその終端が追跡される。


インライン関数との関係

[編集]

インライン関数は、別のStackFrameを生成せず、**親フレームの varTail を前進させるだけ**でローカルスコープを表現する。これにより関数呼び出しコストを実質ゼロに近づけることができる。

まとめ

[編集]

YOYUのスタックフレーム設計は、インライン展開・クロージャ・再帰的構文処理を最小のメモリオーバーヘッドで実現する。 動的な構文再構成・評価系と相性がよく、純粋構文的に意味の完結する関数呼び出しモデルを可能にする。

参考文献

[編集]


(追記:varTailは要らない。伸びる、もしくは縮むvarTailはgspがそこを指している)

(追記:

foo()
{

    ....

    bar() // の中でクロージャが作られたとする

    let {   // インラインだがgspは現フレームの直後に無い
    } 

}

難しいね。)

(追記:オペランドスタックと戻り値スタックは普通のスタックでいい。gsp/sp構造は変数スタックで生きる)