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