2017-01-13 14 views
1

私は現在、Javaのような言語用のコンパイラを構築するコード生成段階に入っています。私は仮想メソッドの動的ディスパッチを実装する方法を理解しようとしています。動的ディスパッチ実装 - 仮想関数テーブルオフセット

すべてのクラスの仮想関数テーブルを作成し、すべてのオブジェクトにポインタを格納する方法を学びます。私が得られないことは、関数呼び出しのコードを生成するときに、テーブル内のその関数のオフセットがどのようなものかをどのように知っていますか?

ありがとうございました。

+0

これは、言語、コンパイラ、およびバイナリ表現の設計上の問題です。 JLSとJVMの仕様を勉強して、Javaのしくみ(Javaについて言及して以来)からいくつかの洞察を得ることを検討することができますが、バリエーションやその他の選択肢があります。全体として、この質問は広すぎてここでは答えることができません。 –

+0

データメンバーのオフセットをどのように知っていますか?これらの2つの問題はどうやって違いますか? – rici

答えて

0

あなたの言語で何が分かっていますか?あなたは解析中にそれをどこかに書き留めます。

私のおもちゃの言語の1つは、各クラスの "vtableサイズ"を維持することでした。クラスに新しいメソッドを追加すると、メソッドのオフセットとしてvtableサイズを書き留めますつまり、メソッド名を、そのパラメータ型やvtableのオフセットなどのメソッド名にマップするルックアップテーブルを作成し、新しく追加されたメソッドを考慮してサイズを追加します。

もちろん、これはあなたの言語が実際には例えばC++のようなvtableを使用することを前提としています。 SmalltalkまたはObjective-Cのスタイルでメッセージングを使用する場合、実際にビルドしたこのテーブルはコンパイルされた製品に保存され、そのまま使用されます。テーブルのルックアップは、オフセットに直接アクセスするよりも遅いだけでなく、呼び出し元がそのメソッドを呼び出すオブジェクトの型を知る必要がなく、オブジェクトにメソッドを簡単に追加できるという利点がありますプログラム全体を再コンパイルします。