我不认为我会很难找到这方面的信息,但是......
过程是什么?我所学到的与我所发现的相矛盾。
我的想法:
HLL -> Compiler -> Assembly Language -> Assembler -> Machine Code
它似乎是什么:
HLL -> Compiler -> Machine Code
- 它仅取决于高级语言吗?
- 如果后者是真的,怎么办?(如果答案很大,请不要担心。)
我不认为我会很难找到这方面的信息,但是......
过程是什么?我所学到的与我所发现的相矛盾。
我的想法:
HLL -> Compiler -> Assembly Language -> Assembler -> Machine Code
它似乎是什么:
HLL -> Compiler -> Machine Code
实际上汇编语言和机器代码是一回事,即汇编语言中的每个命令在机器代码中只有一个翻译,反之亦然(检查 PS)
唯一真正的区别是“人类可读性”
所以你的两条路径都是正确的,并且都具有相同的含义
PS。当然,如果你从机器代码翻译成汇编代码,所有变量名称和其他一些元数据都会丢失,因为这个元数据不是实际代码,但你仍然可以将这个“新代码”转换成机器一 - 它会提供初始二进制可执行文件
两者都是“编译器”所做的相对准确/适用的定义。严格来说,当然,编译器通常只会吐出传递给汇编程序的机器代码,但与此同时,如果 gcc 默认吐出汇编代码而不是通过汇编程序传递该汇编代码,大多数人会感到惊讶。生成二进制文件。
这主要只是一个带有定义的语义问题——是否存在您关心的实际概念,或者您只是想知道公认的术语?
这个过程不仅在高级语言上变化很大,而且在编译器上也变化很大。如果您仔细观察,可能比您想象的要多得多。
一些编译器确实在机器代码之前使用汇编语言,但老实说 - 它们几乎是同义词!只是表达同一件事的两种方式 - 翻译真的很容易。"movl eax, ebx" 总是成为同一台机器的同一串二进制文件。
如今,编译器实际上倾向于将事物编译成一种中间语言——尤其是像llvm
. LLVM 会将任意数量的高级语言翻译成相同的中间语言,然后运行一系列优化通道(最终以基本相同的中间语言结束),最后通过几次通道将其移动到特定于机器的代码。(这个还是简化了,有很多pass和几种中间语言)。