【发布时间】:2014-07-23 07:14:50
【问题描述】:
在查看 Java 源代码时,我发现了一些不寻常的文件,主要与 java.nio 包中的 ByteBuffers 相关,这些文件的源代码非常混乱,并被标记为 This file was mechanically generated: Do not edit!。
这些文件还包含大部分空行(有些甚至在 javadocs (!!?) 的中间),大概是为了防止行号发生变化。我还看到了一些 java 反编译器,例如 procyon-decompiler,它们可以选择保留行号,但我怀疑情况是否如此,因为在最终荣誉之前放置空行不会改变任何事情。
这里是其中的一些文件(我在网上找不到指向它们的任何链接,也没有粘贴它们,因为我不想破坏任何版权,但您可以在 src.zip 文件夹中找到它们JDK 安装文件夹的根目录):
- java.nio.ByteBuffer
- java.nio.DirectByteBufferR
- java.nio.Bits
- java.nio.BufferOverflowException
我很想知道:
- 哪些工具生成了这些文件?
- 为什么该工具保持行号相同?是否让调试(堆栈跟踪)更容易?
- 为什么要使用工具来生成它们,而所有其他类都是由人类编程的?
- 为什么该工具会在括号内随机放置空行,在最后的荣誉之前,甚至在 javadocs 中?
【问题讨论】:
-
我怀疑你会得到答案,因为该代码似乎已经存在了很长时间 - 请查看 this blog post from 2006,当时 Java 仍归 Sun 所有。
-
这些文件似乎是在构建过程中由一些预处理器从模板文件中生成的:hg.openjdk.java.net/jdk9/dev/jdk/file/3b298c230549/src/share/…
-
IIRC,C 预处理器由于在#if 或#else 之后跳过而插入空行。在这里,我认为基本原理很清楚:如果某些编译器在输出中标记错误,您会在原始输入中找到它。
标签: java openjdk bytebuffer