13

鉴于我可以在几秒钟内编译 300 个类,Java 的实现可以只使用 Java 源文件而不是字节码作为输入,然后编译并缓存输入源代码,并且永远不会再次编译它(例如 python 这样做,还有很多的语言实现做同样的事情,除了甚至不费心缓存):

  1. 这种初始的编译体验相当于用户已经习惯的安装过程
  2. 这将消除在字节码解释器中实现非平凡验证任务的需要(实际上只是重新实现部分编译时检查),从而降低实现复杂性。
  3. 当前的 Java 每次启动时都会验证输入字节码,即使它之前已经验证过。第 2 点当然会减少启动时间,因为它消除了这一步(尽管当前的 Java 平台也可以在某处缓存“已检查”状态以减少启动时间,我不确定它是否这样做)
  4. 这将允许实现按他们想要的(或根本不编译)进行编译,例如为了性能。Android 甚至不使用 Java 字节码,它使用 dalvik 字节码,因为他们声称它更适合他们的需求(例如,在他们的硬件上性能更高)。如果不存在字节码,谷歌做出的这个设计决定将是完全透明的。
  5. 这将促进开源

回答了为什么分发字节码而不是本机代码,但要清楚,我想知道为什么甚至有一个编译格式来分发?假设编译很重要,为什么不让运行时编译源并缓存它呢?

我能想到的唯一剩下的理由是混淆,但是......

  • 当前编译器的编译方式,可以非常准确地对代码进行机械反编译
  • 源代码也可以被混淆

...所以这一点被简化为直觉会说字节码比源代码更复杂,因此拥有字节码分发格式可以欺骗商人认为他们的 IP 受到保护(即字节码会“增加价值”,但是没有技术原因)。

为什么 Java 平台设计用于向用户分发字节码,而不是向用户分发源代码?我在互联网上的任何地方都找不到对此的解释。我在这里失踪有很大的原因吗?


如果您给出原因,您可能应该说明这是语言设计者最初拥有的原因,还是今天仍然有效的原因。

4

1 回答 1

5

你只是在你的小世界里思考。编译源代码并提供字节码有一些令人信服的理由:

  • 下载时间(Applet 应该成为一种被广泛接受的网络技术)——用户不需要源,为什么要保留源?减少传输的信息量意味着更快的下载。
  • 减少启动时间。每次运行都进行编译,需要额外的时间。如果您可以每秒编译 300 个类,那么现在仅在 JRE 上就意味着额外的 5-10 秒启动时间。你知道,1995 年的机器速度有点慢。
  • Java 面向多种平台。有些平台不如您的 PC 强大。想想嵌入式和移动设备。他们可能既没有存储空间,也没有编译代码的能力。
  • 字节码允许将任何语言编译为字节码——不仅仅是 Java。还有很多其他语言可以编译成字节码。您愿意为它们中的每一个安装一个新的编译器吗?
  • 公司通常不愿意将“来源”从他们手中拿出来。如果程序要“以源代码”交付,Java 将面临更多的接受问题。
  • 字节码是一种足够简单的机器码形式,可以直接在硬件中执行(有一些嵌入式设计支持部分原生字节码)。

我敢肯定,字节码还有更多的优点,我什至都没有。

于 2013-05-27T18:23:27.433 回答