Entityまでの解決した問題
特設:非局所制御のメモ化
メモ化が有効かどうか。これは二つの側面を持ちます。第一に、値の記録を行うかどうか。第二に、記録された値を参照するかどうか。でも、どちらも同じでいいです。
メモ化が有効かどうかは、以下のルールの重畳で決まります。第一に、非局所制御のセンシティブな引数を計算する過程では有効。第二に、新たに起動されたサブルーチンの実行中は無効。
メモ化を参照するとき、すべての引数が一致していれば、読み出し演算を実行せず、かわりに保存されている値を使います。
これとはぜんぜん別に、メモを「忘れる」のはいつか、という問題があります。これは、非局所制御が解決されるとき、すなわち、content 引数の計算を始めるか、サブルーチンを起動するか、読み出し演算が終わるときです。ただし、非局所制御を解決する過程で非局所制御を起動したのが終了したときは、メモを忘れてはいけませんね。
メモ化を実装して理論上は速くなったはずですが、用途によってはやはり遅いです。overwrite を可能ならば underwrite に書き換えると、気休め程度に速くなります。(遅いのは仕方ないとしても、もうちょっと工夫してみたいです)
常設展
非局所制御のメモ化を実装しました。ただし細かいところが要求を満たしているかどうかテストしていません。サンプルプログラムが高速に動くことは確認済みです。(仕様が単純になったので、あまり確認すべきことはありません)
巨大なメモリリークにおびえていましたが、いつの間にか直っていました。search_offset_holder_context 関数の /* 3 January 2009 */ と刻印のあるところです。
プログラム全体を main routine 手続きで囲むかもしれません。(一応そうしておきました)
インストラクションアレイを生成する C のプログラムを書き出すやつを作ります。パステルステッチの開発ツールとしてはじめて、パステルステッチ自身で書かれるかもしれません。(実現しました。ただし動作は遅いです)
オフセットホルダーコンテキストに対して trace をできるようにしようかと思います。現状では、実行中コンテキストでのアドレス履歴を発見できなかったら上へたどっていく仕様だったような気がします。(現状のままでいいということになりました)
「メモ化しろよ」というnita先生からのお達しにより、非局所制御にメモ化を入れます。センシティブな引数の計算中に発生した読みだし演算は、非局所制御の発生を禁止するか、メモ化します。前者がデフォルトです。非局所制御の発生が禁止された状態で、メモ化許可の読みだし演算を使用すると、非局所制御は最許可されます。非局所制御の連鎖は、トップレベルの読み出し演算につき1回までなら許容できるという原則によります。(この仕様は発展的に解消しました)
mulde サブルーチンの終了時に削除予約バッファを解決すべきです。(現状ではそうなっているみたいです。mulde ブロックをコンパイルするとき CLEAR_FORGET_BUFFER インストラクションを挿入しています。)
プログラマがまちがえて write 命令の to 引数にベクトル以外のものを入れたとき、interface error とか言って落ちます。(直りました。現状では何も言わずに次のステップに進みます。)
動的スコープの仕様が変更されたとき、最初に設定されるオフセットホルダーコンテキストがおかしいです。(直りました。MICRO_OPEN_START_TRANSLATION の中で search_offset_holder_context を呼んでいます。)
- 最終更新:2009-03-29 02:02:17
