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

Dog*_*Dog 12 java portability bytecode compilation

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

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

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

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

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

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

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


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

Dur*_*dal 5

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

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

我确信字节码还有更多我还没有想到的优点。

  • 一些优点和缺点。“减少启动时间。每次运行时进行编译,需要额外的时间”您未能阅读完整的问题;@Dog明确提出了一种缓存机制来解决这个问题,并且由于没有字节码验证而减少了启动时间。您的“字节码作为汇编语言”这一点是没有实际意义和临时性的,因为它最初并不是为了编译其他语言,并且已被证明对于某些其他语言来说是可怕的。编译为 JavaScript 也同样有效。 (3认同)
  • 字节码与压缩源的大小差异微不足道。Dalvik 的存在证明了最后一点是错误的。IP 和在小型设备上运行的点正是我所想到的...... (2认同)