将高级语言翻译成机器语言的过程是什么?

时间:2013-10-21 22:45:20

标签: programming-languages

我认为我不会在此找到相关信息,但是......

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

我的想法:

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

它似乎是:

HLL -> Compiler -> Machine Code
  1. 它只是依赖于高级语言吗?
  2. 如果后者是真的,怎么样? (如果答案很重要,请不要担心。)

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

这个过程不仅在高级语言上有很大差异,在编译器上也有很大差异。如果仔细观察,可能会有比你想象的更多的步骤。

有些编译器确实在机器代码之前使用汇编语言,但说实话 - 它们几乎是同义词!只有两种表达同一事物的方式 - 翻译非常简单。 “movl eax,ebx”对于同一台机器来说总是变成同一堆二进制文件。

编译器实际上倾向于将事物编译成中间语言 - 尤其是像llvm这样的语言。 LLVM将任意数量的高级语言翻译成相同的中间语言,然后运行一系列优化传递(最终基本上使用相同的中间语言),然后最后几次将其移动到机器特定代码。 (这仍然是简化的,有很多通行证和几种中间语言)。