【问题标题】:Code generation代码生成
【发布时间】:2012-10-10 20:32:49
【问题描述】:

编译器如何将二进制代码生成到单独的文件中? 参考 GCC 的源代码中的哪些文件处理这将有很大帮助。 我想知道的是编译器(尤其是 gcc)究竟是如何从 ASM 生成机器码的?

【问题讨论】:

  • 你能说得更具体点吗?请提供一个例子来激发思考。 :)
  • 我想知道的是编译器(尤其是 gcc)究竟是如何从 ASM 生成字节码(?)
  • 我已将您的陈述作为编辑添加到问题本身。有人可能会觉得它很有用。 :)
  • 这太宽泛了,IMO。您是在问编译器后端是如何工作的?
  • @EtiennedeMartel:大概他的意思是“机器代码”

标签: compiler-construction code-generation


【解决方案1】:

要回答这个问题,需要书籍,而不仅仅是几行字。

非常简短的版本是:

编译器分为两部分:

  1. 将特定语言(如 C)翻译成语法树(表示程序的通用方式)的前端

  2. 以及将语法树转换为机器特定(X86、ARM、...)代码的后端。

涉及几个步骤:

  1. 词法分析(将“switch”等关键字转换为代码)
  2. 语法分析(从上一步转换为语法树)
  3. 代码优化(修改语法树以提高性能)
  4. 代码生成(从语法树生成机器代码)
  5. 链接(将更多执行单元组合到一个二进制文件中)

谷歌搜索可以为您提供更详细的信息。

【讨论】:

  • 这些确实是编译器将一种语言 (C++) 翻译成另一种语言(特定机器的汇编代码)所执行步骤的概述。如果你想了解更多,我建议你阅读The Dragon Book - 一本非常有名的关于编译器设计的书
  • 如果我读过一个非常好的概述。它可以使用第 3 部分:利润。
【解决方案2】:

汇编器是一个单独的实用程序。你可以在这里找到更多信息:http://en.wikipedia.org/wiki/GNU_Assembler

源代码是 binutils 包的一部分。你可以在这里找到它:ftp://ftp.gnu.org/gnu/binutils/

【讨论】:

  • 我找不到它的源代码(它不是开源的吗?)。如果可能,请发布它的链接
猜你喜欢
  • 2017-12-03
  • 2018-09-26
  • 2018-06-15
  • 2010-10-31
  • 2016-06-04
  • 2015-05-07
  • 2016-12-11
  • 2010-12-14
  • 1970-01-01
相关资源
最近更新 更多