Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java接口是如何在内部实现的?(vtables?)_Java_Interface_Internals_Vtable_Language Implementation - Fatal编程技术网

java接口是如何在内部实现的?(vtables?)

java接口是如何在内部实现的?(vtables?),java,interface,internals,vtable,language-implementation,Java,Interface,Internals,Vtable,Language Implementation,C++具有多重继承。在程序集级别实现多重继承可能相当复杂,但在通常情况下如何实现这一点上有很多好的在线方法(vtables、指针修正、thunks等) Java没有多个实现继承,但它有多个接口继承,所以我认为一个简单的实现,每个类只有一个vtable,不能实现这一点。java如何在内部实现接口 我意识到,与C++不同,java是JIT编译的,所以不同的代码可以不同的优化,不同的JVM可能会做不同的事情。那么,许多JVM是否遵循一些通用的策略,或者是否有人知道在特定JVM中的实现 此外,JVM经常

C++具有多重继承。在程序集级别实现多重继承可能相当复杂,但在通常情况下如何实现这一点上有很多好的在线方法(vtables、指针修正、thunks等)

Java没有多个实现继承,但它有多个接口继承,所以我认为一个简单的实现,每个类只有一个vtable,不能实现这一点。java如何在内部实现接口

<>我意识到,与C++不同,java是JIT编译的,所以不同的代码可以不同的优化,不同的JVM可能会做不同的事情。那么,许多JVM是否遵循一些通用的策略,或者是否有人知道在特定JVM中的实现

此外,JVM经常进行设备化和内联方法调用,在这种情况下,根本不涉及vtables或等效项,因此询问实现虚拟/接口方法调用的实际程序集序列可能没有意义,但是我假设大多数JVM仍然保留一些类的通用表示,如果它们不能将所有东西都虚拟化,那么可以使用它们。这个假设是错误的吗?这个表示是否像C++ VTABLE那样看起来?如果是这样,接口是否有单独的vtables?这些vtables如何与类vtables链接?如果这样,对象实例可以有多个VTABLE指针(类/接口VTABLE),像C++中的对象实例一样吗?对同一对象的类类型和接口类型的引用总是具有相同的二进制值,或者这些不同之处可能与在C++中需要指针固定的情况不同吗?p> (供参考:询问有关CLR的一些类似问题,在中似乎有一个很好的解释,尽管这可能已经过时了。我还没有找到与Java类似的东西。)

编辑:

  • 我的意思是“implements”,意思是“GCC编译器如何实现整数加法/函数调用/etc”,而不是“Java类ArrayList实现列表接口”
  • 我知道这在JVM字节码级别是如何工作的,我想知道的是,在加载类文件和编译字节码之后,JVM生成了什么样的代码和数据结构
热点JVM的关键特性是。 这实际上并不意味着目标方法是内联的,而是意味着一个假设 被放入JIT代码中,以后对虚拟或接口方法的每次调用都将以该代码为目标 完全相同的实现(即调用站点是单态的)。在这种情况下 检查是否编译为机器代码,假设是否实际成立(即 目标对象的类型与上次相同),然后传输控制 直接到目标方法-根本不涉及虚拟表。如果断言失败,可能会尝试将其转换为一个巨型调用站点(即具有多种可能的类型);如果这也失败了(或者是第一次调用),将使用vtables(对于虚拟方法)和itables(对于接口)执行常规的冗长查找


编辑:提供了有关vtable和itable存根的更多详细信息。在多态情况下,它仍然将内联缓存版本放入调用站点。然而,代码实际上是一个存根,它在vtable或itable中执行查找。每个vtable偏移量(0、1、2,…)有一个vtable存根。在给定偏移量处查找itable(如果找到)之前,在itable数组上添加线性搜索。

您提到了接口继承和实现继承。实现继承很困难,因为您需要定义搜索顺序。接口继承要简单得多。您只需要有一个包含所有需要实现的方法签名的映射。不需要搜索顺序(因为没有附加任何实现)。那里没有秩序。那些VirtualCalls和InterfaceCall上的热点Wiki页面似乎就是我要找的。但是,我仍然需要四处阅读。维基已经被移动到oracle维基,已经被冻结,我认为这就是可更新信息的最终目的。