Java解释器或任何解释器的工作原理是什么?

Raj*_*han 7 java interpreter jvm

我一直在弄清楚翻译的确切工作,搜索过并得出一些结论,只是希望能够让我更好地理解翻译工作的人来纠正它.

所以我所理解的是:

  1. 解释器是一种将代码从高级语言转换为机器格式的软件程序.
  2. 特别讲述java解释器,它以二进制格式获取代码(之前由java编译器从源代码翻译成字节码).
  3. 现在,java解释器的平台是运行它的JVM,所以基本上它将生成可以由JVM运行的代码.
  4. 所以它需要字节码产生中间代码和目标机器代码并将其提供给JVM.
  5. JVM轮流在实现或运行JVM的OS平台上执行该代码.

现在我仍然不清楚在...之间发生的子过程

  1. 解释器生成中间代码.
  2. 然后优化解释的代码.
  3. 然后生成目标代码
  4. 并最终执行.

还有一些问题:

  • 单独的解释器负责生成目标代码吗?并执行它?
  • 并且执行是否意味着它在JVM或底层操作系统中执行?

Gra*_*ray 10

解释器是一种将代码从高级语言转换为机器格式的软件程序.

不,那是编译器.解释器是执行用语言编写的指令的计算机程序.见维基百科.这与将较高级语言转换为较低语言的编译器不同.C编译器从C转换为汇编代码,汇编程序(另一种编译器)从汇编代码转换为机器代码 - 现代C编译器执行从C到机器代码的两个步骤.

在Java中,java编译器执行代码验证并从源代码转换为字节码.它还执行许多小的处理任务,例如常量的预计算(如果可能),字符串的缓存等.

现在,java解释器的平台是运行它的JVM,所以基本上它将生成可以由JVM运行的代码.

JVM直接对字节码进行操作.Java解释器与JVM紧密集成,它们不应该被视为单独的实体.还发生了一些优化,其中字节码基本上是优化的(思考cc -O3)并且在运行中内联.这使得称它只是一个翻译不足.

所以它需要字节码产生中间代码和目标机器代码并将其提供给JVM.

JVM正在进行这些翻译.

JVM轮流在实现或运行JVM的OS平台上执行该代码.

我宁愿说JVM使用字节码,优化的用户代码,包含java和本机代码的java库,以及OS调用来执行java应用程序.

现在我仍然不清楚发生在两者之间的子过程,即1.解释器产生中间代码.2.然后优化解释的代码.3.然后生成目标代码4.最后执行.

不.Java编译器生成字节码.当JVM执行代码时,步骤2-4在JVM内部的运行时发生.它与C(例如)非常不同,后者由不同的实用程序运行这些单独的步骤.不要将此视为"子过程".

单独的解释器负责生成目标代码吗?并执行它?

是的,虽然在某些时候操作系统和CPU生效.

并且执行是否意味着它在JVM或底层操作系统中执行?

呃,它由JVM执行,在JVM中运行,作为OS内部的进程运行,CPU和其余的硬件架构负责执行机器代码.

  • *“ ...字节码可以被当作(例如)等同于汇编代码,然后由Java解释器翻译为机器代码,然后执行。” * ...不!解释器不会将其翻译为机器代码。它由解释器直接运行/执行。(我们需要说多少遍?) (2认同)

Pre*_*rno 7

给出1000英尺的视线,希望可以将其清除:

Java应用程序有两个主要步骤:编译运行时。每个过程具有完全不同的功能和目的。两者的主要过程概述如下:

汇编

  • 这(通常)是由 [com.sun.tools.javac][1]通常在tools.jar文件中找到的文件通常在$ JAVA_HOME中-与java.jar相同的位置,等等。
  • 此处的目标是将.java源文件转换为包含Java运行时环境“配方”的.class文件。

编译步骤:

  1. 解析:读取文件,并去除其“边界”语法字符,例如花括号,分号和括号。它们的存在是为了告诉解析器哪个Java对象将每个源组件转换为对象(在下一点中对此有更多了解)。
  2. AST创建:抽象语法树是表示源文件的方式。这是一个文字“树”数据结构,其根类为[com.sun.tools.JCTree][3]。总体思路是每个表达式和每个语句都有一个Java对象。在这一点上,人们对每种代表的实际“类型”知之甚少。创建AST时唯一要检查的是文字语法
  3. Desugar:这是for循环和其他语法糖被转换为更简单形式的地方。语言仍然是“树”形式而不是字节码,因此很容易发生
  4. 类型检查/推断:编译器变得复杂的地方。Java是一种静态语言,因此编译器必须使用“访问者模式”遍历AST并找出tim之前的所有类型,并确保在运行时,所有类型(方法)几乎都是合法的,签名等。如果某些内容过于模糊或无效,则编译将失败。
  5. 字节码:检查控制流以确保程序执行逻辑有效(无不可达的语句等)。如果所有检查均通过且没有错误,则AST将转换为程序所代表的字节码。
  6. .class文件写入:此时,将写入类文件。 本质上,字节码是在专用机器代码之上的一小层抽象层。这样就可以移植到其他机器/ CPU结构/平台,而不必担心它们之间的相对较小差异。

运行

  • 每个计算机平台都有不同的运行时环境/虚拟机实现。Java API是通用的,但是运行时环境是一个完全独立的软件。
  • JRE只知道如何将类文件中的字节码转换为与目标平台兼容的机器码,并且还针对相应平台进行了高度优化。
  • 有许多不同的运行时/ vm实现,但是最受欢迎的是Hotspot VM。
  • VM非常复杂,并在运行时优化了代码。启动时间很慢,但实际上它可以“学习”。
  • 这就是实际的“ JIT ”(即时)概念-编译器通过检查正确的类型和语法来完成所有繁重的工作,并且VM随其进行简单地将字节码转换并优化为机器代码。

也...

  • Java编译器API在JSR 199下进行了标准化。虽然不是完全一样(找不到确切的JLS),但是许多其他语言和工具都利用标准化的编译过程/ API来使用Oracle提供的高级JVM(运行时)技术,同时允许使用不同的语法。
    • 请参见ScalaGroovyKotlinJythonJRuby等。所有这些都利用Java运行时环境,因为它们转换了不同的语法以与Java编译器API兼容!这非常整洁-由于两者相互分离,因此任何人都可以使用所需的语法编写高性能的语言。JVM几乎每种语言都有适应性


Ste*_*n C 6

1)解释器是一种将代码从高级语言转换为机器格式的软件程序.

不正确.解释程序是运行以某种语言表达的程序的程序,该程序不是计算机的本机机器代码.

可能在此过程中,其中源语言被分析并翻译成中间语言步骤,但是这不是一个解释器的基本要求.在Java的情况下,字节码语言的设计使得既不需要解析也不需要不同的中间语言.

2)具体讲述java解释器,它以二进制格式获取代码(之前由java编译器从源代码翻译成字节码).

正确."二进制格式"是Java字节码.

3)现在java解释器的平台是运行它的JVM,所以基本上它将生成可以由JVM运行的代码.

不正确.字节码解释器是JVM的一部分.解释器不在JVM上运行.字节码解释器不会产生任何东西.它只运行字节码.

4)所以它需要字节码产生中间代码和目标机器代码并将其提供给JVM.

不正确.

5)JVM轮流在实现或运行JVM的OS平台上执行该代码.

不正确.

真实的故事是这样的:

  • JVM有许多组件.
  • 一个组件是字节码解释器.它几乎直接执行字节码1.您可以将解释器视为指令集为字节码的抽象计算机的仿真器.
  • 第二个组件是JIT编译器.这会将字节码转换为目标机器的本机代码,以便它可以由目标硬件执行.

1 - 典型的字节码解释器可以将抽象堆栈帧和对象布局映射到涉及特定于目标的大小和偏移的具体映射.但要称之为"中间代码"是一个延伸.解释器实际上只是增强了字节码.