当前位置: 首页 > 知识库问答 >
问题:

java解释器在逐行执行代码之前执行转换/翻译吗?

厍书
2023-03-14

维基百科和其他一些网站将口译员描述为将代码从某种高级语言翻译成某种低级语言的翻译人员。然而,有很多解释,包括stackoverflow,它说解释器直接执行作为输入的指令,而无需事先转换。那么,解释器是像编译器一样的翻译器,还是像CPU一样的执行器呢?

共有2个答案

安浩瀚
2023-03-14

当您编译Java代码时,您将其转换为Java字节码。当您执行Java程序时,您实际上调用Java虚拟机来解释Java字节码。JVM解释Java字节码,并从中生成特定于平台的字节码,然后由平台执行。

这是对其功能的简化解释,但它做的更多:如@GhostCat所说,除其他外,它有时编译经常执行的代码块,并保留已编译的版本(以特定于平台的字节码的形式),以避免每次都对其进行解释(这称为JIT编译)。

这使得Java编译和解释的混合体:源代码被编译为Java字节码,但Java字节码在特定平台上被解释。

庄飞
2023-03-14

这在很大程度上取决于情况。

您必须了解,当前的jvm实现是大型、强大的工具。

通常,它们有一个解释器部分。首先,它读取字节码并直接解释它自己。从其名称的直接意义上讲,Java虚拟机!

但是,一旦特定代码被重复执行(即数千次重复),所谓的即时编译器就会启动。他们将字节码转换为本机代码,并进行各种性能优化,例如方法内联。

因此,这样的JVM正在做您在问题中提到的两件事。

 类似资料:
  • 在标杆规格中,我读到 将 Unicode 字符的原始流中的 Unicode 转义(第 3.3 节)翻译成相应的 Unicode 字符。 \uxxxx 形式的 Unicode 转义,其中 xxxx 是十六进制值,表示编码为 xxxx 的 UTF-16 代码单元。此转换步骤允许任何程序仅使用 ASCII 字符表示。这里 这意味着词汇翻译仅适用于 ASCII 字符?因为当我尝试使用西里尔文,希伯来语或汉

  • 字节码的解释执行和AST的解释执行有类似之处,而且更简单,因为树形结构已经展开成顺序了,以栈虚拟机为例,为方便起见,假设所有的指令都在一个指令数组里,每个元素是一个指令对象,有code和arg两个属性,解释器入口: Object execute(Inst[] inst_list, Object[] func_arg); 由于continue和break已经被jmp指令代替了,这里我们认为exec

  • 问题内容: 我有一个包含以下内容的字符串: 我可以在Java中执行此字符串中的代码吗? 问题答案: 从Java 6开始,您 可以 使用SDK中的标准API 编译并运行定义为字符串或文件的Java 编译单元 (编译单元基本上是.java文件中的所有内容-包,导入,类/接口/枚举),看看这个例子。但是,您 不能 像问题中那样运行任意Java代码段。 如果可能的话,最好嵌入一种不同的脚本语言,该脚本语言

  • 问题内容: 我正在编写一个swing应用,当执行某些方法时,我希望有“ wait”光标。我们可以这样: 我想要实现的是一个Java批注,该批注将在方法执行之前设置等待游标,并在执行后将其设置回正常状态。所以前面的例子看起来像这样 我怎样才能做到这一点?也欢迎提出有关解决此问题的其他方法的建议。谢谢! PS-我们在项目中使用Google Guice,但我不知道如何使用它来解决问题。如果有人为我提供类

  • 我有一个活动,在应用程序第一次运行时弹出指令(在对话框片段中)。 我想在用户不关闭对话框的情况下停止代码的执行。 有可能做到吗??? 编辑:我尝试使用CountDownLatch,但它冻结了我的UI,并且没有显示对话框。 活动: } 对话框(我只列出了所需的方法): 公共类教程对话框扩展了DialogFragment{private final String TAG=getClass().getS

  • 语法和语义分析的结果是抽象语法树AST,再往后编译原理还有代码生成及优化的很大一部分,但如果只是做一个执行器,到AST为止就可以解释执行了,当然就算不生成AST,解析执行也可以,只是基于之前说过的原因,极少采用解析执行的方式 目前的大多数解释执行的语言,都是在虚拟机解释字节码执行,这个后面再说,它只是把AST的解释串行化了而已,事实上ruby在1.9版本之前是解释AST执行的,到1.9整合了YAR