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

2024-05-04

似乎用字节码可以做的任何事情都可以在本机代码中轻松且更快地完成。理论上,您甚至可以通过以字节码形式分发程序和库,然后在安装时编译为本机代码,而不是对其进行 JIT 来保持平台和语言的独立性。

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


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

Java的三大优势 使用字节码而不是去 系统的本机代码:

  1. 可移植性:每种计算机都有其独特的指令 放。虽然某些处理器包括 给前辈的指示, 一般来说,一个程序是正确的 在一种计算机上运行 不会在任何其他上运行。添加在 运营商提供的服务 系统,每个系统都在 它自己独特的方式,你有一个 兼容性问题。一般来说,你 无法编写和编译程序 一种系统并在任何系统上运行 其他无需太多工作。 Java获取 通过插入来绕过这个限制 它的虚拟机之间 应用与真实环境 (计算机+操作系统)。如果 应用程序被编译为Java字节 代码和字节码被解释 在每个环境中都以同样的方式 你可以编写一个程序 将适用于所有不同的 支持 Java 的平台。 (无论如何,这就是理论。在 实践总有小事 不兼容性正在等待 程序员。)

  2. Security:Java 的优点之一是它与 Web 的集成。加载 一个使用 Java 的网页 浏览器和Java代码是 自动下载并执行。 但是如果代码破坏了文件怎么办? 无论是出于恶意还是马虎 就程序员而言?爪哇 阻止下载的小程序执行 任何破坏性的事物都不允许 潜在危险的操作。 在允许代码运行之前 检查它是否试图绕过 安全。它验证数据是 一致使用:编码 将数据项作为整数进行操作 在某个阶段然后尝试使用它 作为指针稍后将被捕获并且 阻止执行。 (爪哇 语言不允许指针 算术,所以你不能写Java 执行我们刚刚描述的操作的代码。 然而,没有什么可以阻止 有人写了破坏性的字节 使用十六进制对自己进行编码 编辑器甚至构建 Java 字节 代码汇编器。)通常不是 可以分析程序的 执行前的机器代码和 确定它是否执行任何操作 坏的。像写作一样的技巧 自修改代码意味着邪恶 操作甚至可能不存在,直到 之后。但是Java字节码是被设计出来的 对于这种验证: 没有说明 恶意程序员会用来隐藏 他们的攻击。

  3. Size:在微处理器领域,RISC 通常更受欢迎 超过 CISC。最好有一个小的 指令集多且使用快 指示做某事而不是拥有 许多复杂的操作实现为 单一指令。 RISC设计 芯片上需要更少的门 执行他们的指示,允许 为管道和其他设备提供更多空间 制作每条指令的技巧 快点。然而,在翻译中, 这些都不重要。如果你想 执行单个指令 带变量的 switch 语句 长度取决于案例数量 条款,没有理由不这样做 所以。事实上,一个复杂的指令集 是基于网络的一个优势 语言:意思是一样的 程序会更小(更少 更复杂的指令), 这意味着转移时间更短 通过我们的限速网络。

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

我还要补充一点,为每个版本维护相同代码库的一系列操作系统和针对体系结构的编译可能会变得非常乏味。在多个平台上使用相同的 Java 字节码并让它“正常工作”是一个巨大的胜利。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字节码相对于本机代码有哪些优点? [关闭] 的相关文章

  • 如何检查 NTAccount 对象代表组还是用户?

    使用返回的访问规则时 GetAccessRules True True GetType System Security Principal NTAccount 如何判断每个规则中引用的 NTAccount 对象是用户帐户还是组 Update
  • Lazy 实现和 .NET 泛型

    我正在寻找进行延迟初始化的方法并发现Lazy
  • 有没有办法在不重新编译的情况下覆盖 .NET Windows 服务名称?

    我有一个 Windows 服务可执行文件 我知道它是用 NET 编写的 我需要将其安装在不同的服务名称下以避免冲突 安装无论如何都不提供指定服务名称 如果我只能访问二进制文件 当我使用 installutil 安装它时是否可以覆盖服务名称
  • 为什么抽象类应该实现抽象基类的抽象方法?

    在下面的示例中 该类Derived实现抽象方法method从课堂上Main 但我想不出在抽象中填写方法体的理由Derived类的实现 当然 我应该只在实际类中实现抽象方法 那么我怎样才能避免这样做呢 我还可以做些什么 abstract cl
  • JFace ColumnWeigthData 导致父级增长

    我有一个 Eclipse RCP 应用程序 并且想要在TableViewer using ColumnWeigthData as ColumnLayoutData 问题是父表单 ScrolledForm在示例代码中 每当我布局表格时都会增加
  • 如何在 Eclipse 中使用其他外部 jar 依赖项创建不可运行/不可执行的 jar

    我无法通过 Eclipse 导出向导创建普通的 jar 不可运行 不可执行 它仅创建 jar 文件 但不会导出依赖的 jar 从而在从其他类调用导出的 jar 的方法时出现错误 请帮助 非常感谢 kurellajunior的建议 它是通过使
  • Jenkins 的代码覆盖率 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 创建正则表达式匹配数组

    在Java中 我试图将所有正则表达式匹配返回到一个数组 但似乎您只能检查模式是否匹配某些内容 布尔值 如何使用正则表达式匹配来形成与给定字符串中的正则表达式匹配的所有字符串的数组 4城堡的回答 https stackoverflow com
  • .Net应用程序设置路径

    默认情况下 Windows 应用程序设置保存在该目录中 USERPROFILE Local Settings Application Data
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 如何在Java媒体框架中学习.wav持续时间?

    我正在尝试使用 java 媒体框架将 mov 文件与 wav 文件合并 因此我需要知道它们的持续时间 我怎样才能做到这一点 任何想法 将不胜感激 您可以使用以下方式了解声音文件的持续时间 即 VitalyVal 的第二种方式 import
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • Hibernate HQL:将对值作为 IN 子句中的参数传递

    我面临一个问题 如何使用 IN 子句将查询中的成对值的参数传递给 HQL 例如 select id name from ABC where id reg date in x y 并且参数是不同的数据类型string id 和reg date
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 防止Java实例化的正确方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么应该首选 Java 类的接口?

    PMD https pmd github io 将举报以下违规行为 ArrayList list new ArrayList 违规行为是 避免使用 ArrayList 等实现类型 而是使用接口 以下行将纠正违规行为 List list ne
  • 有没有办法禁用 .NET 标签的“双击复制”功能?

    这真的很烦人 我使用标签作为列表项用户控件的一部分 用户可以单击它来选择列表项 然后双击它来重命名它 但是 如果剪贴板中有名称 双击标签会将其替换为标签文本 我还检查了应用程序中的其他标签 双击它们也会将其复制到剪贴板 我没有在这个程序中编
  • 为什么范围为“provided”的依赖项会隐藏 Maven 中的传递依赖项?

    我的 Maven 项目中有三个模块 这稍微简化了 model包含JPA注释的实体类 坚持实例化一个实体管理器并调用它的方法 应用创建类的实例model 设置一些值并将它们传递给坚持 model and 坚持显然取决于javax persis
  • 如何在不同版本的Google App Engine中使用自定义域名?

    我使用谷歌应用程序引擎作为我的 Android 和 Web 应用程序的服务器 我使用 Android Studio 开发了 Android 应用程序 并使用 Eclipse 开发了 Web 应用程序 我在应用程序引擎中部署了两个版本 第一个

随机推荐