2

私は小さな Lisp インタープリター (Google コードの sapid Lisp) を Python と sapid Lisp 自体に実装しました。おそらく、その主な特徴は、例外による末尾および相互再帰の最適化を実装することです。実装の詳細はこちらhttps://sites.google.com/site/sapidlisp/recursion-optimization .

標準的な手法よりも優れている点は、末尾再帰の最適化を行うために再帰インタープリターに適用する変更が限られていることです。デメリットはタイミングかもしれません。

Python デコレーター ( http://code.activestate.com/recipes/474088/ )で使用されている同様の手法を見つけました。このテクニックをそのコンテキストに入れるために、私は Lisp やその他のインタープリター言語でこのようなテクニックを説明している参考文献を探しています。何か情報はありますか?

4

2 に答える 2

4

エリの答えを見てください。しかし、もう少しコンテキストを追加すると、MTA手法に関する Baker の Cheney は、C スタックを (世代別 GC のように) 継続フレームやその他のオブジェクトのナーサリとして使用する適切な末尾再帰を実装するためのよく知られたトリックでした。(末尾再帰のほとんどの実装がそうであるように) スタックを小さく保つのではなく、この手法はスタックをしばらく成長させてから、時々大きなジャンプ ( longjmp、execption など) でスタックをクリアします。スタックをクリアする前に、すべてのライブ データをスタックからヒープにコピーします。

スタックをトレースし、オブジェクトをスタックからヒープにコピーすることができ、その意思がある限り、これは問題なく機能します。Eli が引用した論文 (Continuations from Generalized Stack Inspection) は、スタックを直接検査できない「管理された」プラットフォームにこのトリックを適用することに関するものです。

于 2011-09-25T12:05:55.953 に答える
3

Pettyjohn らによるGeneralized Stack Inspection からの継続、およびJoe Marshall による関連補遺を参照してください。

(「解釈された」、それが最近何を意味するにせよ、主題とは何の関係もありません。)

于 2011-09-25T10:59:50.740 に答える