您可以使用字节码执行任何操作,您可以在本机代码中轻松快速地执行此操作。从理论上讲,您甚至可以通过在字节码中分发程序和库然后在安装时编译为本机代码而不是JIT来保持平台和语言独立性。
所以一般来说,你什么时候想要执行字节码而不是本机?
答案 0 :(得分:31)
Java有三个优点 使用字节代码而不是去 系统的本机代码:
可移植性:每种计算机都有其独特的指令 组。虽然有些处理器包括 他们的前辈的说明, 程序通常都是正确的 在一种计算机上运行 不会运行任何其他。加入 经营提供的服务 系统,每个系统描述 它有自己独特的方式,你有一个 兼容性问题。一般来说,你 无法编写和编译程序 一种系统并在任何系统上运行它 其他没有很多工作。 Java得到了 通过插入来限制此限制 它的虚拟机之间 应用和真实环境 (电脑+操作系统)。如果 应用程序编译为Java字节 代码和字节代码被解释 然后在每个环境中以相同的方式 你可以编写一个程序 将适用于所有不同的 支持Java的平台。 (无论如何,这就是理论 练习总有小事 不相容在于等待 程序员。)
安全性:Java的优点之一是它与Web的集成。加载 一个使用Java进入你的网页 浏览器和Java代码是 自动下载并执行。 但是,如果代码破坏了文件, 无论是恶意还是邋.. 程序员的一部分? Java的 防止下载的小程序执行 任何破坏性的东西 潜在的危险行动。 之前它允许代码运行它 检查它是否试图绕过 安全。它验证数据是否正确 始终如一地使用:代码 将数据项操作为整数 在一个阶段然后尝试使用它 作为指针稍后将被捕获 阻止执行。 (Java 语言不允许指针 算术,所以你不能写Java 代码来做我们刚才描述的。 但是,没有什么可以阻止的 有人写破坏性的字节 使用十六进制编码自己 编辑甚至构建Java字节 代码汇编程序。)通常不是 可以分析一个程序 执行前的机器代码和 确定它是否有任何作用 坏。写作的伎俩 自我修改代码意味着邪恶 直到经营甚至可能不存在 后来。但是设计了Java字节码 对于这种验证:它 没有说明a 恶意程序员会用来隐藏 他们的攻击。</ p>
- 醇>
大小:在微处理器领域,RISC通常更受欢迎 过CISC。有一个小的更好 指令集和快速使用 做工作的指示比有 许多复杂的操作实现为 单指令。 RISC设计 在芯片上需要更少的门 实施他们的指示,允许 为管道和其他更多的空间 制定每条指令的技巧 快点。但是,在翻译中, 这一切都不重要。如果你想 实现单一指令 带有变量的switch语句 长度取决于案件数量 条款,没有理由不这样做 所以。实际上,是一个复杂的指令集 是基于网络的优势 语言:它意味着相同 程序将更小(更少 更复杂的指示), 这意味着转移的时间更短 我们的速度限制网络。
因此,在考虑字节代码与本机代码时,请考虑在可移植性,安全性,大小和执行速度之间进行哪些权衡。如果速度是唯一重要的因素,那就去当地吧。如果其他任何一个更重要,请使用字节码。
我还要补充一点,为每个版本维护一系列针对相同代码库的操作系统和面向架构的编译可能变得非常繁琐。在多个平台上使用相同的Java字节码并让它“正常工作”是一个巨大的胜利。
答案 1 :(得分:15)
基本上任何程序的性能如果被编译,使用性能分析执行,并且结果反馈到编译器进行第二次传递,将会得到改善。实际使用的代码路径将更积极地优化,循环展开到完全正确的程度,并且热指令路径被安排为最大化I $命中。
所有好东西,但它几乎从未完成,因为通过这么多步骤构建二进制文件很烦人。
这是在将字节码编译为本机代码之前运行字节码一段时间的优势:分析信息自动可用。实时编译后的结果是针对程序正在处理的特定数据的高度优化的本机代码。
能够运行字节码还可以实现比静态编译器可以安全使用的更积极的本机优化。例如,如果注意到函数的一个参数始终为NULL,则可以从本机代码中简单地省略对该参数的所有处理。将对函数序言中的参数进行简短的有效性检查,如果该参数不为NULL,则VM将中止回字节码并再次开始分析。
答案 2 :(得分:9)
字节码创建了一个额外的间接级别。
这种额外的间接水平的优点是:
一些缺点:
答案 3 :(得分:3)
所有好的答案,但我的热门按钮已被击中 - 表现。
如果正在运行的代码花费所有时间调用库/系统例程 - 文件操作,数据库操作,发送窗口消息,那么如果它是JITted则无关紧要,因为大部分时钟时间都花在等待那些较低级别的操作要完成。
然而,如果代码包含我们通常称之为“算法”的内容,必须快速且不会花太多时间调用函数,和如果这些是经常使用的是性能问题,然后JIT非常重要。
答案 4 :(得分:2)
我想你刚才回答了自己的问题:平台独立性。生成与平台无关的字节码并将其分发到其目标平台。执行时,它会在执行开始之前或同时(Just In Time)快速编译为本机代码。 Java JVM和.NET运行时可能就是按照这个原则运行的。
答案 5 :(得分:2)
此处:http://slashdot.org/developers/02/01/31/013247.shtml
去看看Slashdot的极客对此有什么看法!有点过时,但非常好的评论!
答案 6 :(得分:1)
理想情况下,您可以使用便携式字节码将Just In Time编译为本机代码。我认为字节码解释器在没有JIT的情况下存在的原因主要是由于本机代码编译增加了虚拟机的复杂性。构建,调试和维护该附加组件需要时间。并非每个人都有时间或资源来做出这一承诺。
次要因素是安全性。验证解释器不会崩溃比保证本机代码相同更容易。
第三是表现。生成机器代码通常需要花费更多的时间,而不是为只运行一次的小块代码解释字节码。答案 7 :(得分:0)
可移植性和平台独立性可能是字节码优于本机代码的最显着优势。