8

我的理解是这样的,定义:

翻译- 以某种语言编写代码,以某种其他语言生成代码。

Compilaton - 翻译成机器码。

机器代码- CPU 的直接指令。

现在,来自docs.oracle.com

javac - Java 编程语言编译器

编译器...?我认为它是 Java翻译器,因为它正在生成代码,而不是机器代码。字节码需要解释器(JVM)才能运行,所以它绝对不是机器码。

来自维基百科

Java 应用程序通常被编译为字节码

相似地。根据定义,我会说 Java 被翻译成字节码。Internet上有更多示例,我认为对此感到困惑,或者我只是遗漏了一些东西。

你能澄清一下吗? 翻译和编译有什么区别?

4

4 回答 4

8

这完全是定义问题,对于“编译”的含义,没有一个公认的定义。在你看来,编译就是将某种语言的源代码转换为原生代码;因此不生成机器代码的转换过程不应称为“编译”。在我看来(显然,在javac文档作者的眼中也是如此),它应该。

实际上有很多不同的术语:翻译、编译、反编译、汇编、反汇编等等。

就个人而言,我认为将所有这些术语归为“编译”是有意义的,因为所有这些过程都有很多共同点:

  • 他们将一种形式语言的代码转换为另一种形式语言的代码。
  • 他们试图尽可能地保留输入代码的语义。
  • 它们都具有彼此非常相似的设计,前端、后端和中间可能的优化器(在此处了解有关编译器结构的更多信息)。我已经看到了javac本地编译器和本地编译器的内部结构,它们相对相似。

此外,您对“生成本机代码”的定义是有问题的:

  • 那些可以生成汇编但不费心将其转换为机器代码而将其留给外部程序(通常称为“汇编器”)的编译器呢?你会因为最后一个比较微不足道的步骤而否认他们对“编译器”的定义吗?
  • 您甚至如何对“机器代码”进行分类?如果明天创建一个可以本地运行 Java 字节码的处理器怎么办?

但这些只是我的意见。我认为,最被接受的定义是:

  • 编译是将高级语言中的代码转换为低级语言。示例:Java 到 Java 字节码,或 C 到 x86 机器代码。
  • 反编译是将低级语言的代码转换为高级语言 - 实际上与编译相反。示例:Java 字节码到 Java。
  • 翻译源到源编译是将某种语言的代码转换为具有可比“级别”的另一种语言。示例:ARM 到 x86,或 C 到 Java。当两种语言实际上是同一语言的不同版本时(例如 Javascript 6 到 Javascript 5),也使用术语转译器。
  • 汇编正在将某种汇编语言中的代码转换为机器代码。
  • 反汇编要么是反编译的同义词,要么是汇编的反义词,具体取决于上下文。

在这些定义下,javac绝对可以将其视为编译器。但同样,这一切都在定义中:从技术角度来看,许多这些行动有很多共同点。

于 2013-05-18T12:31:03.520 回答
5

javac 的结果是机器码。机器是虚拟的而不是物理的这一事实是不相关的(否则,如果您是 Mac 用户,您可能会争辩说在 x86 中编译代码是翻译,因为 x86 代码不是 Mac 机器代码)。

于 2013-05-18T09:36:42.027 回答
1

“编译器是一种计算机程序(或程序集),它将以编程语言(源语言)编写的源代码转换为另一种计算机语言(目标语言,通常具有称为目标代码的二进制形式)。”

http://en.wikipedia.org/wiki/Compiler

所以没有编译并不意味着输出是机器代码。例如,早期的 C++ 编译会生成一个 C 程序,然后需要再次编译成机器代码。当然,任何好的编译器都会对用户隐藏这些单独的步骤,但它们仍然存在。

现在,我至少知道执行相同过程的 NesC 编译器。

可以构建运行 JVM 字节码的机器,实际上,来自 A. Tanenbaum 的结构化计算机组织的一些章节描述了如何做到这一点。

http://www.amazon.com/Structured-Computer-Organization-5th-Edition/dp/0131485210

于 2013-05-18T11:22:49.263 回答
1

编译器...?我认为它是 Java 翻译器,因为它正在生成代码,而不是机器代码。字节码需要解释器(JVM)才能运行,所以它绝对不是机器码。

JVM就是Java Virtual Machine,它是一台机器,它的机器码称为Java字节码。(字节码中的每个“字节”都是一条 JVM 机器指令。)

您可以通过阅读 JVM 规范了解更多信息。从这里开始:https ://docs.oracle.com/javase/specs/

此外,JVM 不是解释器;它是机器的定义。JVM 的一些实现包括即时 (JIT) 编译器、提前 (AOT) 编译器、自适应编译器(例如 Hotspot),是的,甚至是解释器(尽管我个人在20 年了)。

大多数从编译器开始的人不明白的是,不再有编译器可以生成“机器代码”。它们都生成一些中间形式(例如,由特定操作系统定义),然后由操作系统加载和修改。

在今天的大多数情况下,如果没有一个庞大的、臃肿的操作系统来处理、分割并将其粘合成操作系统拥有和管理的片段,任何编译程序都无法执行。

如今,甚至 C 也无法将代码编译成实际的机器可执行文件,而无需在行外着色。(从头开始编写一个实际的、有效的引导加载程序,然后回复我。)

于 2018-04-14T03:10:54.190 回答