Rhino、Google V8、Pythonなどのスクリプトインタープリターに関しては、スクリプト言語の文字列のみを前提として、基盤となるネイティブメソッドを決定するための一般的なアプローチはありますか?
ある時点で、これらのインタープリターはキーに文字列を含むハッシュマップを使用しますか?それとも、文字列の同等性のテストと分岐がたくさんありますか?
Rhino、Google V8、Pythonなどのスクリプトインタープリターに関しては、スクリプト言語の文字列のみを前提として、基盤となるネイティブメソッドを決定するための一般的なアプローチはありますか?
ある時点で、これらのインタープリターはキーに文字列を含むハッシュマップを使用しますか?それとも、文字列の同等性のテストと分岐がたくさんありますか?
通常、文字列キーを使用してハッシュ マップを使用しますが、数ナノ秒後にまったく同じ検索を再度実行する必要がないように、関数検索の結果は通常キャッシュされます。
もちろん、プログラムが関数に割り当てたり削除したりするなど、何かおかしなことが起こった場合は、キャッシュをクリアする必要があります。
JIT コンパイラーはインライン・キャッシングを使用して、キャッシュにデータが取り込まれると、予測可能な関数呼び出しを非常に高速に実行できます。
コンパイラは、基になる関数を直接呼び出すマシン コードを吐き出すことさえできます。繰り返しになりますが、プログラムがその関数を置き換えたり削除したりすると、コンパイルされたコードは無効になります。そのため、インタープリターはその状況を検出し、無効な JIT コードを更新または破棄する方法を備えている必要があります。
Python の場合、ソース コードが Python によって処理されると、すべての定義 (クラスとそのメソッド、通常の関数など) がコンパイルされます。コードの一部のコンパイルの結果は、コードをキャプチャするオブジェクトとして格納されます。名前は、イントロスペクションの目的でのみ内部に保存されます。ユーザーの観点からは、オブジェクトには名前が付けられていません。ただし、(クラスの、関数の) 名前は内部ハッシュ マップ (Python では辞書と呼ばれます) にキーとして格納されます。値は、名前のないオブジェクトへの参照です。
Python の任意の変数は、型指定されていない参照 (キー、ハッシュ マップの値) にバインドされた名前です。Python で名前が表示されるときはいつでも、参照変数を操作しています。上記のハッシュ マップ (辞書) での検索により、自動的に逆参照されます。
ユーザーは辞書にもアクセスできます。このようにして、このように機能することを試すことができます。次に、関数名を別の変数に代入するだけで、関数に別の名前 (たとえば、短い名前) を簡単に付けることができます。代入は、常に参照値を代入することを意味します。
CPython は、関数/メソッドのディスパッチに広く名前空間を使用します。これは、ハッシュ タイプ、別名「辞書」を意味します。
Pypy、Jython、IronPython などは、これを行う最善の方法について独自の考えを持っている場合があります。Python != CPython.