Clang ([ˈklæŋ]:クランのように発音) は、プログラミング言語 C、C++、Objective-C、Objective-C++ 向けのコンパイラフロントエンドである。OpenMPディレクティブや、OpenCL C/C++カーネル言語も正式サポートしている。バックエンドにLLVMのコンパイラ基盤を使用しており、LLVM 2.6以降はLLVMのリリースサイクルに組み込まれている。

Clang/LLVMベースの派生プロジェクトとして、RenderScript、CUDAのNVCC、ROCmのHIP-Clangといった、Cライクなドメイン固有言語 (DSL) を組み込んだGPGPUフレームワークにおけるコンパイラフロントエンドとしても採用されている。

プロジェクトの目標は、GNUコンパイラコレクション (GCC) を置き換えることのできるコンパイラを提供することである。開発は完全にオープンソースの方法で進められており、Apple、Microsoft、Google、ARM、ソニー、インテル、AMDなどの大企業も貢献者となっている。ソースコードは、イリノイ大学/NCSAオープンソースライセンスで提供されている。バージョン9.0.0からはライセンスがLLVM例外付きApache License 2.0に変更された。

macOSおよびiOS(ともにXcodeの付属として)、ならびにFreeBSDにおいて標準のコンパイラとして採用されている。

Clangプロジェクトではコンパイラのフロントエンドに加えてClang静的コード解析ツール(Clang-Tidy)も開発されている。

## 背景

2005年初頭、AppleはLLVMシステムを自社で開発している様々なシステム内で利用するための作業を開始した。AppleはObjective-Cを多用しているため、GCCの性能向上に興味を抱いていたがほとんど進展が見られず、Objective-Cの性能を上げるためにGCCをApple版に分岐させるか、新しいコンパイラを採用するかの選択をせまられていた。そこで、AppleはC99、Objective-CおよびC++をサポートするコンパイラを1から作成した。このClangプロジェクトは2007年7月にオープンソース化された。

LLVMは当初、GCCのフロントエンドを使用することを想定していた。しかし、GCCのソースコードは大規模で、やや面倒なシステムである。ある長年のGCC開発者は、「Trying to make the hippo dance is not really a lot of fun.(カバにダンスを踊らせるのは、あまり楽しいことではない)」と述べている。

## 概要

ClangはCをターゲットとした新しいコンパイラで、LLVM上で動作することを意図して設計されている。ClangとLLVMの組み合わせによって、ツールチェインの大半の機能を提供し、GCCスタック全体の置き換えが可能になる。Clangの主要な目標の一つは、統合開発環境 (IDE) のGUIと密接に連携したよりよい増分コンパイルのサポートである。GCCは古典的なコンパイル-リンク-デバッグのサイクルで用いるよう設計されており、増分コンパイルと実行中のコンパイルをサポートしているものの、他のツールと統合して使うことは簡単ではない。たとえばGCCのコンパイルにはコンパイル全体の中で重要な "fold" という段階があるが、これはコードツリーを元のソースコードと大きく異なる形に変換してしまう。fold中、あるいはその後でエラーが発見されると、元のソースの一箇所に対応付けるのは難しい。さらにGCCスタックをIDEで使用する場合、コードの色付表示や自動補完などの機能のために、コードをインデックス化する別のツールが必要になる。

Clangは、コンパイル中にGCCよりも多くの情報を取得し、得られた情報を元のコードと同じ形態で保存する。またClangによるエラーの報告は、より詳細で具体的でありIDEなどが表示しやすいようプログラムで利用できる書式になっている。コンパイラは動作させたままで、ソースコードの索引付け、文法のチェックなどのRADに関係したその他の機能を実行する。またコードは常にパース可能なテキストであるので、Clangが出力する解析木は自動的なリファクタリングをサポートするのに適している。

GCCはコンパイル処理にはマルチスレッドを用いていないので、ソース一つごとのコンパイルではマルチプロセッサのハードウェアの恩恵を受けられない。一方Clangはメモリ使用量の削減と速度の向上を目指してコンパイルの処理が最初からマルチスレッド対応で設計されている。2007年10月の時点で、ClangはCarbonのライブラリを、メモリとディスクを1/5程度しか使用せずに、GCCの2倍以上の速度でコンパイルできる。

GCCを用いた開発には困難な点もあるが、その理由については開発者が十分調査を行ってきた。その結果ClangチームはGCCの問題を避けて、より柔軟なシステムを構築できるようになった。Clangはモジュラー化されており、コンパイル時にバイナリに組み込まれてしまうソースコードモジュールではなく、ほぼリンク時に置換できるライブラリだけに依存しており、しかもよく文書化されている。新しい開発者がClangを使いこなし、開発に加わるスピードを加速させる。ライブラリは実行時に交換可能な複数のバージョンで提供される場合もあり、例えばパーサーは、コンパイルの性能測定の機能を持ったバージョンもある。

Clang は名前が示すとおりCやCに似た言語の専用のコンパイラであり、C、C++、Objective-C、Objective-C++、OpenCL、CUDA以外の言語のフロントエンドは提供しない。Fortran、Ada、Go については LLVM は GCC (dragonegg) に依存し続ける。Clang は必要に応じてツールチェイン全体には影響を与えず GCC と交換することができる。非公式のサブプロジェクトとしてNVIDIAが開発した Flang により Fortran サポートが追加された。

### 現在の状況

プロジェクトは2023年現在、活発に開発が行われている。これまでにC89、C++17までの標準規格への準拠を完了している。C99/C11/C17に関しては重要な機能を実装しているが、完全準拠ではない。引き続きC23およびC++20以降のサポートを目指し開発が行われている。

Googleが提供するAndroid向けのC/C++言語開発キットであるAndroid NDK(Native Development Kit)では、従来GCCが標準であったが、2012年11月リリースのリビジョンr8cからClangが副選択肢として追加され、2016年10月リリースのリビジョンr13bからはClangが標準となった。2018年9月リリースのリビジョンr18bにてGCCは削除された。

Microsoft Windows上でClangを使用するには、CygwinやMinGWといったPOSIX互換のサブシステムを利用する方法のほか、Windows用LLVMバイナリを利用する方法もある。Visual Studioはバージョン2019 (16.2) 以降で、Windows/Linux用バイナリを生成するMSBuildプロジェクトのC/C++コンパイラにClangを使用できるようになった。MSVC (cl.exe) 互換のclang-clもある。

Microsoft DirectX (Direct3D) 12で導入されたシェーダーモデル6.0以降の機能をサポートするHLSLコンパイラとして、マイクロソフトはDirectX Shader Compiler (DXC) と呼ばれるClangベースの派生コンパイラを開発してきたが、HLSLサポートを本家Clangのコードベースに取り込むプロジェクトが進行中である。

Intel C++ Compiler (ICC/ICL) や、C++Builder (BCC) も、Clangをベースに独自の拡張機能を追加した派生コンパイラとして生まれ変わっている。

## 歴史

Clangプロジェクト略史

| 日付 | できごと |
| --- | --- |
| 2009年2月25日 | Clang/LLVMが、動作するFreeBSDカーネルをコンパイルできたことが発表された。 |
| 2009年3月16日 | Clang/LLVMが、動作するDragonFly BSDカーネルをコンパイルできたことが発表された。しかし、Linuxカーネルのコンパイルには更なる作業が必要である。 |
| 2009年5月9日 | FreeBSD Status Reportにおいて、FreeBSDプロジェクトがGCCをClangで置き換えられるかどうか調査していることが報告された。 |
| 2009年10月23日 | Clang 1.0が、初めてLLVM本体 (LLVM 2.6) と同時にリリース。 |
| 2009年12月 | CおよびObjective-Cのコード生成能力は製品レベルに達した。しかし、C++、Objective-C++のサポートは不完全であった。Clang C++はGCC 4.2のlibstdc++をパースし、小規模なプログラムのコードを生成でき、自分自身をコンパイル可能となった。 |
| 2010年2月5日 | LLVM Project Blogにおいて、Clangがセルフホスティングのコンパイラとなったことが発表された。 |
| 2010年2月20日 | HelenOSのソースコードを修正することでClangでコンパイルに成功した。また、IA-32環境のカーネルとユーザランドの回帰テストに全て合格した。 |
| 2010年4月27日 | Clang 2.7リリース。CIndex APIとPythonバインディングのサポート。 |
| 2010年5月20日 | 最新バージョンのClangでBoost C++ライブラリのビルドに成功し、ほぼ全てのテストに合格した。 |
| 2010年6月9日 | Clang/LLVMがFreeBSDのソースコードツリーに取り込まれた。最初は、デフォルトのコンパイラにはならないが、外部コンパイラによるビルドをサポートした上で、デフォルトのシステムコンパイラになる予定である。 |
| 2010年10月5日 | Clang 2.8リリース。C++98、C++03の機能の実装完了。Objective-C++のサポート。 |
| 2010年10月25日 | Clang/LLVMがLinuxカーネルをコンパイルし動作したと発表された。 |
| 2011年1月 | C++0xドラフトのサポート準備が完了した。また、開発バージョンでドラフトの新しい機能をサポート。 |
| 2011年2月10日 | HotSpot Java仮想マシンをコンパイルし、動作させることが出来た。 |
| 2011年4月6日 | Clang 2.9リリース。C11 の機能を一部サポート。 |
| 2011年12月1日 | Clang 3.0リリース。GCC互換のコマンドラインドライバを改善。 |
| 2012年2月28日 | Clang 3.0によってDebianアーカイブの91%以上をリビルドすることが出来た。 |
| 2012年5月12日 | FreeBSD Quarterly Status Reportにおいて、FreeBSDはGCCをClang/LLVMで置き換えると発表した。 |
| 2012年5月22日 | Clang 3.1リリース。100%互換ではないものの C++11 規格に従う機能の大半を実装。。 |
| 2012年12月1日 | Clang 3.2リリース。エラーメッセージの改善、C11, C++11 の対応の改善。 |
| 2013年4月 | 安定版としては未リリースだが、C++11規格に従う機能をすべて実装を完了。 |
| 2013年6月17日 | Clang 3.3リリース。識別子でのUnicode文字対応、C++11 の対応改善。 |
| 2014年1月6日 | Clang 3.4リリース。C++14 の現時点でドラフトに書いてある部分を実装。 |
| 2014年9月4日 | Clang 3.5リリース。C++17の機能を実験的にサポート。 |
| 2015年2月27日 | Clang 3.6リリース。C言語のデフォルトモードをC99からC11に変更。 |
| 2015年9月1日 | Clang 3.7リリース。OpenMP 3.1のサポート。OpenMP 4.0の一部サポート。 |
| 2016年3月8日 | Clang 3.8リリース。CUDAの実験的サポート。OpenMP 4.0/4.5、OpenCL 2.0の一部サポート。 |
| 2016年9月2日 | Clang 3.9リリース。OpenCL 2.0のサポート。オフロード機能を除くOpenMP 3.1およびOpenMP 4.0/4.5をサポート。 |
| 2017年3月13日 | Clang 4.0.0 リリース。ThinLTOの改善。 |
| 2017年9月7日 | Clang 5.0.0 リリース。C++17機能の実装完了。 |
| 2018年3月8日 | Clang 6.0.0 リリース。Spectre対策のためにretpolinesをサポート。C++のデフォルトモードをC++98からC++14に変更。C++2a機能の一部サポート。 |
| 2018年9月19日 | Clang 7.0.0 リリース。DWARFv5の実験的サポート。 |
| 2019年3月20日 | Clang 8.0.0 リリース。自動変数の初期化オプション。プロファイルの再マッピングファイルの利用をサポート。OpenMP 5.0の一部サポート。 |
| 2019年9月19日 | Clang 9.0.0 リリース。OpenCL向けのC++機能の実験的サポート。GCCのインラインアセンブラにおける独自拡張asm gotoをサポートしx64向けLinuxカーネルなどのビルドが可能になった。 |
| 2020年3月24日 | Clang 10.0.0 リリース。C++2aのコンセプト (Concepts) をサポート。Windows Control Flow Guard (CFG) に対応。 |
| 2020年10月12日 | Clang 11.0.0 リリース。C言語のデフォルトモードをC11からC17に変更。 |
| 2020年12月21日 | OpenBSD 6.9 の mips64el で、Clang がデフォルトのコンパイラとなった。 |
| 2021年4月14日 | Clang 12.0.0 リリース。アトミック操作を実装するヘルパー関数の呼び出しを有効/無効にするAArch64オプションと、ターゲットとなるbinutilsのバージョンを指定するオプションが追加された。 |
| 2021年10月4日 | Clang 13.0.0 リリース。 |
| 2022年3月25日 | Clang 14.0.0 リリース。 |
| 2022年9月6日 | Clang 15.0.0 リリース。 |
| 2023年3月17日 | Clang 16.0.0 リリース。 |
| 2023年9月9日 | Clang 17.0.1 リリース。 |
| 2024年3月5日 | Clang 18.1.0 リリース。 |
| 2024年9月17日 | Clang 19.1.0 リリース。 |