gpt4 book ai didi

Java 字节码 : types of local variables?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:55:47 26 4
gpt4 key购买 nike

根据这篇文章http://slurp.doc.ic.ac.uk/pubs/observing/linking.html#assignment :

Due to the differences in information between Java code and bytecode (bytecode does not contain the types of local variables), the verifier does not need to check subtypes for assignments to local variables, or to parameters.

我的问题:为什么字节码不包含局部变量的类型信息,而它确实包含参数和返回值的类型信息?

最佳答案

首先,有几种不同的类型概念。有编译时类型,其中包括泛型。但是,泛型在编译时间后不存在。

有一个变量的验证推断静态类型,可以是int、float、long、double、returnaddress,也可以是对象引用。对象引用还带有上限类型,因此所有引用都是 java/lang/String 的子类型。字段还可以具有短类型之一:byte、short、char 或 boolean。出于执行目的,它们与 int 相同,但具有不同的存储空间。

最后是运行时类型,它与经过验证的静态类型相同,但在对象引用的情况下,表示被引用实例的实际类型。请注意,由于验证者惰性,在某些情况下,运行时类型实际上可能不是已验证类型的子类型。例如,声明类型为 Comparable 的变量实际上可以保存 Hotspot 中的任何对象,因为 VM 不会在验证时检查接口(interface)。

除非通过用于反射和调试的可选属性,否则不会保留编译时信息。这是因为没有理由保留它。

局部变量没有明确的类型信息(新的 StackMapTable 属性除外,但这是技术问题)。相反,当类被加载时,字节码 validator 通过运行静态数据流分析来推断每个值的类型。这样做的目的不是像编译时类型检查那样捕获错误,因为假定字节码在编译时已经通过了这种检查。

相反,验证的目的是确保指令对 VM 本身没有危险。例如,它需要确保您没有使用整数并将其作为对象引用进行解释,因为这可能会导致任意内存访问和入侵 VM。

因此,虽然字节码值没有显式类型信息,但它们确实具有隐式类型,这是静态类型推断的结果。虽然它们应该遵循 JVM 标准,但其细节因每个 VM 的内部实现细节而异。但您只需要担心手写字节码。

字段具有显式类型,因为 VM 需要知道其中存储的数据类型。方法参数和返回类型被编码在所谓的方法描述符中,也用于类型检查。它们不可能自动推断,因为这些值可以来自或去往任何地方,而类型检查是在每个类的基础上完成的。

附言在谈论验证类型时,我遗漏了一些小细节。对象类型还跟踪它们是否已被初始化,如果未初始化,则由哪条指令创建它们。地址类型跟踪创建它们的 jsr 的目标。

关于Java 字节码 : types of local variables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16001584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com