Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';javac是否编译Java1.5代码以在Java1.4JVM上运行?_Java_Javac - Fatal编程技术网

为什么可以';javac是否编译Java1.5代码以在Java1.4JVM上运行?

为什么可以';javac是否编译Java1.5代码以在Java1.4JVM上运行?,java,javac,Java,Javac,为什么Java编译器不能将Java1.5源代码(例如for-each循环)编译成Java1.4字节码 我知道您可以提供一个-target 1.4开关,它告诉编译器生成符合1.4的字节码,但这也需要-source 1.4 $ javac -target 1.4 -source 1.5 Test.java javac: source release 1.5 requires target release 1.5 我现在正在学习编译器构造课程,据我所知,编译器将源代码转换为中间表示形式。为什么这样的

为什么Java编译器不能将Java1.5源代码(例如for-each循环)编译成Java1.4字节码

我知道您可以提供一个
-target 1.4
开关,它告诉编译器生成符合1.4的字节码,但这也需要
-source 1.4

$ javac -target 1.4 -source 1.5 Test.java
javac: source release 1.5 requires target release 1.5
我现在正在学习编译器构造课程,据我所知,编译器将源代码转换为中间表示形式。为什么这样的中间表示不能作为1.4兼容字节码输出?这听起来是一项非常简单的任务,因为对于每个循环,varargs等基本上只是语法糖


(注意,我可以看到Java 1.5中引入的API类在1.4 JVM上执行时显然不能被引用。我仍然对坚持使用1.4 API的情况感兴趣。)

因为Java 1.5提供了1.4 VM中根本不存在的特性

如果源代码包含泛型,编译器应该怎么做?还是一个
enum
定义?如果它会自动装箱呢

所有这些问题都有解决办法,但实现解决办法不是Java编译器的工作。相反,您需要将源代码移植到Java-5之前的级别,或者使用一个工具,例如(有一个更现代的替代品,但我一直忘记它的名称,因为幸运的是我不再需要使用它)


还请注意,Java 1.5中不使用任何新功能(
enum
、自动装箱、泛型)的代码很可能可以使用
-source 1.4
编译。您可以正确地看到,Java 1.5中的一些增强没有引入任何新的字节码或类文件格式更改。还有其他类似注释和枚举的功能。因此,无法将任意Java 1.5源代码编译为有效的Java 1.4类。也就是说,有一个名为retroweaver的项目,旨在将Java 1.5类文件转换为Java 1.4类文件。

为了学究,所有版本的通用信息在编译时都会被删除,1.5和1.6自动装箱可以完全在编译器中处理,不是吗?Enum因1.5之前的java.lang.Enum不足而受到阻碍。@matt b:更迂腐:不,不是。它在运行时被擦除。
.class
文件在许多地方仍然包含泛型信息(类定义、字段定义、方法签名等)。只有运行时会忽略它(加载后)@tomanderson:Autoboxing可以很容易地替换为(和类似的方法)。除此之外,此方法仅自1.5起存在。用
newinteger(int)
替换它可能会在不完美的代码中产生微妙的错误。我只是感到困惑:我们可以将Scala和JRuby实例编译为Java 1.5字节码,但不能编译为Java 1.6源代码!在我看来,从Scala到1.5字节码的飞跃比从Java1.6到1.5字节码的飞跃要长几光年。(我希望有一个更“基本”的原因。)有趣的旁注:注释可以存储在类文件中,这些类文件很容易被1.4时代的JVM读取。它们只是具有特殊值的属性,JVM会忽略未知属性。