4

Java 如何将变量名与内存中的位置相关联?

我对此的第一个想法是必须有一个静态表用于所有变量名,将它与它的值或它的值的位置相关联。它是否存在并且该表是否有正式名称?

4

2 回答 2

4

原始类型变量的值是一些数字,引用类型变量的值是一个引用(通常是内存地址)。

现在的问题是:给定变量的存储值在哪里。这取决于变量的种类——有局部变量、实例变量(字段)和类变量(静态字段)。

本地人的名字在编译期间被解析。每个变量都成为方法中的第 i 个变量,并将作为第 i 个变量存储在某个方法调用的堆栈帧中。

例如变量它会有所不同。字段名称始终存在于字节码中(但通常不会出现在 JIT 编译器生成的机器代码中)。给定类的所有对象都具有相同的布局,因此类可以存储给定字段的偏移量- 距对象开头的距离。解释器可以读取对象的地址并添加偏移量来计算变量存储在哪里。

类变量类似于实例变量,但更简单。在这种情况下,类存储其变量的名称和值。

于 2013-05-13T23:05:46.223 回答
0

从历史上看,编译包括创建一个符号表,它将变量名称与其从源代码确定的属性相关联。出于说明的目的,这有点简单,但是自从 FORTRAN 有用以来,原则并没有改变。C++ 和 Java 等语言中的用户定义类型构成每个编译单元的元数据的一部分,这些元数据在编译期间收集,并在创建运行时可执行文件或加载到内存中时组合在一起。

请注意,必须先定义所有类型,然后才能使用它们定义类型的对象。这就是 Java 中的“import”和 C/C++ 中的“#include”的目的。元数据包括方法和对象(或类)数据元素的定义,并用于确定要在静态内存、堆栈(块进入/退出)或堆(动态分配)中创建的对象的大小。

在编译时或执行期间进行类型检查是过去四十年来最重要的发展之一,也是我们能够在火星、加利福尼亚高速公路或互联网上使用自主机器人的主要原因。在它的核心,编程语言编译或翻译的核心问题是跟踪所有已知的对象并将其放置在内存中,以便在运行时正确使用它。

像 FORTRAN 和 COBOL 这样的古代语言有一种类型的变量(静态),它只有基本的数据类型属性。他们有几乎微不足道的符号表。最复杂的问题是将编译单元链接在一起以便执行。宝贝,我们已经走了很长一段路!

于 2013-05-13T23:35:13.497 回答