📜  C语言中的编译过程

📅  最后修改于: 2020-10-21 06:16:15             🧑  作者: Mango

C语言的编译过程

什么是汇编?

编译是将源代码转换为目标代码的过程。这是在编译器的帮助下完成的。编译器检查源代码中的语法或结构错误,如果源代码无错误,则生成目标代码。

c编译过程将作为输入的源代码转换为目标代码或机器代码。编译过程可以分为四个步骤,即预处理,编译,组装和链接。

预处理器将源代码作为输入,并从源代码中删除所有注释。预处理器采用预处理器指令并对其进行解释。例如,如果,该指令在程序中可用,然后预处理器解释该指令并将其替换为’stdio.h’文件的内容。

以下是我们的程序在转换为可执行形式之前所经过的阶段:

  • 预处理器
  • 编译器
  • 组装工
  • 连接器

预处理器

源代码是在文本编辑器中编写的代码,并且源文件的扩展名为“ .c”。该源代码首先传递给预处理器,然后预处理器扩展该代码。扩展代码后,将扩展的代码传递给编译器。

编译器

由预处理器扩展的代码将传递给编译器。编译器将此代码转换为汇编代码。或者我们可以说C编译器将预处理的代码转换为汇编代码。

组装工

使用汇编器将汇编代码转换为目标代码。汇编程序生成的目标文件的名称与源文件的名称相同。在DOS中,目标文件的扩展名是“ .obj”,在UNIX中,目标文件的扩展名是“ o”。如果源文件的名称是“ hello.c”,那么目标文件的名称将是“ hello.obj”。

连接器

主要,所有用C编写的程序都使用库函数。这些库函数是预编译的,并且这些库文件的目标代码以’.lib'(或’.a’)扩展名存储。链接器的主要工作是将库文件的目标代码与程序的目标代码结合在一起。有时,当我们的程序引用其他文件中定义的功能时,就会出现这种情况;那么链接器在其中起着非常重要的作用。它将这些文件的目标代码链接到我们的程序。因此,我们得出结论,链接器的工作是将程序的目标代码与库文件和其他文件的目标代码链接起来。链接器的输出是可执行文件。可执行文件的名称与源文件的名称相同,只是扩展名不同。在DOS中,可执行文件的扩展名为“ .exe”,而在UNIX中,可执行文件的命名为“ a.out”。例如,如果我们在程序中使用printf()函数,则链接器会将其关联的代码添加到输出文件中。

让我们通过一个例子来理解。

你好ç

#include 
int main()
{
    printf("Hello javaTpoint");
    return 0;
}

现在,我们将创建上述程序的流程图:

在上面的流程图中,执行以下步骤来执行程序:

  • 首先,将输入文件hello.c传递给预处理器,然后预处理器将源代码转换为扩展的源代码。扩展源代码的扩展名为hello.i。
  • 扩展的源代码将传递给编译器,然后编译器将此扩展的源代码转换为汇编代码。汇编代码的扩展名是hello.s。
  • 然后将此汇编代码发送到汇编器,由汇编器将汇编代码转换为目标代码。
  • 创建目标代码后,链接器将创建可执行文件。然后,加载程序将加载可执行文件以供执行。