鉴于我可以在几秒钟内编译 300 个类,Java 的实现可以只提供 Java 源文件而不是字节码作为输入,然后编译和缓存输入的源代码,并且不再编译它(例如 python 这样做,并且许多语言实现都做同样的事情,除了甚至懒得去缓存):
- 这种初始编译体验相当于用户已经习惯的安装过程
- 这将消除实现 verification 的重要任务的需要在字节码解释器中(实际上只是重新实现部分编译时检查),降低了实现的复杂性。
- 目前的 Java 在每次启动时都会验证输入的字节码,即使它之前已经验证过了。第 2 点当然会减少启动时间,因为它消除了这一步(尽管当前的 Java 平台也可以在某处缓存“已检查”状态以减少启动时间,但我不确定它是否这样做)
- 这将允许实现按照他们想要的方式进行编译(或根本不编译),例如为了性能。 Android 甚至不使用 Java 字节码,它使用 dalvik 字节码,因为他们声称它更适合他们的需求(例如,在他们的硬件上性能更高)。如果字节码不存在,谷歌做出的这个设计决定将是完全透明的。
- 这将促进开源
This回答为什么分发字节码而不是 native 代码,但要清楚,我想知道为什么甚至有一个编译格式用于分发?假设编译很重要,为什么不让运行时编译源代码并缓存它呢?
我能想到的唯一剩余理由是混淆,但是......
- 当前编译器的编译方式,代码可以非常准确地机械反编译
- 源代码也可以被混淆
...所以这一点被归结为直觉会说字节码比源代码更复杂,因此具有字节码分发格式允许欺骗商人认为他们的 IP 受到保护(即字节码将“增加值(value)” ",但没有技术原因)。
为什么 Java 平台设计为向用户分发字节码,而不是向用户分发源代码?我在互联网上的任何地方都找不到对此的解释。我在这里失踪有什么重要原因吗?
如果您给出原因,您可能应该说明这是语言设计者最初的原因,还是今天仍然有效的原因。
最佳答案
您只是在您的小世界中思考。编译源代码并交付字节码有一些令人信服的理由:
- 下载时间(Applets 应该成为一种被广泛接受的网络技术)- 用户不需要源,那么为什么要保留源?减少传输的信息量意味着更快的下载。
- 减少启动时间。每次运行都要编译,需要额外的时间。如果您每秒可以编译 300 个类,这意味着如今仅在 JRE 上的启动时间就会增加 5-10 秒。你知道,1995 年的机器速度有点慢。
- Java 面向多种平台。有些平台不如您的 PC 强大。想想嵌入式和移动设备。他们可能既没有存储空间也没有编译代码的能力。
- 字节码允许将任何语言编译成字节码——不仅仅是 Java。还有很多其他语言可以编译成字节码。您是否愿意为它们中的每一个安装一个新的编译器?
- 公司通常不愿意将“资源”从他们手中交出。如果程序以“源代码”的形式交付,Java 将面临更多的验收问题。
- 字节码是一种机器码形式,足够简单,可以直接在硬件中执行(有一些嵌入式设计具有部分 native 字节码支持)。
我敢肯定还有更多字节码的优点我还没想过。
关于java - Java中字节码的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16778056/