Java解释器或任何解释器究竟是如何工作的?

Java解释器或任何解释器究竟是如何工作的?,java,jvm,interpreter,Java,Jvm,Interpreter,我一直在弄清楚口译员的确切工作方式,在谷歌上搜索了一下,得出了一些结论,只是希望有人能纠正一下,让我更好地了解口译员的工作 所以我的理解是: 解释器是一种软件程序,用于从高级语言转换代码 语言到机器的格式 具体地说,java解释器以二进制格式获取代码 (之前由java编译器将其从源代码翻译为字节码) 现在java解释器的平台是JVM,它在JVM中运行,所以 基本上,它将生成可由JVM运行的代码 所以它需要字节码产生中间代码和目标机器 代码并将其提供给JVM JVM依次在JVM所在的操作系统平台上

我一直在弄清楚口译员的确切工作方式,在谷歌上搜索了一下,得出了一些结论,只是希望有人能纠正一下,让我更好地了解口译员的工作

所以我的理解是:

  • 解释器是一种软件程序,用于从高级语言转换代码 语言到机器的格式
  • 具体地说,java解释器以二进制格式获取代码 (之前由java编译器将其从源代码翻译为字节码)
  • 现在java解释器的平台是JVM,它在JVM中运行,所以 基本上,它将生成可由JVM运行的代码
  • 所以它需要字节码产生中间代码和目标机器 代码并将其提供给JVM
  • JVM依次在JVM所在的操作系统平台上执行该代码 实施或正在运行
  • 现在我仍然不清楚中间发生的子过程,即

  • 解释器产生中间代码
  • 然后对解释代码进行优化
  • 然后生成目标代码
  • 最后执行
  • 还有一些问题:

    • 那么,只有解释器负责生成目标代码吗?及 执行它
    • 执行意味着它是在JVM中执行还是在底层操作系统中执行
    1) 解释器是将代码从高级语言转换为机器格式的软件程序

    不对。解释器是一个程序,它运行一个用非计算机本机代码的某种语言表示的程序

    在这个过程中可能会有一个步骤,将源语言解析并翻译成中间语言,但这不是解释器的基本要求。在Java的例子中,字节码语言的设计不需要解析或不同的中间语言

    2) 具体地说,java解释器以二进制格式获取代码(java编译器先前将其从源代码翻译为字节码)

    对。“二进制格式”是Java字节码

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

    不对。字节码解释器是JVM的一部分。解释器不在JVM上运行。字节码解释器不会产生任何结果。它只是运行字节码

    4) 因此,它将字节码生成中间代码和目标机器代码,并将其提供给JVM

    不对

    5) JVM依次在实现或运行JVM的操作系统平台上执行该代码

    不对

    真正的故事是这样的:

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

    1-典型的字节码解释器会将抽象堆栈帧和对象布局映射到具体的堆栈帧和对象布局,包括特定于目标的大小和偏移量。但将其称为“中间代码”是一种延伸。解释器实际上只是在增强字节码

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

    不,那是个编译器。是一种计算机程序,它直接执行用某种语言编写的指令。这与将高级语言转换为低级语言的编译器不同。C编译器从C到汇编代码,汇编程序(另一种类型的编译器)将汇编代码转换为机器代码——现代C编译器完成从C到机器代码的两个步骤

    在Java中,Java编译器进行代码验证,并将Java源代码转换为字节码类文件。它还执行一些小的处理任务,如常量的预计算(如果可能)、字符串的缓存等

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

    JVM直接对字节码进行操作。java解释器与JVM的集成非常紧密,因此不应将它们视为单独的实体。目前正在进行的是大量的优化,字节码基本上是动态优化的。这使得仅仅称之为翻译是不够的。见下文

    因此,它将字节码生成中间代码和目标机器代码,并将其提供给JVM

    JVM正在进行这些翻译

    JVM依次在实现或运行JVM的操作系统平台上执行该代码

    我更愿意说JVM使用字节码、优化用户代码、java库(包括java和本机代码)以及操作系统调用来执行java应用程序

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

    Java编译器生成字节码。当JVM执行代码时,步骤2-4发生在JVM内部的运行时。它与C(例如)非常不同,C由不同的实用程序运行这些单独的步骤。不要将其视为“子流程”,而是将其视为JVM内部的模块

    那么,只有解释器负责生成目标代码吗?执行它呢

    有点。JVM的解释器根据定义读取字节码并执行i