Java中字节码的用途是什么?

时间:2013-05-27 17:38:17

标签: java compilation portability bytecode

鉴于我可以在几秒钟内编译300个类,Java的实现可以只给Java源文件而不是字节码作为输入,然后编译和缓存输入源代码,永远不要再编译它(例如python这样做,许多语言实现都是这样做的,除非他们甚至懒得缓存):

  1. 这种初始编译体验相当于用户已经习惯的安装过程
  2. 这将消除在字节码解释器中实现verification的非平凡任务的需要(实际上只是重新实现编译时间检查的一部分),从而降低了实现的复杂性。
  3. 目前的Java,每次启动时都会验证输入字节码,即使它之前已经验证过。点2当然会减少启动时间,因为它消除了这一步骤(虽然当前的Java平台也可以缓存"检查"状态某处以减少启动时间,我不确定它是否会这样做)
  4. 这将允许实现编译但是他们想要(或根本不想),例如性能。 Android甚至不使用Java字节码,它使用dalvik字节码,因为它们声称它更适合他们的需要(例如在他们的硬件上更高效)。如果字节码不存在,那么Google做出的这一设计决定将完全透明。
  5. 这会促进开源
  6. This回答为什么分发字节码而不是本机代码,但为了清楚起见,我想知道为什么甚至有一个编译格式的分发呢?假设编译很重要,为什么不直接使用运行时编译源并对其进行缓存呢?

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

    • 当前编译器编译的方式,代码可以非常准确地进行机械反编译
    • 源代码也可以进行模糊处理

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

    为什么Java平台设计用于向用户分发字节码,而不是将源代码分发给用户?我无法在互联网上找到任何解释。我在这里错过了一个很重要的原因吗?


    如果你给出一个理由,你应该说明这是语言设计者最初的原因,还是今天仍然有效的理由。

1 个答案:

答案 0 :(得分:3)

你正在想着你的小世界。有一些令人信服的理由来编译源代码并提供字节码:

  • 下载时间(小应用程序应该成为广泛接受的Web技术) - 用户不需要源代码,为什么要保留源代码?减少传输的信息量意味着更快的下载速度。
  • 缩短启动时间。每次运行时编译都需要额外的时间。如果你可以每秒编译300个类,这意味着现在只有JRE的额外5-10秒启动时间。你知道,1995年的机器有点慢。
  • Java针对众多平台。有些平台没有PC那么强大。想想嵌入式和移动设备。他们可能既没有存储也没有编译代码的能力。
  • 字节码允许将任何语言编译为字节码 - 而不仅仅是Java。还有很多其他语言可以编译成字节码。您是否希望为每个编译器安装新的编译器?
  • 公司往往不愿意将“源头”从他们手中夺走。如果要在“源头”提供程序,Java会有更多的接受问题。
  • 字节码是一种简单的机器代码形式,可直接在硬件中执行(有一些嵌入式设计支持部分原生字节码)。

我确信有更多的字谜代码,我甚至都没有。