当前位置: 首页 > 面试题库 >

字节码比本机代码有什么优势?

万坚壁
2023-03-14
问题内容

看起来您可以用字节码做的任何事情,都可以像使用本机代码一样轻松快捷地完成。从理论上讲,您甚至可以通过以字节码分发程序和库,然后在安装时编译为本地代码,而不是JIT来保持平台和语言的独立性。

因此,通常来说,什么时候您要执行字节码而不是本机?


问题答案:

SGI的Hank Shiffman说(很久以前,但这是事实):

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

  1. 可移植性
    :每种计算机都有其独特的指令集。尽管某些处理器包括其前辈的说明,但通常可以肯定的是,在一种计算机上运行的程序不会在任何其他计算机上运行。添加操作系统提供的服务,每个系统都以其独特的方式对其进行描述,因此您会遇到兼容性问题。通常,如果没有很多工作,就无法为一种系统编写和编译程序并在其他系统上运行它。Java通过在应用程序和实际环境(计算机+操作系统)之间插入其虚拟机来解决此限制。如果将应用程序编译为Java字节代码,并且在每种环境中都以相同的方式解释该字节代码,则可以编写一个程序,该程序将在支持Java的所有不同平台上运行。(无论如何,这是理论。实际上,等待程序员总是会存在一些小的不兼容性。)

  2. 安全
    :Java的优点之一是将其集成到Web中。将使用Java的网页加载到浏览器中,然后Java代码将自动下载并执行。但是,如果代码破坏了文件,无论是通过程序员的恶意还是过分破坏,该怎么办?Java通过禁止潜在的危险操作来防止已下载的applet进行任何破坏性的工作。在允许代码运行之前,它会检查是否有绕过安全性的尝试。它验证数据是否被一致使用:将捕获并阻止执行将数据项作为一个整数操作,然后在稍后阶段尝试将其用作指针的代码。(Java语言不允许使用指针算术,因此您无法编写Java代码来完成我们刚刚描述的操作。但是,没有什么可以阻止某人使用十六进制编辑器自己编写破坏性字节代码,甚至无法构建Java字节代码汇编器。像编写自我修改代码这样的技巧意味着邪恶的操作甚至可能在以后才存在。但是Java字节码是为这种验证而设计的:它没有恶意程序员用来隐藏其攻击的指令。像编写自我修改代码这样的技巧意味着邪恶的操作甚至可能在以后才存在。但是Java字节码是为这种验证而设计的:它没有恶意程序员用来隐藏其攻击的指令。像编写自我修改代码这样的技巧意味着邪恶的操作甚至可能在以后才存在。但是Java字节码是为这种验证而设计的:它没有恶意程序员用来隐藏其攻击的指令。

  3. 尺寸
    :在微处理器领域,RISC通常优于CISC。最好有一个小的指令集,并使用许多快速指令来完成一项工作,而不是将许多复杂的操作实现为单个指令。RISC设计需要较少的芯片门来实现其指令,从而为流水线和其他技术留出更多空间,以使每条指令更快。但是,在口译员中,这都不重要。如果要为case语句的switch语句实现一条指令,该指令的长度取决于case子句的数量,则没有理由不这样做。实际上,复杂的指令集对于基于Web的语言是一个优势:这意味着同一程序将更小(更少的指令,更复杂),

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

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



 类似资料:
  • 问题内容: 看起来您可以使用字节码执行的任何操作都可以像使用本机代码一样轻松,更快地完成。从理论上讲,您甚至可以通过以字节码分发程序和库,然后在安装时编译为本机代码,而不是JIT来保持平台和语言的独立性。 因此,通常来说,什么时候您要执行字节码而不是本机? 问题答案: SGI的Hank Shiffman说(很久以前,但这是事实): Java使用字节码而不是使用系统的本机代码具有三个优点: 可移植性

  • 问题内容: Java很慢。 这似乎不仅仅是一个“城市传奇”。由于延迟,您不将其用于实时编码,也不将其用于集群/并行计算。有成千上万的基准测试,特别是“ Java vs C#vs C ++”。 http://benchmarksgame.alioth.debian.org/ 根据以上站点,不仅Java性能几乎与C一样好(远远没有C),而且Scala和Clojure(两种在JVM上运行的功能语言)都具

  • 答案可能存在于某个地方,但我找不到。我从我正在创建的一个算法中得出这个问题。实质上是,如果s1包含s2,则返回true,忽略希腊语/英语字符差异。例如,字符串“nai,of course”包含字符串“vaxi”。不过,这与我的问题无关。

  • 问题内容: Java字节码注入到底是什么?为什么要使用它? 问题答案: Java代码编译为字节码()。字节码注入正在运行时进行修改,以在加载和运行之前立即将代码注入其中。 想象一个场景,我想找出多少次方法 在中被调用。我可以在类加载期间使用该拦截器编写一个代理,然后使用ASM对其进行修改,以便调用方法条目。 现在,我可以运行我的程序了: 并且在运行时,不仅可以完成其正常工作,而且还可以完成我在每次

  • 错误: Test.ts(18,30):错误TS2345:类型为“{color1:String;}”的参数不能分配给类型为“squareConfig”的参数。对象文本只能指定已知属性,并且“SquareConfig”类型中不存在“Color1”。