我在编辑方面非常有趣,我对gcc有疑问。
我知道从代码生成一个树来编译,然后是ASM代码 生成,我需要一些关于这一点的解释。
ASM代码添加到文件中并稍后执行,或者ASM代码是否通过 asm 函数直接加载到内存中?我正在研究一个小编译器,我不知道如何执行生成的树,我没有找到任何关于它的文档。
答案 0 :(得分:2)
一个问题相当含糊,而且我认为我并不完全明白你的确切问题是什么,但无论如何你仍然是一个答案:汇编不会放在可执行文件中。程序集被写入一个中间程序集文件,汇编程序从中生成真正的二进制机器代码(称为目标文件),然后链接器将它们(以及所需的库)合并到最终的可执行文件中。运行应用程序时,可执行文件由OS直接加载到RAM中,并由处理器本机执行。
答案 1 :(得分:2)
GCC的前端用不同语言(C,C ++,Fortran,ObjectiveC,Java等)解析源文件。然后代码(AST)被转换为内部表示RTL (register transfer language)。这是一种近乎集合的表示。
然后将此RTL代码转换为目标机器的程序集并写入.o(对象)文件。
然后,链接器将生成的.o文件组合到可执行文件中。
"内联" GCC在C / C ++中也支持汇编片段。
工作流程
Source file ->
AST ->
RTL representation ->
machine codes (with _optional_ text output of the ASM code) ->
Executable (produced by linker)
对于解释器,您可以直接解释AST或为虚拟机生成自己的操作码,因为这样的解释器(虚拟机)比AST解释器更简单。
如果您想了解所有细节,请查看LCC (with a book by Chris Fraser and David Hanson)。所有关于实际架构的代码生成细节都在随附的书中提供。
要了解生成的代码可以做些什么,您应该阅读Linkers and Loaders by John Levine本书。
最后,为避免询问有关脚本/口译员的所有内容,请参阅Game Scripting Mastery by Alex Varanese。
答案 2 :(得分:1)
源代码如何转换为可执行代码? 我们向编译器提供源代码,它给我们提供了可执行代码。但这不是一步操作。这遵循一些预定义的步骤将源代码转换为可执行代码。
从源代码转换为可执行代码的步骤
<强> 1.Preprocessor 强> 它是编译器非常有用的部分,因为它在转换为机器代码之前完成了大量工作。它是一个文本处理器,它处理下面的文本编辑操作
它删除源代码中的注释行,这些注释行是在源代码中编写的,以便更易于理解/易于理解。 它将头文件的内容添加到源代码中。头文件总是包含函数原型和声明。(头文件永远不包含任何可执行代码) 预处理器的一个非常重要的属性是条件编译。它是可扩展设计的必要条件。此属性还消除了编译器的不必要负担。 宏被这个预处理器取代。
此阶段的最终输出称为纯C代码。
<强> 2.Translator 强> 编译器的这一部分负责将纯C代码转换为汇编语言代码。 将C语言代码逐步映射到此处完成的汇编语言代码。 此部分使用函数和声明的原型来转换C代码。 这个阶段的输出被称为汇编代码。
<强> 3.Assembler 强> 它从汇编语言代码生成Object代码。它将汇编语言代码转换为机器语言代码(即0和1的格式)。它不是直接运行的,因为我们借助OS在处理器中执行我们的代码。 这个阶段的输出被称为目标代码。
<强> 4.Linker 强> 它给出了最终的可执行代码,它将在我们的机器上运行。此阶段的输出称为可执行代码。这是目标代码和支持文件的组合。 支持文件可以是用户定义的函数定义,预定义的库函数定义等。