簡體   English   中英

為什么javac無法編譯Java 1.5代碼以在Java 1.4 JVM上運行?

[英]Why can't javac compile Java 1.5 code to run on Java 1.4 JVMs?

為什么Java編譯器不能將Java 1.5源代碼(例如for-each循環)編譯為Java 1.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等基本上只是語法糖!

(請注意,我可以看到,在1.4 JVM上執行時,顯然無法引用Java 1.5中引入的API類。我仍然對您堅持使用1.4 API的情況感興趣。)

因為Java 1.5提供了1.4 VM中根本不存在的功能。

如果您的源包含泛型,編譯器應該怎么做? 還是enum定義? 如果它進行自動裝箱怎么辦?

所有這些問題都有解決方法,但實現變通方法並不是Java編譯器的工作。 相反,您需要將源代碼移植到Pre-Java-5級別或使用諸如Retroweaver之類的工具(那里有一個更現代的替代品,但我一直忘記它的名字,因為幸運的是我不再需要使用它)。

還要注意的是,不使用任何新功能(Java 1.5的代碼enum ,自動裝箱,泛型)最有可能可以使用編譯-source 1.4

您是正確的,Java 1.5中的一些增強功能不涉及引入任何新的字節碼或類文件格式更改。 還有其他像注釋和枚舉。 因此,任意Java 1.5源代碼都無法編譯為有效的Java 1.4類。 話雖如此,有一個名為retroweaver的項目旨在將Java 1.5類文件轉換為http://retroweaver.sourceforge.net/上提供的Java 1.4類文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM