私自身の言語インタープリタの実装に興味があります。 Sebestaの「プログラミング言語の概念」の第10章によれば、新しいARI(アクティブレコードインスタンス)は、プログラミング言語がこのような入れ子関数を可能にするときに静的な親で埋められる。この単純な例では静的な親(静的リンク)を持つopensourceインタープリタの実装はありますか?
f(){
int x;
g() { int y = x+1; ..} // definition of g
k(t) { // definition of k
h(t) { t();..} // definition of h... it calls g() via t()
h(t); // this will call g();
}
k(g); // this will call h() with g
}
、Gが呼び出されたとき、Gのための新しいARIが作成され、このARIの静的リンクをfのARIが供給され、以前にランタイムスタックに存在。
しかし、ARIの静的な親を「実行時に」決定する方法を明確に理解することは難しいです。最も単純な方法は、静的な親の既存のARIを見つけるまでランタイムスタック全体を検索することですが、効率的な方法ではないと言われています。だから私はより良いオプションを試してみたいと思っています。これは "呼び出し元の静的な祖先をナビゲートしています。"
上記の例では、g()がt()を介してh()から呼び出されたときに、まず呼び出し元hに行きました(この例では、呼び出し元の静的リンクから静的リンクをたどってこれを達成できます) )の静的な親のARIを見つけ、再びそのARIの静的な親に行き、f()のARIを満たすまで繰り返す。したがって、この例では、h-k-fのARIのチェーンに従います。 (より深いネスティングのために、より長いARIリンクのチェーンをたどります。)
私の質問は次のとおりです。
- (以下、簡単な)方法上記の各ARIの静的リンクを使用しているJavaScriptのようなネストされた関数、と一般的に使用される 言語の実際の通訳やコンパイラ、のいずれかがありますか?
- もしそうなら、インタプリタ/コンパイラのソースコードをチェックして動作を確認する方法はありますか?
ありがとうございます。ここで
私は通訳を書いて以来、あなたが言及した書物を持っていることはありません。通訳者を書いてからしばらくしていますが、一般的に、この場合は 'f'を呼び出しています。 'g'を呼び出します。明らかに、 'f'は自分自身のフレームがどこにあるかを知っているので、' g'のフレームに設定されている間、そのフレームへの参照をかなり簡単にスティックすることができます。 –
おかげさまで、ありがとうございました。 g()が親f()から直接呼び出されたときのあなたのアプローチが非常に妥当であると私は同意します。しかし、私の質問はより複雑なネストされた状況を含んでいました。私は混乱した記述には申し訳なく思っています。私はより詳細な質問を改訂しました。 – fcmonoid