代码之家  ›  专栏  ›  技术社区  ›  Jay Conrod

字节码相对于本机代码有哪些优势?[闭门]

  •  38
  • Jay Conrod  · 技术社区  · 17 年前

    似乎任何可以使用字节码的操作都可以在本机代码中轻松、快速地完成。理论上,您甚至可以通过在字节码中分发程序和库,然后在安装时编译为本机代码,而不是JIT,来保持平台和语言的独立性。

    一般来说,什么时候执行字节码而不是本机代码?

    8 回复  |  直到 17 年前
        1
  •  31
  •   Hynek -Pichi- Vychodil    17 年前

    SGI的汉克·希夫曼(Hank Shiffman)说(很久以前,但直到现在都是真的):

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

    1. 便携性 :每种计算机都有其独特的指令 设置而有些处理器包括 给前辈的指示, 一个程序 它运行在一种计算机上 不会在其他任何人身上运行。加上 运营商提供的服务 系统,每个系统在 它自己独特的方式,你有一个 兼容性问题。总的来说,你 无法为编写和编译程序 一种系统,并在任何 通过插入 应用程序和真实环境 (计算机+操作系统)。如果 代码,并解释该字节码 在任何环境中都是如此 你可以编写一个程序 将在所有不同的 (不管怎么说,这就是理论。在 实践总是有小的 等待的不相容性 程序员。)

    2. 安全 :Java的优点之一是它与Web的集成。负载 浏览器和Java代码是 自动下载并执行。 但是如果代码破坏了文件呢, 无论是恶意还是草率 防止下载的小程序执行以下操作: 不允许任何破坏性的行为 在它允许代码运行它之前 检查它是否试图绕过 一致使用:代码 将数据项作为整数进行操作 在某个阶段,然后尝试使用它 阻止执行。(爪哇 语言不允许指针 我们刚才描述的代码。 有人禁止写破坏性字节 使用十六进制编码 编辑器,甚至构建Java字节 代码汇编程序。)通常不是 可以分析程序的 执行前的机器代码和 令人不快的写作等技巧 自我修改代码意味着邪恶 操作可能甚至不存在,直到 后来但是Java字节码是设计出来的 对于这种验证:它 没有说明吗 恶意程序员会用它来隐藏 他们的攻击。

    3. 大小 中钢协。最好有一个小房间 指令集和使用多个fast 指示做一项工作比有 许多复杂的操作都是按 单一指令。RISC设计 需要芯片上更少的门来 执行他们的指示,允许 为管道和其他设备提供更多空间 制作每个指令的技巧 更快。然而,在翻译中, 这些都无关紧要。如果你想 为 带有变量的switch语句 长度取决于案例数量 但是,没有理由不这样做 所以事实上,一个复杂的指令集 是基于web的应用程序的优势 语言:意思是相同的 更复杂的指令), 这意味着转移的时间更短

    因此,在考虑字节代码与本机时,考虑在可移植性、安全性、大小和执行速度之间进行权衡。如果速度是唯一重要的因素,那就去本地吧。如果其他任何一个更重要,请使用字节码。

        2
  •  15
  •   DGentry    17 年前

    如果对任何程序进行编译、使用评测执行,并将结果反馈到编译器中进行第二次传递,则基本上任何程序的性能都会提高。实际使用的代码路径将得到更积极的优化,循环将完全展开到正确的程度,热指令路径的安排将最大化I$命中。

    所有这些都是好东西,但它几乎从未完成过,因为构建二进制文件需要经过这么多步骤,这很烦人。

        3
  •  9
  •   Brian R. Bondy    17 年前

    这种额外的间接级别的优点是:

    • 平台独立性
    • 可以轻松创建跨语言转换器
    • x86、x64和IA64不再需要编译为单独的二进制文件。只需要安装正确的虚拟机。
    • 每个操作系统只需要创建一个虚拟机,它将支持相同的程序。
    • 即时编译允许您仅通过替换单个修补的源文件来更新程序。(对网页非常有益)

    • 表演
    • 更容易反编译
        4
  •  3
  •   Mike Dunlavey    17 年前

    所有答案都很好,但我的热键被点击了-性能。

    如果正在运行的代码将所有时间都花在调用库/系统例程上——文件操作、数据库操作、发送windows消息,那么它是否出现抖动就无关紧要了,因为大部分时钟时间都花在等待那些较低级别的操作完成上。

    然而 如果 代码中包含了我们通常称之为“算法”的东西,它们必须很快,并且不需要花太多时间调用函数, 如果经常使用这些工具会造成性能问题,那么JIT是非常重要的。

        5
  •  2
  •   Kyle Cronin    17 年前

    我想你刚刚回答了自己的问题:平台独立性。生成独立于平台的字节码并将其分发到目标平台。执行时,它会在执行开始之前或同时快速编译为本机代码( Just In Time

        6
  •  2
  •   Marcio Aguiar    17 年前

    在这里: http://slashdot.org/developers/02/01/31/013247.shtml

    去看看Slashdot的极客们怎么说!有点过时,但评论很好!

        7
  •  1
  •   Josh Segall    17 年前

    理想情况下,您应该有可移植的字节码,可以及时编译为本机代码。我认为字节码解释器之所以没有JIT,主要是因为本机代码编译增加了虚拟机的复杂性这一实际事实。构建、调试和维护该附加组件需要时间。并不是每个人都有时间或资源做出这样的承诺。

    三是绩效。生成机器代码通常比解释只运行一次的小块代码的字节码要花更多的时间。

        8
  •  0
  •   Fiery Phoenix    13 年前

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