假设我可以在几秒钟内编译300个类,那么Java的实现就可以直接使用Java源文件而不是字节码作为输入,然后编译并缓存输入的源代码,并且永远不会再次编译它(例如Python就是这样做的,许多语言实现也是如此,甚至不必费心缓存):
- 这个初始编译体验将等同于用户已经习惯的安装过程。
- 这将消除在字节码解释器中实现verification(实际上只是重新实现了部分编译时检查)的非常规任务,从而减少实现复杂性。
- 目前的Java会在每次启动时验证输入的字节码,即使它之前已经验证过了。第2点当然会减少启动时间,因为它消除了这一步骤(尽管当前的Java平台也可以在某个地方缓存“checked”状态以减少启动时间,我不确定它是否这样做)。
- 这将允许实现按照他们想要的方式进行编译(或者根本不编译),例如用于提高性能。Android甚至不使用Java字节码,它使用dalvik字节码,因为他们声称它更适合他们的需求(例如在他们的硬件上更有效)。如果没有字节码,Google做出的这个设计决策将完全透明。
- 这将促进开源
这解释了为什么要分发字节码而不是本地代码,但要明确的是,我想知道为什么需要编译后的格式进行分发?假设编译很重要,为什么不让运行时编译源代码并缓存它呢?
我能想到的唯一剩下的理由是为了混淆,但是...
- 当前编译器编译的方式使得代码可以被机械化地准确反编译
- 源代码也可以被混淆
...所以这一点被简化为直觉认为字节码比源代码更复杂,因此有一个字节码分发格式可以欺骗商人认为他们的知识产权受到保护(即字节码将“增加价值”,但没有技术原因)。
为什么Java平台设计为向用户分发字节码,而不是源代码?我在互联网上找不到任何解释。我是否漏掉了什么重要的原因?
如果你提出了一个理由,你应该明确它是语言设计者最初拥有的理由还是今天仍然有效的理由。