2008-09-07 177 views
38

看起来你可以用字节码做任何事情,你可以在本地代码中简单快速地完成任务。从理论上讲,甚至可以通过在字节码中分发程序和库,然后在安装时编译为本地代码而不是JITing,来保持平台和语言的独立性。字节码优于本地代码的优点是什么?

所以一般来说,你想要什么时候执行字节码而不是本地的?

回答

31

来自SGI汉克Shiffman表示(很久以前的事,但它的直到是):

Java有三个优点 使用字节码而不是去 系统的本地代码:

  1. 便携:每种计算机都有其独特的指令集 。虽然某些处理器包含针对其前身 的 指令,但在一种计算机 上运行的程序 通常不会在其他任何程序上运行。在 中增加了运行提供的服务 系统,其中每个系统描述的是 自己的独特方式,并且你有一个 的兼容性问题。一般来说,你的 不能编写和编译一个程序 一种系统并运行在任何其他 其他没有很多工作。通过在 应用程序和真实环境 (计算机+操作系统)之间插入 虚拟机,Java得到 围绕此限制。如果 应用程序编译成Java字节码 以及字节码解释 每个环境中以同样的方式再 你可以写一个程序, 将在所有地方支持的Java不同 平台上工作。 (这是理论,反正在 实践总是有小 不兼容性趴在等待 程序员。)

  2. 安全:一个Java的优点之一是其整合到Web。加载 一个网页,使用Java到您的 浏览器和Java代码是 自动下载并执行。 但是,如果代码破坏文件, 是通过程序员的恶意还是sloppiness ? Java 通过阻止潜在的危险操作阻止下载的小应用程序执行任何破坏性操作。 它允许代码运行它之前 检查它试图绕过 安全性。它验证数据是否始终如一地使用 :代码 在一个阶段将数据项作为整数 操作,然后尝试使用它,因为稍后将捕获指针并阻止其执行 。 (Java的 语言不允许指针 运算,所以你不能编写Java代码 做我们刚才所描述的。 但是,没有什么自己使用十六进制 防止 有人编写破坏性字节 码编辑器甚至建立一个Java字节 代码汇编器。)它通常不是 可能在执行前分析程序的 机器代码,并且 判断它是否做任何事情 不好。像写 自我修改代码这样的窍门意味着操作可能不会存在,直到 稍后。但是对于这种验证,Java字节码被设计为 :其 没有指示 恶意程序员将用来隐藏 他们的攻击。

  3. 大小:在微处理器世界中,RISC通常优于CISC上的 。最好有一个小的指令集 ,并使用许多快速的 指令来完成一项工作,而不是使用 许多复杂的操作作为 单一指令。 RISC设计 需要更少的芯片上的门到 实施他们的指令,允许 有更多的空间管道和其他 技术使每个指令 更快。然而在翻译中, 这些都不重要。如果你想为 实现单条指令,对于 switch语句的变量 长度取决于条件数 从句,没有理由不去做 等等。事实上,复杂指令集 是一个基于Web的 语言的优势:它意味着同样的 程序将会更小(更大的复杂性较少 指令), 这意味着更少的时间在我们的速度 - 转移 有限的网络。

因此,考虑字节码VS本土时,考虑你想可移植性,安全性,尺寸和执行速度之间做出哪些权衡。如果速度是唯一重要的因素,那就去当地。如果其他任何人更重要,请使用字节码。

我还会补充说,为每个发行版维护一系列操作系统和基于体系结构的目标编译代码可能会变得非常繁琐。在多个平台上使用相同的Java字节码并使其“仅工作”是一个巨大的胜利。

+4

4年后......可移植性:产生本地代码的编译器可以交叉编译,就像gc(官方的[Go](http://golang.org/)编译器),这使得它很简单。安全性:[Native Client](https://developers.google.com/native-client/)在沙盒中运行本地代码,从而限制其权限。大小:现在很少成为问题,即使是移动设备也是如此。 – 2012-08-01 14:08:02

2

我想你只是回答了你自己的问题:平台独立性。与平台无关的字节码被生成并分发到其目标平台。在执行之前,它可以在执行开始之前或同时快速编译为本地代码(Just In Time)。 Java JVM和据推测.NET运行时按照这个原则运行。

9

字节码创建额外的间接级别。

间接的这种额外层次的优点是:

  • 平台独立性
  • 可以创建任意数量的编程语言(语法),并让它们向下编译到相同的字节。
  • 可以轻松创建跨语言转换器
  • x86,x64和IA64不再需要编译为单独的二进制文件。只有正确的虚拟机需要安装。
  • 每个操作系统只需要创建一个虚拟机,它将支持同一个程序。
  • 只要及时编译,您就可以通过替换单个修补源文件来更新程序。 (非常有利的网页)

一些不足之处:

  • 性能
  • 更容易反编译
1

理想情况下,您可以使用便携式字节码将本地代码即时编译。我认为字节码解释器存在没有JIT的原因主要是由于本地代码编译增加了虚拟机的复杂性这一实际事实。构建,调试和维护该附加组件需要时间。并非每个人都有时间或资源来做出这一承诺。

次要因素是安全性。验证解释器不会崩溃比保证本地代码相同要容易得多。

三是表现。生成机器码通常需要更多的时间,而不是仅为只运行一次的小块代码解释字节码。

15

基本上任何程序的性能都会提高,如果它被编译,执行分析,并且结果反馈回编译器第二遍。实际使用的代码路径会更积极地进行优化,循环展开到正确的程度,并且热指令路径排列为最大化I $命中。

所有不错的东西,但它几乎从来没有完成,因为它经历了很多步骤来构建二进制文件令人讨厌。

这是在将代码编译为本地代码之前运行一段时间的优点:配置信息自动可用。 Just-In-Time编译之后的结果是针对程序正在处理的特定数据的高度优化的本地代码。

能够运行字节码也可以实现比静态编译器可以安全使用的更积极的本机优化。例如,如果一个函数的参数中的一个参数始终为NULL,那么对于该参数的所有处理可以简单地从本机代码中省略。将在函数序言中对参数进行简短的有效性检查,如果该参数不为NULL,则VM将中止返回字节码并再次开始分析。

3

所有很好的答案,但我的热键已被击中 - 表现。

如果正在运行的代码花费所有时间调用库/系统例程 - 文件操作,数据库操作,发送窗口消息,那么如果它被打乱,则无关紧要,因为大部分时间都用在等待为那些较低级别的操作完成。

然而,如果代码中包含的东西,我们通常所说的“算法”,即必须要快,不要花太多的时间通话功能,如果这些不经常使用足以成为一个性能问题,那么JIT是非常重要的。

0

可移植性和平台独立性可能是字节码相对于本机代码最显着的优势。

相关问题