Java编译器:Java语言应该如何映射到JVM指令?

Java编译器:Java语言应该如何映射到JVM指令?,java,compiler-construction,Java,Compiler Construction,Java语言中构造的语义由Java语言规范定义,但它们不是根据JVM指令定义的。那么,是否有可能不严格定义规范来防止Java编译器的错误实现呢?或者Java语言和JVM指令之间的映射非常简单,不必担心这一点?如果Java代码与JVM指令之间存在清晰的映射,那么将语言与字节码分离的意义就大打折扣了。相反,编译器可以自由地确定哪些指令最能代表提供的源代码,以优化实际运行的效率 这确实意味着编译器可能会做错误的事情,但是一般来说,您可以相信像Oracle这样的主要编译器正在做正确的事情;他们接受了很多

Java语言中构造的语义由Java语言规范定义,但它们不是根据JVM指令定义的。那么,是否有可能不严格定义规范来防止Java编译器的错误实现呢?或者Java语言和JVM指令之间的映射非常简单,不必担心这一点?

如果Java代码与JVM指令之间存在清晰的映射,那么将语言与字节码分离的意义就大打折扣了。相反,编译器可以自由地确定哪些指令最能代表提供的源代码,以优化实际运行的效率

这确实意味着编译器可能会做错误的事情,但是一般来说,您可以相信像Oracle这样的主要编译器正在做正确的事情;他们接受了很多测试

Java语言中构造的语义由Java语言规范定义,但它们不是根据JVM指令定义的。那么,是否有可能不严格定义规范来防止Java编译器的错误实现呢

当然可以。较新版本的Java语言规范使用了比以前版本更正式的表示法。这应该有助于减少歧义和误解的可能性,但任何主要用英语编写的语言规范都容易被误解

或者Java语言和JVM指令之间的映射非常简单,不必担心这一点

我认为“直截了当”是一种主观的衡量标准o) 当然,这比我最初预期的要简单得多

编译器(
javac
)本身似乎在优化方面做得不多,请参见示例。大多数优化实际上是由JVM在运行时(通过热点)完成的


其他编译器实现可能会进行更多优化。此外,还有一些字节码处理器(如ProGuard)可以对字节码进行优化。

IBM曾经有一个java编译器,它不仅速度非常快,而且产生了比Sun的
javac
更好的代码。所以我的猜测是否定的,java代码到JVM指令没有严格的映射,否则没有编译器能比其他编译器做得更好。@PaulTomblin,编译器可以对生成的指令进行优化是合理的,但是我想知道,在JVM指令方面是否有一些严格的限制。任何给定的Java程序都可以通过几乎无限的方式转换为等效的JVM指令(如果编译为汇编语言,也是如此)。只要生成的字节码执行程序应该执行的操作(根据Java语言规范),这就是最重要的。更正,有无数种方法:-)@Todd,在我看来,“编译器可以对生成的指令进行优化”和“严格限制JVM指令”它们相互矛盾。该语言定义“for java statement
foo
编译器将生成jvm指令
bar
”,或者不生成,如果生成,则没有编译器优化的余地。