在学习操作系统的过程中,无可避免的会用到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 等他语言。

§ gcc、clang和msvc编译器比较 - 图1

Clang

Clang是一个由Apple主导编写,基于LLVM的C/C++/Objective-C编译器。Clang是一个C编写、基于LLVM的C/C/Objective-C/Objective-C++编译器。它与GNU C语言规范几乎完全兼容(当然,也有部分不兼容的内容,包括编译命令选项也会有点差异),并在此基础上增加了额外的语法特性,比如C函数重载(通过attribute((overloadable))来修饰函数),其目标(之一)就是超越GCC。

§ gcc、clang和msvc编译器比较 - 图2

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
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。