7

私は今 SICP を読んでいますが、5.5.6 SICP のレキシカル アドレス指定で説明されているレキシカル アドレス指定の必要性がよくわかりません。

「私たちの言語はレキシカルスコープであるため、式のランタイム環境は、式が表示されるプログラムのレキシカル構造に対応する構造を持ちます」と書かれているので、実行時に変数を検索するのに同じコストがかかると思います-コンパイル環境で検索するときの環境。なぜわざわざコンパイル環境を実装するのでしょうか? コンパイル環境は、プログラムの字句構造に対応する同じ構造になると思いますが、これは実行環境と同じですよね。

4

1 に答える 1

10

レキシカル アドレス指定は、変数の検索を高速化するのに役立ちます。レキシカル アドレス指定がなければ、変数を検索するには、実行時に現在の環境のフレーム、またはそれを囲む環境のフレームなどをすべてトラバースする必要があります。これは本の中で言及されています:

これまでに実装したコンパイラは、評価マシンの変数値の検索操作を使用するコードを生成します。これは、変数を現在バインドされている各変数と比較することで変数を検索し、フレームごとにランタイム環境を外側に向かって処理します。フレームが深くネストされている場合、または多くの変数がある場合、この検索は高価になる可能性があります。

対照的に、レキシカル アドレッシング ルックアップの手順は、コンパイル時に変数を見つける場所を正確に認識しているため、変数を見つけるのに必要な時間が大幅に短縮されます。

lexical-address-lookup引数として、環境と、2 つの数値で構成されるレキシカル アドレスを受け取ります: 通過するフレーム数を指定するフレーム番号と、そのフレームで通過する変数の数を指定する変位数です。Lexical-address-lookup現在の環境に相対的なその字句アドレスに格納されている変数の値を生成します。この操作をマシンに追加すると、.lexical-address-lookupではなく、この操作を使用して変数を参照するコードをコンパイラに生成させることができますlookup-variable-value

于 2012-06-17T03:52:17.150 に答える