C++には複数の継承があります。アセンブリレベルでの多重継承の実装は非常に複雑ですが、これが正常に行われる方法(vtables、ポインタフィックスアップ、サンクなど)にはオンラインでdescriptionsが良いです。Javaインターフェイスはどのように内部実装されていますか? (vtables?)
Javaには複数の実装継承がありませんが、複数のインタフェース継承があるため、クラスごとに1つのvtableを使用した簡単な実装では実装できません。 Javaは内部的にどのようにインターフェイスを実装していますか?
私はJavaがJitコンパイルされていることを認識しています。したがって、異なるコードが異なるように最適化されている可能性があります。ですから、多くのJVMがこれに従う一般的な戦略があるのですか、あるいは特定のJVMの実装を知っている人はいますか?
また、JVMは仮想化とインラインのメソッド呼び出しを行うことがあります。その場合、vtableや同等のものはまったく含まれていないため、仮想/インターフェイスメソッド呼び出しを実装する実際のアセンブリシーケンスについて尋ねるのは理にかなっていませんが、 JVMは、すべてを偽造することができなかった場合でも、クラスの一般的な表現を使用しています。この仮定は間違っていますか?この表現はC++のvtableのように見えますか?もしそうなら、インタフェースには別々のvtableがあり、これらはクラスvtablesとどのようにリンクされていますか?もしそうなら、オブジェクトインスタンスはC++のオブジェクトインスタンスのような複数のvtableポインタ(クラス/インタフェースvtablesへ)を持つことができますか?同じオブジェクトへのクラス型とインタフェース型の参照は常に同じバイナリ値を持っているのでしょうか、あるいはポインタ補完を必要とするC++のように異なることがありますか? (参考:this questionは、私はJavaのための類似した何かを見つけることができていないCLRについて似た何かを要求し、それが今では時代遅れもよいがthis msdn articleで良い説明があるように見える。)
編集:
- 私はJavaクラスArrayListの」の意味で、Listインタフェースを実装していない、「どのようにGCCコンパイラは、整数加算/機能は、/ etc呼び出しを実装しない」の意味での「道具」を意味"
- これはJVMのバイトコードレベルでどのように動作するのかを知っています。クラスファイルのロードとバイトコードのコンパイルが完了した後、JVMによってどのようなコードとデータ構造が生成されるのかを知りたいと思います。
あなたはインターフェイスの継承と実装の継承について言及します。実装の継承は、定義された検索順序を持つ必要があるため困難です。インターフェイスの継承は簡単です。実装する必要のあるすべてのメソッドシグネチャを持つマップがあります。検索オーダーは必要ありません(これに実装されている実装がないため)。そこには順序はありません。 – extraneon