编译器如何引用自己的输出

时间:2019-03-11 13:37:44

标签: java compilation compiler-construction

“ foreach”是Java语言的关键字,当编译器在源代码中遇到此关键字时,它知道此关键字后面的集合必须实现“ iterable”接口。 “ iterable”接口本身就是一段已编译的Java代码,因此编译器如何引用自己的输出,编译器如何依赖于自己的输出?

想想过去的一个假设点,当时只有Java编译器(可能是用C或C ++编写),而Java框架尚未编译。 Java.lang包及其中的所有内容尚未编译,因此当时没有Iterable接口。 Java编译器将从源代码编译Java.lang包的源代码,并在将来构建可迭代接口的字节码。在那个时间点上,Java编译器必须以某种方式知道可迭代的接口(因为它是语言规范的一部分),因此它可以编译使用foreach迭代器的源代码。这怎么可能?

1 个答案:

答案 0 :(得分:0)

首先,“ foreach”不是Java关键字。搜索“ extended for loop in java”。 第二件事,java中的接口仅仅是抽象实际的实现。当我们有真正的实现类时,就不必实现接口。但是,为了遵循诸如SOLID原则之类的良好设计原则,我们使Interfaces首先抽象实际的实现,并且还使Java中的多个类层次结构成为抽象。 关键字不实现接口。如果java关键字实现并引用任何Java代码,则其与引导程序绝对相关的意思是用Java语言编写的Java编译器。长期存在的问题的总体答案是,您需要研究编译器构造,构建JVM语言,引导程序等。