编译器也有汇编程序吗?

Sam*_*Sam 5 compiler-construction assembly

我的理解是编译器将高级语言转换为机器代码.我有一个问题,编译器(比如VC++)是否也使用汇编程序?我记得看到汇编代码,只要发生崩溃或类似的事情.

Adr*_*scu 5

这取决于编译器; 许多编译器可以编译成汇编.例如,如果您将'-S'标志传递给gcc,例如:

gcc -S -o test.S test.c
Run Code Online (Sandbox Code Playgroud)

这会将test.c文件的程序集输出到文件test.S中,您可以查看它.(如果您要尝试阅读程序集,我建议使用-O0,因为那里的编译器优化可能会让您感到困惑).

由于您在问题中提到了Visual C++,Paul Dixon在下面指出Visual C++使用/ FA标志来完成同样的事情.


Pet*_*ott 5

一般来说,编译器将一种语言翻译成另一种语言。大多数编译器以机器代码为目标;以下是执行此操作的最常见方法,按从最低级别到最高级别的顺序排列:

  1. 通过包含每个指令集的后端来直接生成机器代码。
  2. 生成汇编语言,并将其传递给外部汇编器。这就是 gcc 所做的。毕竟,为什么不使用现有的汇编器呢?直接生成操作码很痛苦。
  3. 生成代码的低级中间形式,例如LLVM 字节码,它会转换为机器代码。LLVM 是编译器编写者的天赐之物,因为它可以处理大量优化并支持大量后端,同时让您可以在比汇编更高的级别进行编写。
  4. 将代码转换为 C 语言等语言,然后将其传递给另一个编译器。Facebook 对 PHP 执行此操作:将其编译为 C++,然后使用 gcc 将其编译为程序集,然后由 GNU as 汇编为本机代码。

如果您想尝试编写编译器,我建议您从 C 之类的东西开始作为后端。如果您想稍后更详细地了解,请尝试 LLVM。如果您尝试直接生成汇编语言或机器代码,它的效率可能会低于 C 编译器或 LLVM 生成的效率。我是根据令人尴尬的个人经历来谈这件事的。