JVM是否无法检测到变量下面的变量(在相同范围内)?
也就是说,它们只能检测在该变量之前声明的变量。
我只是想了解编译器如何在文件中查找对象(这是其局限性):
kotlin代码
fun main(args : Array<String>) {
var first: Int = second + 2 // Unresolved Reference: Second
var second: Int = 1
var third: Int = 1 + returnTwo() // works fine
}
fun returnTwo(): Int = 2
所以编译器从上到下移动-但是它可以从任何地方检索函数对象?
答案 0 :(得分:0)
类似于Java的语言从上到下,即方法范围内的一行一行。
Java编译器实际上逐行地将您以特定方法编写的源代码转换为称为 byte-code 的中间形式,JVM使用该中间形式来解释并在机器上运行。
请注意,JAVA还会创建一个图以解决前向依赖性,例如检查变量分配中的函数调用的输出是否正确,或者是否需要向上转换等。
而像Javascript这样的语言有一个称为“变量提升”的概念,其中所有声明的变量都会自动放在顶部,以供其余函数使用。
答案 1 :(得分:0)
section 6.3 of the Java Language Specification规定了变量和方法的范围。 Java编译器必须遵守这些规则,而不管其实现方式如何。只要它符合范围规则的规范,就可以自上而下,自下而上或横向扫描文件。
在您提出的代码示例中,Kotlin范围规则与Java十分相似;也就是说,局部变量在声明后 是可见的,而全局范围内的函数在任何地方都是可见的。