1

我不认为我会很难找到这方面的信息,但是......

过程是什么?我所学到的与我所发现的相矛盾。

我的想法:

HLL -> Compiler -> Assembly Language -> Assembler -> Machine Code

它似乎是什么:

HLL -> Compiler -> Machine Code
  1. 它仅取决于高级语言吗?
  2. 如果后者是真的,怎么办?(如果答案很大,请不要担心。)
4

3 回答 3

2

实际上汇编语言和机器代码是一回事,即汇编语言中的每个命令在机器代码中只有一个翻译,反之亦然(检查 PS)

唯一真正的区别是“人类可读性”

所以你的两条路径都是正确的,并且都具有相同的含义

PS。当然,如果你从机器代码翻译成汇编代码,所有变量名称和其他一些元数据都会丢失,因为这个元数据不是实际代码,但你仍然可以将这个“新代码”转换成机器一 - 它会提供初始二进制可执行文件

于 2013-10-21T23:00:49.447 回答
1

两者都是“编译器”所做的相对准确/适用的定义。严格来说,当然,编译器通常只会吐出传递给汇编程序的机器代码,但与此同时,如果 gcc 默认吐出汇编代码而不是通过汇编程序传递该汇编代码,大多数人会感到惊讶。生成二进制文件。

这主要只是一个带有定义的语义问题——是否存在您关心的实际概念,或者您只是想知道公认的术语?

于 2013-10-21T22:51:51.717 回答
1

这个过程不仅在高级语言上变化很大,而且在编译器上也变化很大。如果您仔细观察,可能比您想象的要多得多。

一些编译器确实在机器代码之前使用汇编语言,但老实说 - 它们几乎是同义词!只是表达同一件事的两种方式 - 翻译真的很容易。"movl eax, ebx" 总是成为同一台机器的同一串二进制文件。

如今,编译器实际上倾向于将事物编译成一种中间语言——尤其是像llvm. LLVM 会将任意数量的高级语言翻译成相同的中间语言,然后运行一系列优化通道(最终以基本相同的中间语言结束),最后通过几次通道将其移动到特定于机器的代码。(这个还是简化了,有很多pass和几种中间语言)。

于 2013-10-21T22:52:57.503 回答