Clang
![]() Clang 13.0.1 | |
Original author(s) | Chris Lattner |
---|---|
Developer(s) | LLVM Developer Group |
Initial release | September 26, 2007[1] |
Stable release | 18.1.8[2] ![]() |
Repository | |
Written in | C++ |
Operating system | Unix-like |
Platform | AArch64,ARMv7,IA-32,x86-64,ppc64le[3] |
Type | Compiler front end |
License | Apache License 2.0with LLVM Exceptions[4][5] |
Website | clang |
Clang(/ˈklæŋ/)[6]is acompiler front endfor theC,C++,Objective-C,andObjective-C++programming languages,as well as theOpenMP,[7]OpenCL,RenderScript,CUDA,SYCL,andHIP[8]frameworks. It acts as adrop-in replacementfor theGNU Compiler Collection(GCC), supporting most of its compilation flags and unofficial language extensions.[9][10]It includes astatic analyzer,and several code analysis tools.[11]
Clang operates in tandem with theLLVMcompiler back endand has been a subproject of LLVM 2.6 and later.[12]As with LLVM, it isfree and open-source softwareunder theApache License 2.0software license.[4][5]Its contributors includeApple,Microsoft,Google,ARM,Sony,Intel,andAMD.
Clang 17, the latest major version of Clang as of October 2023, has full support for all published C++ standards up toC++17,implements most features ofC++20,and has initial support for the upcomingC++23standard.[13]Since v16.0.0, Clang compiles C++ using the GNU++17 dialect by default, which includes features from theC++17standard and conforming GNU extensions.[14]
Background
[edit]In 2005,Apple Inc.made extensive use of LLVM in several commercial products,[15]including theiOS SDKandXcode3.1. AnOpenGLcode compiler forOS Xthat converts OpenGL calls into more fundamental calls forgraphics processing units(GPU) that do not support certain features, was one of the first uses of LLVM. This enabled Apple to support OpenGL on computers usingIntel GMAchipsets, increasing performance on those machines.[16]
The LLVM project originally intended to useGCC's front end. The GCC source code, however, is large and somewhat cumbersome; as one long-time GCC developer put it referring to LLVM, "Trying to make the hippo dance is not really a lot of fun".[17]Besides, Apple software usesObjective-C,which is a low priority for GCC developers. As such, GCC does not integrate smoothly into Apple'sintegrated development environment(IDE).[18]Finally, GCC's license agreement, theGNU General Public License (GPL) version 3,requires developers who distribute extensions or modified versions of GCC to make theirsource codeavailable, but LLVM'spermissive software licensedoesn't require this.[4][5]
For these reasons, Apple developed Clang, a new compiler front end which supports C, Objective-C and C++.[18]In July 2007, the project received the approval for becoming open-source.[19]
Design
[edit]Clang works in tandem with LLVM.[20]The combination of Clang and LLVM provides most of thetoolchainfor replacing the GCCstack.One of Clang's main goals is to provide a library-based architecture,[21]so that the compiler could interoperate with other tools that interact with source code, such asintegrated development environments(IDE). In contrast, GCC works in a compile-link-debugworkflow; integrating it with other tools is not always easy. For instance, GCC uses a step calledfoldthat is key to the overall compile process, which has the side effect of translating the code tree into a form that looks unlike the original source code. If an error is found during or after the fold step, it can be difficult to translate that back into one location in the original source. Besides, vendors using the GCC stack within IDEs must use separate tools to index the code, to provide features likesyntax highlightingandintelligent code completion.
Clang retains more information during the compiling process than GCC, and preserves the overall form of the original code, making it easier to map errors back into the original source. Clang's error reports are more detailed, specific, and machine-readable, so IDEs can index the compiler's output. Modular design of the compiler can offer source code inde xing, syntax checking, and other features normally associated withrapid application developmentsystems. Theparse treeis also more suitable for supporting automatedcode refactoring,as it directly represents the original source code.
Clang compiles only C-like languages, such as C, C++, Objective-C, and Objective-C++. In many cases, Clang can replace GCC as needed, with no other effects on the toolchain as a whole.[citation needed]It supports most of the commonly used GCC options. A Fortran project, Flang was in-progress in 2022. However, for other languages, such asAda,LLVM remains dependent on GCC or another compiler front end.
Flang - Fortran
[edit]TheFlangproject byNvidiaandThe Portland GroupaddsFortransupport.[22]Flang is LLVM's Fortran frontend. It is often referred to as "LLVM Flang" to differentiate itself from "Classic Flang" – these are two separate and independent Fortran compilers. "LLVM Flang" is under active development. Development versions of Flang were in progress as of October 2023[update]and could be downloaded from the LLVM Project.[23]
Performance and GCC compatibility
[edit]![](https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Clang_12.0.1_compiling_htop.png/310px-Clang_12.0.1_compiling_htop.png)
Clang is compatible with GCC.[10]Itscommand-line interfaceshares many of GCC'sflagsand options. Clang implements many GNU language extensions andcompiler intrinsics,some of which are purely for compatibility. For example, even though Clang implements atomic intrinsics which correspond exactly with C11atomics,it also implements GCC's__sync_*
intrinsics for compatibility with GCC andlibstdc++.Clang also maintainsABIcompatibility with GCC-generatedobject code.In practice, Clang is a drop-in replacement for GCC.[24]
Clang's developers aim to reducememory footprintand increase compilation speed compared to competing compilers, such as GCC. In October 2007, they report that Clang compiled theCarbonlibraries more than twice as fast as GCC, while using about one-sixth GCC's memory and disk space.[25]By 2011, Clang seemed to retain this advantage in compiler performance.[26][27]As of mid-2014, Clang still consistently compiles faster than GCC in a mixed compile time and program performance benchmark.[28]However, by 2019, Clang is significantly slower at compiling the Linux Kernel than GCC while remaining slightly faster at compiling LLVM.[29]
While Clang has historically been faster than GCC at compiling, the output quality has lagged behind. As of 2014, performance of Clang-compiled programs lagged behind performance of the GCC-compiled program, sometimes by large factors (up to 5.5x),[28]replicating earlier reports of slower performance.[26]Both compilers have evolved to increase their performance since then, with the gap narrowing:
- Comparisons in November 2016 between GCC 4.8.2 versus clang 3.4, on a large harness of test files shows that GCC outperforms clang by approximately 17% on well-optimized source code. Test results are code-specific, and unoptimized C source code can reverse such differences. The two compilers thus seem broadly comparable.[30][unreliable source]
- Comparisons in 2019 onIntel Ice Lakehas shown that programs generated by Clang 10 has achieved 96% of the performance of GCC 10 over 41 different benchmarks (while winning 22 and losing 19 out of them).[29]
- In 2023, another comparison conducted four years later revealed that programs compiled using Clang now match the performance of those compiled with GCC. On average, Clang 16 surpasses GCC 13 by 6%.[31]
Interface
[edit]libclang
provides a C interface, providing a relatively small API. Exposed functionality includes: parsing source code into anAST,loading ASTs, traversing the AST, associating source locations with elements within the AST.
Status history
[edit]This table presents only significant steps and releases in Clang history.
Date | Highlights |
---|---|
11 July 2007 | Clang front-end released under open-source licence |
25 February 2009 | Clang/LLVM can compile a workingFreeBSDkernel.[32][33] |
16 March 2009 | Clang/LLVM can compile a workingDragonFly BSDkernel.[34][35] |
23 October 2009 | Clang 1.0 released, with LLVM 2.6 for the first time. |
December 2009 | Code generation for C and Objective-C reach production quality. Support for C++ and Objective-C++ still incomplete. Clang C++ can parse GCC 4.2libstdc++and generate working code for non-trivial programs,[20]and can compile itself.[36] |
2 February 2010 | Clangself-hosting.[37] |
20 May 2010 | Clang latest version built theBoost C++ librariessuccessfully, and passed nearly all tests.[38] |
10 June 2010 | Clang/LLVM becomes integral part ofFreeBSD,but default compiler is still GCC.[39] |
25 October 2010 | Clang/LLVM can compile a working modifiedLinux kernel.[40] |
January 2011 | Preliminary work completed to support the draftC++0xstandard, with a few of the draft's new features supported in Clang development version.[41][13] |
10 February 2011 | Clang can compile a workingHotSpotJava virtual machine.[26] |
19 January 2012 | Clang becomes an optional component inNetBSDcross-platform build system, but GCC is still default.[42] |
29 February 2012 | Clang 3.0 can rebuild 91.2% of theDebianarchive.[43] |
29 February 2012 | Clang becomes default compiler inMINIX 3[44] |
12 May 2012 | Clang/LLVM announced to replace GCC inFreeBSD.[45] |
5 November 2012 | Clang becomes default compiler inFreeBSD10.x on amd64/i386.[46] |
18 February 2013 | Clang/LLVM can compile a working modifiedAndroidLinux KernelforNexus 7.[47][48] |
19 April 2013 | Clang isC++11feature complete.[49] |
6 November 2013 | Clang isC++14feature complete.[50] |
11 September 2014 | Clang 3.5 can rebuild 94.3% of the Debian archive. The percentage of failures has dropped by 1.2% per release since January 2013, mainly due to increased compatibility with GCC flags.[51] |
October 2016 | Clang becomes default compiler forAndroid[52](and later only compiler supported byAndroid NDK[53]). |
13 March 2017 | Clang 4.0.0released |
26 July 2017 | Clang becomes default compiler inOpenBSD6.2 on amd64/i386.[54] |
7 September 2017 | Clang 5.0.0released |
19 January 2018 | Clang becomes default compiler inOpenBSD6.3 on arm.[55] |
5 March 2018 | Clang is now used to buildGoogle Chromefor Windows.[56] |
8 March 2018 | Clang 6.0.0released |
5 September 2018 | Clang is now used to buildFirefoxfor Windows.[57] |
19 September 2018 | Clang 7.0.0released |
20 March 2019 | Clang 8.0.0released |
1 July 2019 | Clang becomes default compiler inOpenBSD6.6 on mips64.[58] |
19 September 2019 | Clang 9.0.0releasedwith officialRISC-Vtarget support.[59] |
29 February 2020 | Clang becomes the only C compiler in theFreeBSDbase system, with the removal ofGCC.[60] |
24 March 2020 | Clang 10.0.0released |
2 April 2020 | Clang becomes default compiler inOpenBSD6.7 on powerpc.[61] |
12 October 2020 | Clang 11.0.0released |
21 December 2020 | Clang becomes default compiler inOpenBSD6.9 on mips64el.[62] |
14 April 2021 | Clang 12.0.0released |
4 October 2021 | Clang 13.0.0released |
25 March 2022 | Clang 14.0.0released |
6 September 2022 | Clang 15.0.0released |
17 March 2023 | Clang 16.0.0released |
9 September 2023 | Clang 17.0.1released |
See also
[edit]References
[edit]- ^"LLVM 2.1 Release Notes".llvm.org.LLVM Developer Group. September 27, 2007.Archivedfrom the original on November 17, 2016.RetrievedApril 30,2018.
- ^"LLVM 18.1.8".June 18, 2024.RetrievedJune 18,2024.
- ^"Releases".llvm / llvm-project repo.LLVM Developer Group. August 27, 2021.Archivedfrom the original on September 12, 2021.RetrievedSeptember 12,2021– viaGitHub.
- ^abc"LICENSE.TXT",llvm.org,LLVM Developer Group,archivedfrom the original on November 11, 2020,retrievedSeptember 24,2019
- ^abc"LLVM Developer Policy",llvm.org,LLVM Developer Group, § Copyright, License, and Patents,archivedfrom the original on November 13, 2012,retrievedSeptember 12,2021
- ^Christopher, Eric (July 3, 2008)."simply wonder pronunciation of Clang".LLVMdev(Mailing list).RetrievedSeptember 22,2015.
- ^"OpenMP Support".LLVM Project Blog.May 22, 2015.Archivedfrom the original on March 26, 2016.RetrievedMarch 28,2016.
- ^"C++ Heterogeneous-Compute Interface for Portability".GitHub.Archivedfrom the original on June 27, 2020.RetrievedFebruary 18,2020.
- ^"Clang Language Extensions".Archivedfrom the original on February 24, 2014.RetrievedNovember 8,2017.
In addition to the language extensions listed here, Clang aims to support a broad range of GCC extensions.
- ^abClang - Features and Goals: GCC Compatibility,April 15, 2013,archivedfrom the original on April 27, 2018,retrievedApril 30,2018
- ^"Clang Static Analyzer".LLVM.Archivedfrom the original on April 30, 2018.RetrievedSeptember 3,2009.
- ^"Getting Involved with the Clang Project",clang.llvm.org,LLVM Developer Group,archivedfrom the original on April 27, 2018,retrievedSeptember 18,2012,
Clang is a subproject of the LLVM Project, but has its own mailing lists because the communities have people with different interests.
- ^ab"C++ and C++'0x Support in Clang".LLVM.Archivedfrom the original on July 4, 2013.RetrievedMarch 12,2023.
- ^"Clang 17.0.1 Release Notes".LLVM.RetrievedOctober 25,2023.
- ^Treat, Adam (February 19, 2005)."mkspecs and patches for LLVM compile of Qt4".Qt4-preview-feedback(Mailing list). Archived fromthe originalon October 4, 2011.
- ^Lattner, Chris (May 25, 2007).LLVM for OpenGL and other stuff(Slides).LLVM Developers' Meeting.Archived(PDF)from the original on May 8, 2016.RetrievedApril 30,2018.
- ^Zadeck, Kenneth (November 19, 2005)."Re: LLVM/GCC Integration Proposal".GCC development(Mailing list).Archivedfrom the original on March 10, 2016.RetrievedJuly 25,2016.
- ^abNaroff, Steve (May 25, 2007).New LLVM C Front-end(Slides).LLVM Developers' Meeting.Archived(PDF)from the original on April 3, 2019.RetrievedApril 30,2018.
- ^Lattner, Chris (July 11, 2007)."New LLVM C front-end:" clang "".cfe-dev(Mailing list).Archivedfrom the original on March 26, 2020.RetrievedMarch 26,2020.
- ^abClang team,clang: a C language family frontend for LLVMArchivedNovember 12, 2017, at theWayback Machine
- ^"Clang: Utility and Applications: Library Based Architecture".Archivedfrom the original on April 27, 2018.RetrievedApril 30,2018.
- ^"FLANG: NVIDIA Brings Fortran To LLVM".Archivedfrom the original on May 20, 2017.RetrievedMay 18,2017.
- ^"Welcome to Flang's documentation — the Flang Compiler".
- ^Clang can often be used as a drop-in replacement for GCC,May 2020,archivedfrom the original on May 8, 2020,retrievedMay 9,2020
- ^Clang - Features and Goals: Fast compiles and Low Memory Use,October 2007,archivedfrom the original on April 27, 2018,retrievedApril 30,2018
- ^abcSimonis, Volker (February 10, 2011)."Compiling the HotSpot VM with Clang".Archived fromthe originalon February 18, 2011.RetrievedFebruary 13,2011.
While the overall GCC compatibility is excellent and the compile times are impressive, the performance of the generated code is still lacking behind a recent GCC version.
- ^"Benchmarking LLVM & Clang Against GCC 4.5".Phoronix.April 21, 2010.Archivedfrom the original on November 2, 2016.RetrievedFebruary 13,2011.
Binaries from LLVM-GCC and Clang both struggled to compete with GCC 4.5.0 in the timed HMMer benchmark of a Pfam database search. LLVM-GCC and Clang were about 23% slower(...)Though LLVM / Clang isn't the performance champion at this point, both components continue to be under very active development and there will hopefully be more news to report in the coming months
- ^ab"GCC 4.9 VS. LLVM Clang 3.5 Linux Compiler Benchmarks".OpenBenchmarking.org. April 14, 2014.Archivedfrom the original on October 23, 2017.RetrievedJune 25,2014.
- ^abMichael Larabel (December 23, 2019)."LLVM Clang Achieves ~96% The Performance Of GCC On Intel Ice Lake".Archivedfrom the original on January 15, 2021.RetrievedJanuary 14,2021.
- ^"Clang vs GCC - which produces better binaries?".stackoverflow.Archivedfrom the original on June 1, 2017.RetrievedOctober 1,2018.
- ^Michael Larabel (May 11, 2023)."LLVM Clang 16 vs. GCC 13 Compiler Performance On Intel Raptor Lake".RetrievedApril 24,2024.
- ^Divacky, Roman (February 25, 2009)."[Announce] clang/llvm can compile booting FreeBSD kernel on i386/amd64".Archivedfrom the original on May 1, 2018.RetrievedApril 30,2018.
- ^Building FreeBSD with Clang,Wiki.freebsd.org, August 24, 2012,archivedfrom the original on April 30, 2018,retrievedSeptember 18,2012
- ^Hornung, Alex."llvm/clang once more".Archivedfrom the original on April 30, 2018.RetrievedApril 30,2018.
- ^Clang,DragonFly BSD,archivedfrom the original on April 30, 2018,retrievedSeptember 18,2012
- ^"Clang can compile LLVM and Clang".LLVM Project Blog. December 24, 2009.Archivedfrom the original on April 26, 2012.RetrievedDecember 31,2009.
- ^"Clang Successfully Self-Hosts".LLVM Project Blog. February 4, 2010.Archivedfrom the original on April 26, 2012.RetrievedFebruary 5,2010.
- ^Gregor, Doug (May 20, 2010)."Clang++ Builds Boost!".LLVM Project Blog.Archivedfrom the original on April 26, 2012.RetrievedMay 21,2010.
- ^Davis, Brad."FreeBSD Status Reports April–June, 2010".Archivedfrom the original on June 24, 2018.RetrievedApril 30,2018.
- ^Clang builds a working Linux Kernel (Boots to RL5 with SMP, networking and X, self hosts),Lists.cs.uiuc.edu, archived fromthe originalon September 7, 2015,retrievedSeptember 18,2012
- ^Gregor, Douglas (January 26, 2011)."New C++0x feature support in Clang"(Mailing list). Archived fromthe originalon January 30, 2011.RetrievedJanuary 29,2011.
- ^Sonnenberger, Jörg (January 19, 2012)."Status of NetBSD and LLVM".Archived fromthe originalon September 21, 2016.RetrievedFebruary 26,2014.
- ^Ledru, Sylvestre."Rebuild of the Debian archive with clang".Archivedfrom the original on May 1, 2018.RetrievedApril 30,2018.
- ^"Official Minix 3 website: News".Archivedfrom the original on December 17, 2009.RetrievedDecember 7,2012.
- ^Gerzo, Daniel (May 12, 2012)."FreeBSD Quarterly Status Report January–March, 2012"(Mailing list).Archivedfrom the original on February 18, 2018.RetrievedMay 14,2012.
- ^Davis, Brooks (November 5, 2012)."Heads Up: Clang now the default on x86"(Mailing list).Archivedfrom the original on April 30, 2018.RetrievedNovember 7,2012.
- ^Webster, Behan (February 18, 2013)."LLVMLinux: Compiling Android with LLVM"(PDF).Archived fromthe original(PDF)on May 12, 2014.RetrievedMay 11,2013.
- ^Tinti, Vinicius (March 17, 2013)."LLVMLinux: Nexus 7".Archived fromthe originalon June 11, 2014.RetrievedMay 11,2013.
- ^Du Toit, Stefanus."Clang is C++11 feature complete as of *just now*!".Archivedfrom the original on September 24, 2019.RetrievedApril 20,2013.
- ^"[llvm-project] Revision 194194".Archived fromthe originalon November 18, 2018.RetrievedApril 30,2018.
- ^Ledru, Sylvestre."Rebuild of Debian using Clang 3.5.0".Archivedfrom the original on May 1, 2018.RetrievedApril 30,2018.
- ^"NDK Revision History | Android Developers".developer.android.Archivedfrom the original on March 6, 2018.RetrievedMarch 6,2018.
- ^"NDK Revision History | Android NDK | Android Developers".Android Developers.Archivedfrom the original on April 5, 2019.RetrievedApril 30,2018.
- ^Nagy, Robert (July 26, 2017)."switch the default compiler on amd64 and i386 to clang"(Mailing list).Archivedfrom the original on October 25, 2018.RetrievedSeptember 30,2017.
- ^Kettenis, Mark (January 19, 2018)."Switch the default compiler on armv7 to clang"(Mailing list).Archivedfrom the original on April 8, 2022.RetrievedAugust 27,2020.
- ^"Clang is now used to build Chrome for Windows".blog.llvm.org.March 5, 2018.Archivedfrom the original on March 5, 2018.RetrievedApril 7,2018.
- ^"Firefox Beta 63.0beta, See All New Features, Updates and Fixes".mozilla.org.Archivedfrom the original on April 19, 2021.RetrievedMarch 18,2020.
- ^Hankala, Visa (July 1, 2019)."Switch the default compiler on octeon to clang"(Mailing list).Archivedfrom the original on April 8, 2022.RetrievedAugust 27,2020.
- ^"LLVM 9 Releases With Official RISC-V Target Support, Asm Goto, Clang 9, And More".riscv.org.September 26, 2019.Archivedfrom the original on December 28, 2019.RetrievedSeptember 26,2019.
- ^"FreeBSD svn commit r358454".February 29, 2020.Archivedfrom the original on March 10, 2020.RetrievedMarch 7,2020.
- ^Kettenis, Mark (April 2, 2020)."Switch the default compiler on powerpc to clang"(Mailing list).Archivedfrom the original on April 8, 2022.RetrievedAugust 27,2020.
- ^Hankala, Visa (December 21, 2020)."Make clang the default compiler on loongson"(Mailing list).Archivedfrom the original on January 13, 2021.RetrievedJanuary 1,2021.