c入门第二篇——为什么需要编译?

上一节给师弟普及完c语言初级入门“hello c!”,师弟就回去吭哧吭哧练习起来了。刚没过多久,师弟又来问道:“师兄,为什么需要用gcc去编译hello.c生成a.out呢?直接运行hello.c不行么?”
我回答道:“打个不恰当的比方,这个好比米和酒的关系。酒精灯能够使用米来燃烧么?不行对吧。”
师弟若有所悟的样子。

可执行文件

只有经过编译之后,生成的文件才能被操作系统加载执行。后面还会展开讲述可执行文件的具体组成,这里只是作为引子提及一下。

看似一句简单的gcc hello.c生成可执行的a.out,其实里面封装了很多的步骤。主要的步骤和操作如下:

  1. 预处理(Preprocessing):编译器首先对源文件进行预处理。这一步骤会处理代码中的预处理指令,比如 #include、#define 等,并将相应的代码插入到源文件中。预处理的结果会生成一个被处理过的中间文件。
  2. 编译(Compilation):在编译阶段,编译器会将预处理过的源文件(中间文件)转换为汇编语言(Assembly Language)代码。将源代码翻译成底层的汇编指令,但还没有生成可执行代码,这个已经比较接近底层了。
  3. 汇编(Assembly):在汇编阶段,汇编器将汇编语言代码转换成机器码。汇编器将汇编代码中的每一条指令翻译成等效的机器指令,并生成一个目标文件。
  4. 链接(Linking):链接器将目标文件与所需的库文件(如标准库等)进行链接,生成最终的可执行文件。链接器将各个目标文件中的符号(变量、函数等)进行解析和合并,以创建一个独立的可执行文件。最终生成的可执行文件(例如 a.out)包含了可以在操作系统上直接执行的机器指令。
    总的来说,执行 gcc hello.c 命令将进行预处理、编译、汇编和链接等步骤,最终生成一个可执行文件。

具体对hello.c来说,主要命令如下:

预处理: gcc -E hello.c -o hello.i
编译: gcc -S hello.i -o hello.s
汇编: gcc -c hello.s -o hello.o
链接: gcc hello.o -o a.out

很多看似简单的事情,其实并不简单。只是因为工具做的好,屏蔽了所有的细节。但是作为学习者,应该要打开细节去学习,才能了解到其中的真谛。当然,如果将来你给别人提供工具,最好就是傻瓜也能用,这才是最好的工具。

你可能感兴趣的:(c语言入门,linux,c语言)