0

我对编译很感兴趣,我有一个关于 gcc 的问题。

我知道从要编译的代码生成一棵树,然后生成 ASM 代码,我需要对这一点进行一些解释。

将 ASM 代码添加到文件中并稍后执行,还是使用asm函数将 ASM 代码直接加载到内存中?我正在开发一个小型编译器,但我不知道如何执行生成的树,也没有找到任何相关文档。

4

3 回答 3

2

GCC 的前端解析不同语言(C、C++、Fortran、ObjectiveC、Java 等)的源文件。然后代码(AST)被翻译成内部表示,RTL(寄存器传输语言)。这是一个接近组装的表示。

然后将此 RTL 代码转换为目标机器的程序集并写入 .o(对象)文件。

然后,链接器将生成的 .o 文件组合到可执行文件中。

C/C++ 中的 GCC 也支持“内联”程序集片段。

工作流程是

Source file -> 
 AST  ->
  RTL representation  ->
   machine codes (with _optional_ text output of the ASM code) ->
    Executable (produced by linker)

对于解释器,您可以直接解释 AST 或为虚拟机生成您自己的操作码,因为这样的解释器(虚拟机)会比 AST 解释器更简单。

如果您想了解所有详细信息,您应该查看LCC(以及 Chris Fraser 和 David Hanson 的一本书)。随附的书中提供了真实架构代码生成的所有细节。

要了解生成的代码可以做什么,您应该阅读John Levine 的 Linkers and Loaders一书。

最后,为了避免询问有关脚本/解释器的一切,请参阅Alex Varanese 的 Game Scripting Mastery

于 2012-07-25T17:55:55.240 回答
2

一个相当模糊的问题,我不认为我完全理解你的确切问题是什么,但无论如何你都是一个答案:程序集没有放在可执行文件中。汇编被写入中间汇编文件,汇编器从中生成真正的二进制机器代码(称为目标文件),然后链接器将它们(连同所需的库)合并到最终的可执行文件中。当应用程序运行时,可执行文件由操作系统直接加载到 RAM 中,并由处理器本地执行。

于 2012-07-25T17:13:18.923 回答
1

源代码如何转化为可执行代码?我们向编译器提供源代码,它为我们提供可执行代码。但这不是单步操作。这遵循一些预定义的步骤将源代码转换为可执行代码。

从源代码转换为可执行代码所遵循的步骤

1.预处理器 它是编译器非常有用的部分,因为它在翻译成机器代码之前做了很多工作。它是一个文本处理器,执行以下文本编辑操作

它删除了源代码中编写的源代码中的注释行,以提高可读性/易于理解。它将头文件的内容添加到源代码中。头文件总是包含函数原型和声明。(头文件从不包含任何可执行代码)预处理器的一个非常重要的属性是条件编译。可扩展设计非常需要它。此属性还消除了编译器的不必要负担。宏被此预处理器替换。

此阶段的最终输出称为纯 C 代码。

2.Translator 这部分编译器负责将纯C代码转换为汇编语言代码。C 语言代码到汇编语言代码的逐步映射在这里完成。这部分使用函数和声明的原型来翻译 C 代码。这个阶段的输出称为汇编代码。

3.Assembler 它从汇编语言代码生成目标代码。它将汇编语言代码转换为机器语言代码(即0和1格式)。它不是直接运行的,因为我们借助操作系统在处理器中执行我们的代码。这个阶段的输出称为目标代码。

4.Linker 它给出了将在我们的机器上运行的最终可执行代码。此阶段的输出称为可执行代码。这是目标代码和支持文件的组合。支持文件可以是用户定义的函数定义、预定义的库函数定义...等。

于 2012-07-26T19:33:21.573 回答