对于非计算机行业的程序猿来说,在编写C代码时无法可能写出来的代码没有那么高效,对编译器及计算机处理数据和指令的操作流程都不是很了解。下面我们就走进编译器和计算机的世界,去了解他们是怎么运作的。以下内容很多来自《深入理解操作系统》及《C性能优化》
1、 编译器是如何运作的
下面就以简单的“hello world\n"为例子
#include <stdio.h> int main() { printf("hello world\n"); return 0; }
在里linux系统上,完成由源文件hello.c到可执行文件hello的转化是由编译器完成的。翻译的过程分为4个阶段预处理、编译、汇编、链接一起构成了编译系统(compilation system)。

预处理阶段
gcc -E hello.c -o hello.i主要作用:1、头文件全部展开写到源程序中
2、宏定义替换
3、不对程序语法作检查
生成的hello.i文件可以自己打开看看!
编译阶段
gcc -S hello.i -o hello.s
作用: 1、检查语法的合法性
2、编译器将hello.i文件翻译成汇编文件hello.s
汇编阶段
gcc -c hello.s -o hell.o汇编器将汇编文件翻译成机器指令,这是打开文件,看到是一些乱码。
链接阶段
gcc hello.o -o hello
生成可执行代码 hello
file hello 查看属性 hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped