Kotlin编译器如何在文件中查找对象

时间:2019-03-13 09:22:41

标签: java kotlin

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

所以编译器从上到下移动-但是它可以从任何地方检索函数对象?

2 个答案:

答案 0 :(得分:0)

类似于Java的语言从上到下,即方法范围内的一行一行。
Java编译器实际上逐行地将您以特定方法编写的源代码转换为称为 byte-code 的中间形式,JVM使用该中间形式来解释并在机器上运行。

请注意,JAVA还会创建一个图以解决前向依赖性,例如检查变量分配中的函数调用的输出是否正确,或者是否需要向上转换等。

而像Javascript这样的语言有一个称为“变量提升”的概念,其中所有声明的变量都会自动放在顶部,以供其余函数使用。

答案 1 :(得分:0)

section 6.3 of the Java Language Specification规定了变量和方法的范围。 Java编译器必须遵守这些规则,而不管其实现方式如何。只要它符合范围规则的规范,就可以自上而下,自下而上或横向扫描文件。

在您提出的代码示例中,Kotlin范围规则与Java十分相似;也就是说,局部变量在声明后 是可见的,而全局范围内的函数在任何地方都是可见的。

相关问题