C 程序是如何编译的(c 程序是如何编译的呢)
C语言的编译过程是将C语言源代码转换为机器代码的过程。由于C语言是一种中级语言,因此需要编译器将其转换为可执行代码,以便在我们的计算机上运行程序。
C程序在编译过程中经历以下阶段:
- 预处理
- 编译
- 汇编
- 链接
编译流程
01 我们如何编译和运行C程序
我们需要一个编译器和一个代码编辑器来编译和运行C程序。下面示例是 gcc 编译器编写代码流程:
Step 1: 创建C源文件
我们首先使用编辑器创建一个C程序,并将文件保存为filename.c
vi filename.c
我们可以编写一个简单的 Hello World 程序并将其保存。
#include <stdio.h>int main() { printf("Hello, World!"); return 0;}
Step 2: 使用GCC编译器进行编译
我们在终端中使用以下命令编译我们的filename.c源文件
gcc filename.c –o filename
我们可以向GCC编译器传递许多指令以执行不同的任务,例如:
- 选项-Wall启用所有编译器的警告消息。建议使用此选项以生成更好的代码。
- 选项-o用于指定输出文件名。如果我们不使用此选项,则会生成一个名为a.out的输出文件。
Step 3: 执行程序
编译后生成可执行文件,我们使用以下命令运行生成的可执行文件。
./filename
程序将被执行,并且输出将显示在终端中。
执行程序
02 编译过程内幕
C程序的编译过程包括以下四个步骤:预处理、编译、汇编和链接。
通过执行以下命令,我们获取当前目录中的所有中间文件以及可执行文件。
gcc -Wall -save-temps filename.c –o filename
让我们一一看看这些中间文件包含什么。
预处理
在此阶段,源代码由预处理器处理。预处理器是在编译器编译源代码之前处理源代码的程序。预处理的主要目的是为编译做准备。预处理阶段包括以下几个步骤:
- 删除注释
- 宏扩展
- 文件包含
- 条件编译
预处理的输出存储在 filename.i 中。
- 代码中的注释被删除
- 头文件被展开,#include <stdio.h> 被删除
编译
在此阶段,编译器将源代码转换为汇编代码。编译器检查代码的语法和语义,以识别C程序中的任何语法问题或警告。
将 filename.i 编译输出为 filename.s,编译器生成的汇编文件。
汇编
在此阶段,汇编器将汇编代码转换为机器代码,即将 filename.s 转为 filename.o,但函数调用(例如 printf())未解析。
链接
在链接阶段,链接器将可执行文件中的函数调用与库函数中的函数定义解析并链接在一起。链接器还会添加一些额外的代码,这些代码在程序启动和结束时需要,例如设置环境变量和传递命令行参数。通过使用 $size filename.o 和 $size filename 命令,我们可以轻松验证此任务。通过这些命令,我们可以了解输出文件从目标文件到可执行文件的增长情况。这是由于链接器添加到我们的程序中的额外代码所致。
如果您发现任何不正确的内容或想分享有关上述主题的更多信息,请在评论区留言。
请关注微信公众号:Database Developer