首页 > C Implementation 是什么?和 Preprocessor, Compiler 和 Linker 又是什么关系?

C Implementation 是什么?和 Preprocessor, Compiler 和 Linker 又是什么关系?

在 C Traps and Pitfalls 中经常接触到这种术语,不太清楚它和 Preprocessor, Compiler 和 Linker 等等,究竟是怎样的关系。

C 的英文维基指出 GCC 就是一种 C Implementation, 但是我以为它只是一个 Compiler 而已。


看了一下C的英文维基,C Implementation应该是指编译/运行C程序需要的各组件。

我的理解是C语言是一个标准,任何人都能实现它,所以有不同的编译器,不同的组织/个人写的库。预处理器、编译器、链接器和运行需要的库构成了C Implementation。

所以在维基上的Major implementations中有GCC、Clang等

GCC不只是Compiler,GCC是GNU Compiler Collection


感觉这个 C Implementation 不只是编译器、链接器。而且还有标准 C 库。不同的 C 库在功能上,性能上还是有差别的。


c是一个标准,gcc是c语言的一个实现(c Implementation),其它的还有VS等。

compilier, linker是编译器和连接器。

编译和链接就好比是组装一台机器。
我们首先检查机器每个组件,并且擦干净,这一步就叫做编译(compile)。
然后再将每个组件拼接起来,这就叫做链接(link)。

执行这两步需要的工具就是compilier和linker。


当你接触到不同处理器下C开发的时候,大概就能深刻体会什么叫TM的C Implementation
例如:
1. 变态的DSP编译器下面char是占用16bit的,造么,sizeof(char) = sizeof(int) = 1
2. ARM编译器默认char是unsigned的,所以要记得这样定义#define signed char I8_T
3. 古老的Keil C,sscanf里不能超过4个变量!
4. 当然,由于不同C实现不一样,C标准里才有了size_tptrdiff_t这种通用安全类型


preprocessor主要作用是源码中的macro进行预替换和处理。被处理后的c文件由compiler生成2进制的代码,也就是经常看到的.o文件,然后这些.o文件最终被linker处理,链接成可执行文件。
GCC中经常用到的有cpp 这就是preprocessor, gcc这个是主要用到compiler,ld是linker。
其实现在gcc可以通过
--enable-languages=c,c++,java,go,d,fortran,objc,obj-c++
来支持其他语言,的确是个编译器合集了(compiler collection)


所谓“C implementation”,指的是一个让C程序能运行起来的系统,它可以是这样一套系统:“预处理器/编译器”+连接器+标准库,对应“GNU的实现”就是GCC + GNU-ld + glibc,对应“微软的实现”就是CL.EXE + LINK.EXE + MSVCRTxx.DLL

所谓Pre-processor/预处理器,是一个用于预处理C源代码的程序,它的作用是处理源代码中所有以"#"开头的命令和宏替换,比如"#include ",这一行就会被替换为xxx这个文件的内容。
预处理器其实并不能完全理解C的语法,它基本上只是在文本这一级做替换,替换之后的源代码会传给“编译器”。
很多现代的编译器已经把预处理器集成在了编译器中,一般还会保留一个独立的预处理程序,用于向前兼容,比如GNU C Compiler中的预处理器就是一个叫"cpp"的程序。

除了上面说的编译器之外,这个“C implementation”还可以是别的东西,比如Ch,或者CINT,这些是“解释器”而不是编译器。

【热门文章】
【热门文章】