1

値渡しセマンティクスは、インタープリターで簡単に実装できます (たとえば、ありふれた命令型言語の場合)。スコープごとに、識別子をその値にマップする環境を維持します。関数呼び出しを処理するには、新しい環境を作成し、引数のコピーを設定する必要があります。

参照によって渡される引数を許可すると、これは機能しません。このケースは通常どのように処理されますか?

4

1 に答える 1

2

まず、インタープリターは、引数が参照渡しできるものであること、つまり引数が代入ステートメントの左側で有効なものであることを確認する必要があります。たとえば、f参照渡しパラメータが 1 つある場合は、f(x)問題ありませんが (x := y意味があるため)、f(1+1)そうではありません (意味がありません1+1 := y)。典型的な修飾引数は、変数と、配列のインデックス付けのような変数のような構造です (が正当なインデックスでaある配列である場合、理にかなっているので問題ありません)。5f(a[5])a[5] = y

引数がそのチェックに合格した場合、インタープリターは関数呼び出しの処理中に参照する正確なメモリ位置を判断できます。新しい環境を構築するときは、そのメモリー位置への参照を参照渡しパラメーターの値として設定します。その参照が具体的にどのように見えるかは、インタープリターの設計、特に変数の表現方法に依存します。実装言語がサポートしている場合は単純にポインターを使用できますが、設計でそれが必要な場合はより複雑になる可能性があります (重要なことつまり、参照によって、参照されているメモリ位置に含まれる値を取得および変更できるようにする必要があります)。

インタープリターが関数の本体を解釈している間、環境には適切な値が含まれておらず、参照のみであるため、参照渡しパラメーターを特別に処理する必要がある場合があります。通訳者はこれを認識し、参照が何を指しているかを見に行く必要があります。たとえば、xがローカル変数でyあり、 が参照渡しパラメーターである場合、 と の計算x+1は(インタープリターの詳細に応じて) 異なる動作をする可能性がありy+1ます。xそれ; 後者では、yたまたま環境内でバインドされている参照を検索し、参照の反対側の変数に格納されている値を調べてから、それに値を追加する必要があります。同様に、x = 1そしてy = 1前者は の値を変更するだけですがx、後者は最初に参照がどこを指しているかを確認し、そこにある変数または変数のようなもの (配列要素など) を変更する必要があります。

環境内のすべての変数を値ではなく参照にバインドすることで、これを簡素化できます。変数の値を検索することは、参照渡しパラメーターの値を検索することと同じプロセスです。ただし、これは他の問題を引き起こします。それは、インタープリターの設計と言語の詳細によって異なります。

于 2013-07-17T07:34:21.030 に答える