为什么clang不再使用?

时间:2011-02-03 12:04:41

标签: c++ c compiler-construction clang

我以前在C / C ++中做过相当多的编程,但是现在它只占我编程的一小部分(脚本语言更适合我做的很多工作)。过去几天我参与了一些C编程项目,并且惊讶于我忘记了多少很少的语法细节。更糟糕的是,cc / gcc通常会有关于这些问题的含糊不清或无信息的错误消息(抱歉,我记不起任何具体的例子)。

我不久前就了解了clang编译器,并决定试一试。错误消息更清晰,帮助我识别和修复语法中的问题。我的问题是为什么不使用/提及这个工具比它更多?它是否与通常的嫌疑人(cc / gcc)相比是如此新颖,还是它不支持他们支持的功能,或者它是否更难获得?我很难相信最后一个,因为它是在我的iMac上安装了dev工具,并且需要一个命令(sudo apt-get install clang)才能在我的Ubuntu盒子上安装。

6 个答案:

答案 0 :(得分:39)

  

我的问题是为什么不使用/提及这个工具的原因比什么呢?

这可能是因为历史,以及我们人类的行为方式。

传统上,gcc是唯一可以实际用于在至少所有免费* nix克隆上编译C程序的真实(免费)编译器。它实际上是Linux的所有基本系统和内核,* BSD,现在可能是OSX,以及其他编译器。

虽然存在缺陷,但基本上这意味着: gcc正常工作。如果没有损坏,请不要修理它。除此之外,你现在拥有庞大的用户群,很容易获得gcc的帮助,有很多人使用gcc,正在使用gcc本身等。

一般来说,如果你想把一个庞大的社区从他们习惯的东西转移到其他东西上,那么“其他东西”必须“明显”更好。只是“更好”往往不够理智。我认为你可以在社会的许多方面找到这方面的例子。

clang是更新的,有些人只会怀疑是否有任务,如果它有错误,如果它产生更慢的代码等等 - 它似乎在人性中是可疑的 - 新事物是可怕的。许多人甚至不知道铿锵声,许多人不在乎,因为他们对gcc感到满意。

但是,如果而不想使用clang,那就去吧 - 错误消息确实“更好”,而且比gcc更容易理解。

答案 1 :(得分:10)

铿锵前端相对较新。例如,2010年10月的2.8 release标志着C ++ 98/03支持的完成。

随着成熟度的提高,似乎会越来越多地采用。例如,正在进行使用clang构建FreeBSD OS(以及其他BSD OS)的工作,从而消除了对GCC / G ++的依赖。

Apple正在推动LLVM / clang组合。他们似乎不再支持他们旧的GCC工具链分支(基于4.2),并且完全依赖于用于OSX / iOS开发的clang工具。

Clang也越来越多地采用类似C语言的自定义编译器(例如OpenCL的着色器语言编译器)

答案 2 :(得分:7)

LLVM已经存在了一段时间,但是 - 至少在我的脖子上 - 它最近才刚刚起步,这可能是因为苹果公司一直在大力推动用Clang取代gcc。他们自己的工具链。

另外,我相信它的C ++支持最近才成为生产级别。 编辑:似乎还没有。 (见下面的评论。)

另一个因素可能是LLVM主要由单一供应商提供支持,而非Apple开发人员对此不信任。

答案 3 :(得分:6)

  

我的问题是为什么不使用/提及此工具的原因多于它?与通常的嫌疑人相比,它是否是如此新颖......

这正是原因所在。它仍然是新的,核心功能仍在积极开发中。请记住,现有项目可能正在使用特定于编译器的功能 - 或使用具有这些功能的库 - 并且开发人员无论如何都不愿意为可能存在意外错误或未知性能/大小/等的实验性工具更改工作工具。权衡,即使新工具每天都在变得越来越好。

答案 4 :(得分:4)

作为一名学生程序员,我觉得这是一个天赐之物,主要是因为它是有用且可理解的错误信息。我主要用它来编写C语言,虽然我也开始使用Clang扩展到C ++。

至于为什么没有提到它,我怀疑是因为GCC已经建立了这么久,对于大多数用户来说它是编译器。 GCC对我来说工作得很好,除了它是非常神秘的错误信息,因为学生确实让我失望了。

总的来说,我强烈推荐Clang供学生和开发人员使用。由于它现在是Apple和Xcode的官方编译器,我怀疑它的使用和名称识别将迅速提升。 FreeBSD似乎也将它作为主要的编译器,但我怀疑它对它的受欢迎程度的影响要小于Apple的采用率。

附录: 由于来自Clang的竞争,GCC 4.8和4.9中错误消息的清晰度显示出显着的改善;虽然我仍然觉得Clang更清醒,但差距却明显缩小了。

答案 5 :(得分:2)

今天,clang正在取代大多数places中的gcc。即,大多数类似* NIX的操作系统和Linux发行版。一些例子是FreeBSD,Minix和mac(有点显而易见)clang,它们将clang切换为默认编译器。我的一些朋友,当我展示它们时。

这个恕我直言,看起来有些人有问题,可能是旧版本。但是对于clang 3.0版,我没有任何这个问题。正如我之前提到的,我在所有新项目中都使用它。几乎是我的默认编译器,有时我会make C=gcc只看到clang错误/警告的区别。并且clang赢了。通过更好的解释并努力优化。它包括编译器的使用扩展(一些是gcc inerhid)的建议,以便在代码生成中获得最佳性能。

我写了一个简单的函数来打印错误信息。但是我会在标准输出上打印错误消息后退出程序。所以,我做了一个简单的修改,在函数中放置exit(1)作为最后一个语句。如下:

void error(const char *fmt, ...)
{
  va_list ap;
  va_start(ap, fmt);
  fprintf(stderr, "error: ");
  vfprintf(stderr, fmt, ap);
  va_end(ap);
  exit(1);
}

所以铿锵表演

  

警告:可以使用属性'noreturn'声明函数'error'   [-Wmissing-不返回的]`

(即使没有-Wall -Wextra -Wunreachable-code -O3标志,gcc也不会产生它)

我说“这看起来很不错。但是什么是'非退货'属性?我从来没有听过或读过这个。我跳到谷歌搜索clang could be declared with attribute 'noreturn'(哦,是的,我可以写的clang nonreturn attribute,但遗忘了)我发现this链接了一个很好的解释,说明这个属性是什么以及我可以获得的性能增益。

所以我运行将此属性添加到我的函数原型中(当然,如果它是gcc或clang编译器;宏将执行特技检测)。哦,是的,对我来说,任何小的性能增益(当然,没有使代码不可读)它是一个胜利。

并且不要在这里结束,一年前,我在一个函数中创建return,其中一个开关作为默认处理定义(如此处的error()函数)。但即便如此,gcc仍然关于没有返回值的功能(对不起,我不记得确切的错误/警告信息)怎么可能呢?切换后没有更多的语句,如果没有大小写匹配,则执行默认值并且如果有的话,下面的语句并不重要。但是clang和我一样认为不同,并对这个声明发出警告,帮助我制作更好的代码。

对于这种非常小的事情,我很喜欢这个铿锵声。 (注意:我很抱歉我的英语不好。英语不是我的母语人士,但尽管我在这里尝试表达我的意思)