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

Java译员或任何译员究竟是如何工作的?

魏书
2023-03-14

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

所以我的理解是:

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

现在我仍然不清楚中间发生的子过程,即。

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

还有一些问题:

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

共有3个答案

张智
2023-03-14

java应用程序有两个主要步骤:编译和运行时。每个过程都有非常不同的功能和目的。这两种方法的主要流程概述如下:

  • 这(通常)由工具中常见的[com.sun.tools.javac][1]执行。jar文件,通常位于您的$JAVA\u主页中,与JAVA位于同一位置。罐子等

编译步骤:

  1. 解析:读取文件并去掉它们的“边界”语法字符,例如花括号、分号和括号。这些存在是为了告诉解析器要将每个源组件翻译成哪个java对象(在下一点中详细介绍)。
  2. AST创建:抽象语法树是源文件的表示方式。这是一个字面“树”数据结构,其根类是[com.sun.tools.JCTree][3]。总体思路是每个表达式和每个语句都有一个java对象。目前对每个表示的实际“类型”知之甚少。在创建AST时检查的唯一内容是字面语法
  3. Desugar:这是for循环和其他语法糖被翻译成更简单形式的地方。该语言仍然是“树”形式,而不是字节码,因此这很容易发生
  4. 类型检查/推理:编译器变得复杂的地方。Java是一种静态语言,所以编译器必须使用访问者模式检查AST,并在Tim之前找出所有类型,并确保在运行时所有(嗯,几乎)都合法,就类型、方法签名等而言。如果某些东西太模糊或无效,编译就会失败。
  5. 字节码:检查控制流以确保程序执行逻辑有效(没有无法访问的语句等)如果一切都通过检查而没有错误,则AST被转换为程序表示的字节码。
  6. . class文件写入:此时,类文件被写入。本质上,字节码是专门机器代码之上的一小层抽象。这使得移植到其他机器/CPU结构/平台成为可能,而不必担心它们之间相对较小的差异。
  • 每个计算机平台都有不同的运行时环境/虚拟机实现。JavaAPI是通用的,但运行时环境是一个完全独立的软件。
  • JRE只知道如何将类文件中的字节码转换为与目标平台兼容的机器代码,并且这也针对相应平台进行了高度优化。
  • 有许多不同的运行时/vm实现,但最流行的是Hotspot VM。
  • VM非常复杂,并在运行时优化您的代码。启动时间很慢,但它基本上是边走边“学习”。
  • 这是“JIT”(即时)概念的实际应用——编译器通过检查正确的类型和语法完成了所有繁重的工作,而VM只需将字节码翻译和优化为机器代码。
  • Java编译器API是在JSR 199下标准化的。虽然不完全属于同一种类型(找不到确切的JLS),但许多其他语言和工具利用标准化的编译过程/API来使用Oracle提供的高级JVM(运行时)技术,同时允许使用不同的语法。
拓拔欣嘉
2023-03-14

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

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

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

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

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

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

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

4)所以它取字节码产生中间代码和目标机器代码并将其交给JVM。

不准确的

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

不准确的

真正的故事是这样的:

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

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

潘琪
2023-03-14

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

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

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

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

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

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

JVM正在进行这些翻译。

JVM依次在实现或运行JVM的OS平台上执行该代码。

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

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

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

那么解释器是否单独负责生成目标代码?并执行它?

算是吧。根据定义,JVM的解释器读取字节码并直接执行它。但是,在现代JVM中,解释器与即时编译器(JIT)协同工作以动态生成本机代码,以便JVM可以更有效地执行您的代码。

此外,还有后处理“编译”阶段,它在运行时分析生成的代码,以便可以通过内联常用的代码块和其他机制优化本机代码。这就是JVM在启动时负载峰值如此之高的原因。它不仅加载在jar和类文件中,而且实际上正在动态执行cc-O3

执行意味着它在JVM或底层操作系统中执行吗?

虽然我们讨论的是执行代码的JVM,但这在技术上是不正确的。一旦字节码被转换为本机代码,JVM和java应用程序的执行就由CPU和其他硬件架构完成。

操作系统是执行所有流程和资源管理的基板,因此程序可以有效地共享硬件并有效地执行。操作系统还为应用程序提供API,以轻松访问磁盘、网络、内存和其他硬件和资源。

 类似资料:
  • 我写了下面的测试代码在Java使用ReentantReadWriteLock来了解公平和不公平模式之间的区别。然而,我看到在两种模式下,结果和输出总是相同的。它似乎总是在公平模式下工作。谁能解释一下,在何种情况下,公平和不公平模式会导致不同的行为? 输出总是: 当我将锁创建更改为公平模式时,上面的输出是我期望看到的: 对于非公平模式,我希望看到以下输出:

  • PyCharm包含解释器,可以根据需要创建具有新功能的新项目。 您可以根据需要在系统中创建虚拟环境。 您还可以在对话框中继承全局站点包。 Python包索引(PyPI)上提供了解释器,可以使用pip install.轻松安装和访问pip install. 创建口译员 对于创建解释器,始终建议创建一个管理所需配置的新项目。 请查看以下屏幕截图以获得更好的理解 - 这些参数包括 - 位置 - 这描述了

  • 下述人员帮助我们编写了MySQL文档,并翻译了文档以及MySQL中的错误信息。 ·Paul DuBois 正在为本手册的正确性和可理解性提供帮助。包括改写了Monty和David的英文尝试,使其成为其他人理解的英语。 ·Kim Aldale 帮助改写了Monty和David的英文早期尝试,将其改写为英语。 ·Michael J. Miller Jr.<mke@terrapin.turbolift.

  • 我在网上的某个地方发现这样一句话:“解释器是一个程序,它使用编程语言的基本指令集作为其机器语言来实现或模拟虚拟机。”在上述引用的上下文中,有人能解释一下解释器是如何实际完成高级指令的执行的吗?网上的教程只涉及抽象的方式,即一次只需要一行代码就可以执行。它是使用机器指令库还是如何使用?我很想知道这件事。

  • 问题内容: 我无法确切地理解反射模式如何处理我的数组。我 有一个非常简单的数组: [[ 1. 1. 1. 1. 1.] [ 2. 2. 2. 2. 2.] [ 4. 4. 4. 4. 4.] [ 5. 5. 5. 5. 5.]] Applying a uniform (mean) filter with a window size of 3 I get the following: [[ 1.33

  • 现在,随着杰克的宣布,谷歌澄清了Java与Android之间可预见的未来。但是这对Scala和其他基于JVM的语言开发人员有什么影响。特别是: Scala之所以如此神奇,是因为它有自己的编译器来生成Java字节码。但是Jack toolchain不处理字节码。生成的字节码会获得Jack处理的任何优化好处吗? 从Scala12开始,只支持Java8+。也就是说,生成的字节码也是Java8+。Jack