clang 与 GCC 的区别

一、clang 介绍

1.1 概述

          Clang 是一个 C 语言、C++、Objective-C 语言的轻量级编译器。源代码发布于 BSD 协议下。Clang 将支持其普通 lambda 表达式、返回类型的简化处理以及更好的处理 constexpr 关键字。

        Clang 是一个由 Apple 主导编写,基于 LLVM 的 C/C++/Objective-C 编译器

        2013 年 4 月,Clang 已经全面支持 C++11 标准,并开始实现 C++1y 特性(也就是 C++14,这是 C++ 的下一个小更新版本)。Clang 将支持其普通 lambda 表达式、返回类型的简化处理以及更好的处理 constexpr 关键字。

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

BSD :

BSD_百度百科

lambda 表达式:Lambda表达式_百度百科

LLVML: LLVM_百度百科

1.2 特点

1. 终端用户特色:

         快速编译和较少内存占用 ;有诊断功能;兼容 GCC;

2. 实用工具和应用:

        基础架构模块库;可满足多样的客户需求(代码重构,动态分析,代码生成,等);允许集成到各种IDE中;使用LLVM 'BSD' 协议;

3. 内部设计与实现:

        一个不可移植的代码库;一个为C语言、Objective-C、C++、Objective-C++设计的非通用(Non general-purpose)的语法解析器;与C/C++/Objective-C及它们的衍生语言具有高度一致性;

二、gcc 介绍

1.1 概述

        GCC(GNU Compiler Collection,GNU编译器套件)是由 GNU 开发的编程语言译器。GNU 编译器套件包括 C、C++、 Objective-C、 Fortran、Java、Ada 和 Go 语言前端,也包括了这些语言的库(如libstdc++,libgcj 等。)

        GCC 的初衷是为 GNU 操作系统专门编写的一款编译器。GNU 系统是彻底的自由软件。此处,“自由”的含义是它尊重用户的自由。

三、clang 比 gcc 编译器的优势

3. 1 clang 的优势

1. 编译速度更快

2. 编译产出更小

3. 出错提示更友好

         比如 clang 在编译过程可以直接指出相对简单的出错位置以及它 “ 认为 ” 正确的方式 。

4. 内置有静态分析工具,

        可以对代码进行静态分析 (clang—analyze) 。这也是 gcc 做不到的 。

5. 专注

        因为 clang 只需要完成词法和语法分析,代码优化和机器代码的生成工作由 llvm 完成。所以和全部由自己包下的 gcc 比起来, clang 可以更专注地做好一件事。这种结构也使 clang 可以被单独拿出来用在其他的程序里,成为其它 app (主要是 IDE)的内嵌 C/C++ parser 。 对于 IDE 而言,代码补全、重构是重要的功能,然而如果没有底层的支持,只使用 tags 分析或是正则表达式匹配是很难达成的, clang正好充当了这一角色。 这样, editor 工具可以使用和 compiler 一样的 parser 来完成 edit-time 的语法检查 。 而 gcc 就没法很方便地做到这一点 。由于历史原因, GCC 是一个单一的可执行程序编译器,其内部完成了从预处理到最后代码生成的全部过程,中间诸多信息都无法被其他程序重用。

 3.2 Gcc 的优势

1. 一些软件用 clang 编译会出现莫名其妙的错误,但是用 gcc 编译可以通过 。

2. GCC 在 5.0 之前一直都在准备用 C++ 实现模块化,期待 GCC 的 5.0 会有所突破,补上无法模块化的短板。

猜你喜欢

转载自blog.csdn.net/hfut_zhanghu/article/details/121397280