Java中字节码的目的是什么?

2022-09-04 23:06:22

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

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

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

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

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

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

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


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


答案 1

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

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

我敢肯定,字节码还有更多的优点,尽管我还没有。


答案 2

推荐