Java源碼中機器生成(mechanically-generated)的源文件

本文翻譯自 https://stackoverflow.com/questions/24904034/mechanically-generated-java-source-files-in-the-java-source-code

當我查看Java源碼時,我發現一些特別的文件,主要涉及的有java.nio包下的ByteBuffer等類似的類,有舍非常凌亂的源碼,還寫着This file was mechanically generated: Do not edit! ,這些文件通過機器生成的,不要編輯!

這些文件包含了大量空行(有些升值在javadocs中),大概是爲了防止行號更改,我也看過一些java反編譯器,類似procyon-decompiler,它有一個選項來保持行號,但我懷疑是這種情況,因爲在最終accolade前添加空白行不會改變什麼。

下面是其中一些文件(我在網上找不到它們的鏈接,也沒有粘貼,因爲我不想破壞任何版權,但你能在JDK安裝文件夾根目錄下的src.zip中找到它們)

  • java.nio.ByteBuffer
  • java.nio.DirectByteBufferR
  • java.nio.Bits
  • java.nio.BufferOverflowException

我很想知道

  • 什麼工具生成的這些文件?
  • 爲什麼工具要保持行號不變,爲了更容易debugger嗎?
  • 爲什麼要使用工具生成它們,而其他所有類都是由人編寫的?

我可能不能回答所有的問題,但一些背景是:

在Makefile的http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/make/java/nio/Makefile中,他們通過一些預處理程序從相同的模板文件生成不同的java源文件:

...
$(BUF_GEN)/CharBuffer.java: $(X_BUF_TEMPLATE) $(GEN_BUFFER_SH)
    $(prep-target)
    @$(RM) [email protected]
    TYPE=char SRC=$< [email protected] $(GEN_BUFFER_CMD)
    $(MV) [email protected] $@
$(BUF_GEN)/ShortBuffer.java: $(X_BUF_TEMPLATE) $(GEN_BUFFER_SH)
    $(prep-target)
    @$(RM) [email protected]
    TYPE=short SRC=$< [email protected] $(GEN_BUFFER_CMD)
    $(MV) [email protected] $@
...

$(X_BUF_TEMPLATE) 指的事 X-Buffer.java.template, 它是諸如CharbufferShortbuffer等類型緩衝區的源代碼。

注意:URL將來可能會改變。也很抱歉引用了Java7。在Java 8中他們已經修改了構建系統,到目前爲止我還沒有找到相應的makefile。

什麼工具生成的這些文件?

GEN_BUFFER_SH / GEN_BUFFER_CMD 最終指向了 genBuffer.sh, 創建了這些文件的腳本是 http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/make/java/nio/genBuffer.sh.

爲什麼要使用工具生成它們,而其他所有類都是由人類編寫的?

對於這種特殊情況,我沒有權威的答案,但通常你使用代碼生成工具可能由以下情況

  • 如果你需要創建許多相似的類/方法,這些類/方法只在某些細節上有所不同,但非常微妙,因此您不能使用已建立的機制,如泛型或方法參數(可能是這裏的情況,因爲緩衝區是爲不能與泛型一起使用的基本類型生成的)
  • 如果需要從更簡單的表示創建複雜的算法(比如從語法生成解析器)。

爲什麼工具要保持行號不變,爲了更容易debugger嗎?

我的猜測:是。它將行號保留在堆棧跟蹤中,以便它們與模板文件匹配。其他工具比如C預處理器工作原理類似。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章