【问题标题】:How are interfaces represented at a lower/assembly level?接口如何在较低/装配级别表示?
【发布时间】:2020-02-06 22:25:25
【问题描述】:

我了解对象只是数据块,其中第一个成员变量的起始位置与对象完全相同。例如,指针指向位置 0x0100 的对象也将具有位于 0x0100 的第一个成员变量。

但是,像 Java 这样没有实现的语言中的接口如何工作?这些是纯粹的抽象类型。

CPU 或编译器如何知道根据上下文将对象 A 解释为接口 X,或将对象 B 解释为接口 X 和 Y?这是在编译器级别完成的,与较低级别的解释无关吗?

【问题讨论】:

  • 了解 vtables。
  • Java 编译为 Java 字节码,而不是机器码。与机器代码相比,Java 字节码是一种相当高级的表示,解释它的 Java VM 实际上知道每个对象实现了哪些接口。
  • 例如在 C++ 中,是的,对象布局等在编译时是已知的。给定一个指向没有虚拟成员函数的对象的指针,没有关于它的类型的信息。我认为 Java 接口就像 C++ 中的纯虚拟基类。

标签: object assembly interface linker compiler-construction


【解决方案1】:

您需要了解,在 Java 和 C# 等语言中,实例的第一个成员是指向类共享对象的指针;此对象参与识别被实例化的实际类、检查向下转换、确定调用虚拟方法调用的覆盖以及确定用于接口方法调用的实现。

但是像 Java 这样没有实现的语言中的接口如何工作?这些是纯粹的抽象类型。

当然接口本身是“抽象的”,但是接口方法总是在具体类(实现接口)的实例上调用,所以这就是实现的地方。

该语言处理接口,类似于类(抽象类和具体类),将它们的方法分配给索引,并在查找中(在实例的类共享对象处)使用这些方法索引来查找要调用的实际实现。

因此,关键是接口方法在每个可实例化类型(实现接口)的类共享对象内的方法引用数组中被指定位置,这样每个类都可以有不同的接口方法实现.

【讨论】:

  • 谢谢!最后3段很好地解释了这一点。但是,什么是“类共享对象”?这是 .obj 文件、内存中的实际对象还是其他什么?
  • 它是内存中的对象,具有某种结构(它包含或引用数组),但不一定是真正的 Java 或 C# 对象,因为它可以在运行时实现的内部。它就像 C++ 中的 vtable,一个不向程序员宣传的低级内部结构,因此它的实现可以根据需要而变化(例如,随着时间的推移,语言的版本控制,或同一语言的不同实现者)。每个可以拥有实例的类都有其中一个,所以当我们执行new X (...) 时,X 类的对象由隐藏的第一个字段中的实例引用。
猜你喜欢
  • 2021-01-27
  • 2021-10-22
  • 2016-04-28
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
相关资源
最近更新 更多