从 Java 代码到 JVM 字节代码的转换会考虑编译还是转译?



编译是一个从一个抽象级别到较低级别的转换过程。同时,转译是一个从一个抽象级别转换到同一级别的另一个抽象级别的过程,就像将java代码转换为Kotlin/python一样。这是我对这两个过程的理解。有人可以用java代码和jvm字节代码来解释一下。我的推论正确吗?

从人类语言到机器语言的更高/更低级别的抽象

编译器从高级语言转换为较低级别的语言。我们所说的更高/更低是指如何从机器语言中抽象出来。因此,这将包括Java语言到字节码。字节码更接近机器语言,也离人类语言更远。

转译器在具有相当抽象级别的语言之间进行转换。从 EcmaScript 6 转换为 EcmaScript 5 以兼容旧版 Web 浏览器就是一个例子。从 Java 语言转换为 Kotlin 将是另一回事,或者从 Swift 转换为 Kotlin。

参见维基百科:https://en.wikipedia.org/wiki/Source-to-source_compiler

中间表示

特别是,从Java语言编译的字节码和通过LLVM(来自Swift,Rust等(编译的位码被称为中间表示(IR(。IR 旨在进一步处理、优化和翻译,以使其成为机器语言。

从java代码到jvm字节代码的转换会考虑编译还是转译?

它正在根据您在问题中给出的定义进行编译。 字节码指令集的抽象级别低于 Java 源代码。


话虽如此,编译和转译之间的这种区别有点模糊,因为没有明确的"抽象级别"定义。

例如,有人可能会争辩说,由于C有时被称为"高级汇编语言",C++比C处于更高的抽象级别。 那么这是否使C++ -> C转换编译? 还是它们处于相同的抽象级别,这使得C++ -> C 转换转译? 这并不完全是学术性的,因为C++语言的第一个实现确实C++翻译为 C 源代码......IIRC.

它的工作原理如下所述:

首先,java源代码由名为"编译器"的翻译器转换为字节码文件。字节码文件获取扩展名.class javac(java编译器(是编译.java文件的工具。

然后

java是用于调用Java解释器"JVM"的工具。现在,JVM的工作开始了。当 JVM 调用时,

JVM中一个名为类加载器(或
  1. 系统类加载器(的子程序启动并将字节码加载到操作系统内存(或RAM(中。

  2. 另一个子程序字节码验证器验证并确保代码不违反安全规则。这就是为什么Java程序非常安全且无病毒的原因。

  3. 然后最后一个子程序执行引擎最终将字节码转换为机器码。目前使用的引擎的名称是JIT Just In Compiler。

你可以在这里阅读相同的内容:https://www.quora.com/How-does-the-Java-interpreter-JVM-convert-bytecode-into-machine-code

最新更新