Clang

Clang发音为/ˈklæŋ/类似英文单字clang[4]) 是一个CC++Objective-CObjective-C++编程语言的编译器前端。它采用了LLVM作为其后端,由LLVM2.6开始,一起发布新版本。它的目标是提供一个GNU编译器套装(GCC)的替代品,支持了GNU编译器大多数的编译设置以及非官方语言的扩充功能。作者是克里斯·拉特纳(Chris Lattner),在苹果公司的赞助支持下进行开发,而原代码授权是使用类BSD的伊利诺伊大学厄巴纳-香槟分校开源码许可。

Clang
原作者克里斯·拉特纳
开发者LLVM开发小组
当前版本
  • 18.1.2 (2024年3月20日;稳定版本)[1][2]
源代码库
编程语言C++
操作系统Unix-like
平台跨平台
类型编译器
许可协议
网站clang.llvm.org 编辑维基数据

Clang项目包括Clang前端和Clang静态分析器等。[5]

概述

这个软件项目在2005年由苹果公司发起,是LLVM编译器工具集的前端(front-end),目的是输出代码对应的抽象语法树(Abstract Syntax Tree, AST),并将代码编译成LLVM Bitcode。接着在后端(back-end)使用LLVM编译成平台相关的机器语言 。Clang支持C、C++、Objective C。

在Clang语言中,使用Stmt来代表statement。Clang代码的单元(unit)皆为语句(statement),语法树的节点(node)类型就是Stmt。另外Clang的表达式(Expression)也是语句的一种,Clang使用Expr来代表Expression,Expr本身继承自Stmt。节点之下有子节点列表(sub-node-list)。

Clang本身性能优异,其生成的AST所耗用掉的内存仅仅是GCC的20%左右。FreeBSD操作系统自2014年1月发行的10.0版本开始将Clang/LLVM作为默认编译器[6]

性能

测试证明Clang编译Objective-C代码时速度为GCC的3倍[7],还能针对用户发生的编译错误准确地给出建议[8]

版本历史

这个表格只记录了Clang历史中特别的阶段与版本

日期 要点
2007年7月11日Clang前端以开放原代码授权发布
2009年2月25日Clang/LLVM能够编译出可运作的FreeBSD内核。[9][10]
2009年3月16日Clang/LLVM能够编译出可运作的DragonFly BSD内核。[11][12]
2009年10月23日Clang 1.0首度与LLVM 2.6一起发布。
2009年12月24日产生的C和Objective-C代码达到产品品质(但C++和Objective-C++仍未完成)Clang C++能够编译GCC 4.2的libstdc++并为某些特定的程序产生可运作的代码,并可以编译自身。[13]
2010年2月2日Clang能够自举[14]
2010年2月20日经过修改后的HelenOS能够用Clang编译,,并在IA-32上通过所有空间与用户回归测试。[15]
2010年5月20日最新版的Clang成功建制Boost C++ Libraries,并且几乎通过了所有测验[16]
2010年6月10日Clang/LLVM被集成在FreeBSD之中(但缺省编译器仍是GCC)[17]
2010年10月25日Clang/LLVM能够编译可运作的Linux内核[18]
2011年1月26日初步实现所有C++0x草案标准,其中少部分草案中的新特性也出现在开发版的Clang中。[19][20]
2011年2月10日Clang能够编译出可运作的HotSpot Java虚拟机
2012年2月28日Clang 3.0能够重建超过91%Debian成品。[21]
2012年2月29日Clang成为MINIX 3中缺省的编译器。[22]
2012年5月12日FreeBSD宣布Clang/LLVM将成为缺省编译器,取代沿用多年的GCC。[23]
2012年11月5日Clang成为FreeBSD缺省编译器。[24]
2013年2月18日Clang/LLVM能够编译出Nexus 7修改版可运作的Android Linux内核[25][26]
2013年4月19日Clang完成所有C++11特性。[27]
2013年11月6日Clang完成所有C++14特性。[28]

参考文献

  1. . [2024年3月20日].
  2. . [2024年3月20日].
  3. , llvm.org, [2021-02-03], (原始内容存档于2022-06-29)
  4. Christopher, Eric. . LLVMdev (邮件列表). 2008-07-03 [2008-07-09]. (原始内容存档于2012-02-08).
  5. . LLVM. [2009-09-03]. (原始内容存档于2011-10-08).
  6. . [2017-07-17]. (原始内容存档于2017-07-08).
  7. Chris Lattner. (PDF). [2013-09-26]. (原始内容存档 (PDF)于2012-06-18).
  8. . [2013-09-26]. (原始内容存档于2010-07-02).
  9. Divacky, Roman. . [2013-11-08]. (原始内容存档于2012-04-30).
  10. , Wiki.freebsd.org, 2012-08-24 [2012-09-18], (原始内容存档于2012-10-01)
  11. Hornung, Alex. . [2013-11-08]. (原始内容存档于2012-04-30).
  12. , DragonFlyBSD, [2012-09-18], (原始内容存档于2012-10-05)
  13. . LLVM Project Blog. [2013-11-08]. (原始内容存档于2012-04-30).
  14. . LLVM Project Blog. [2013-11-08]. (原始内容存档于2012-04-30).
  15. . [2013-11-08]. (原始内容存档于2012-04-30).
  16. Gregor, Doug. . LLVM Project Blog. [2013-11-08]. (原始内容存档于2012-04-30).
  17. Davis, Brad. . [2013-11-08]. (原始内容存档于2012-04-30).
  18. , Lists.cs.uiuc.edu, [2012-09-18], (原始内容存档于2015-09-07)
  19. Gregor, Douglas. (邮件列表). 26 January 2011 [29 January 2011]. (原始内容存档于2011年1月30日).
  20. . LLVM. [2013-11-08]. (原始内容存档于2019-05-28).
  21. Ledru, Sylvestre. . [2013-11-08]. (原始内容存档于2012-06-18).
  22. . [2013-11-08]. (原始内容存档于2015-11-28).
  23. Gerzo, Daniel. (邮件列表). 12 May 2012 [14 May 2012]. (原始内容存档于2012-06-30).
  24. Davis, Brooks. (邮件列表). 5 November 2012 [7 November 2012]. (原始内容存档于2013-11-22).
  25. Webster, Behan. (PDF). 18 February 2013 [11 May 2013]. (原始内容 (PDF)存档于2014-05-12).
  26. Tinti, Vinicius. . 17 March 2013 [11 May 2013]. (原始内容存档于2014-06-11).
  27. Du Toit, Stefanus. . [2013-11-08]. (原始内容存档于2019-09-24).
  28. . [2013-11-08]. (原始内容存档于2017-01-30).

外部链接

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.