在学习操作系统的过程中,无可避免的会用到C语言,这是因为像Linux的很多内核都是由C语言来编写的,而牵涉到语言就必须要用到编译器。在编译C语言的时候,我们会经常见到下面3个编译器
- GCC
- Clang
- MSVC
GCC
GCC(GNU Compiler Collection,GNU 编译器套装),是一套由 GNU 开发的编程语言编译器。GCC 原名为 GNU C 语言编译器,因为它原本只能处理 C语言。GCC 快速演进,变得可处理 C++、Fortran、Pascal、Objective-C、Java 以及 Ada 等他语言。
Clang
Clang是一个由Apple主导编写,基于LLVM的C/C++/Objective-C编译器。Clang是一个C编写、基于LLVM的C/C/Objective-C/Objective-C++编译器。它与GNU C语言规范几乎完全兼容(当然,也有部分不兼容的内容,包括编译命令选项也会有点差异),并在此基础上增加了额外的语法特性,比如C函数重载(通过attribute((overloadable))来修饰函数),其目标(之一)就是超越GCC。
MSVC
MSVC是指微软的VC编译器,经常性的拿来和Windows平台下的MinGW进行对比。
大致区别
- msvc通常用于编译Windows应用,而gcc/clang则可以用来编译Windows/Linux/MacOS等所有平台的应用。
- 很多基于POSIX/GNU体系开发的应用并未在msvc上编译调试过。反之,很多纯windows应用并未在gcc/clang上编译调试过。所以两者的代码大概率是不可互换的,除非你写的恰好是跨平台代码(比如Qt)
- msvc在字符编码的处理方面略有不同,它默认Win当前语言所属的MBCS字符集,如果使用utf-8通常需要加bom,当然即便加了bom,某些代码编译起来也会需要特别的处理。而gcc/clang是默认要用无bom的utf-8字符编码。
- msvc/gcc/clang在具体的优化策略上会有不同,所以同样的程序代码会产生不同方向的优化,生成不同的机器代码。
- 如果去网上找开源代码,多数情况下不会同时支持所有编译器,要么是支持 gcc/clang 的,要么是支持 msvc 的,改换平台移植往往需要额外的工作量。如果你需要依赖的第三方代码更多是属于 gcc/clang 体系的,那么就建议选择gcc/clang,反之如果你需要依赖的第三方代码更多基于 msvc ,那就建议选择 msvc。
至于 gcc 跟 clang,两者代码标准大体上是兼容的,主要区别可能只是开发团队不同,设计理念不同。
gcc / clang 这两个平行的团队,将来谁会胜出,个人觉得主要还是看谁有更雄厚的资源投入,或者说谁更有钱有势。谁被更大的大佬包养。当前时间点,clang 的优势更大,不过谁知道呢,万一将来 gcc 找了个更强的爹,就不好说了。
作者:pansz
链接:https://www.zhihu.com/question/445921363/answer/1763195868
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。