Clang(クランと発音)は、C、
C++、Objective-C、Objective-
C++といった
プログラミング言語のための
コンパイラフロントエンドです。
OpenMPディレクティブや
OpenCL C/
C++カーネル言語もサポートしており、バックエンドにはLLVM
コンパイラ基盤を採用しています。LLVM 2.6以降、LLVMのリリースサイクルに組み込まれ、一体的に開発が進められています。
Clangの多様な展開
Clang/LLVMを基盤とする派生プロジェクトも活発で、RenderScript、
CUDAのNVCC、ROCmのHIP-Clangなど、
C言語に似た
ドメイン固有言語(DSL)を組み込んだ
GPGPUフレームワークの
コンパイラフロントエンドとしても採用されています。
開発の背景と目標
Clangプロジェクトの目標は、
GNU[[コンパイラコレクション]](GCC)に代わる
コンパイラを提供することです。開発はオープンソースで進められ、
Apple、Microsoft、
Google、ARM、ソニー、
インテル、AMDといった大企業が貢献しています。
ソースコードは当初イリノイ大学/NCSAオープンソース
ライセンスで提供されていましたが、バージョン9.0.0からはLLVM例外付きApache License 2.0に変更されました。
macOSおよびiOS(Xcodeに付属)、FreeBSDでは標準
コンパイラとして採用されており、その信頼性の高さが伺えます。また、
コンパイラフロントエンドに加え、静的コード解析ツールであるClang-Tidyも開発されており、総合的な開発環境の構築に貢献しています。
GCCからの脱却
2005年初頭、
AppleはLLVMシステムを自社製品に導入する検討を開始しました。Objective-Cを多用していた
Appleは、GCCの性能向上に課題を感じていました。GCCの改良が停滞する中、Objective-Cの性能を向上させるためにGCCのフォーク版を作成するか、新しい
コンパイラを開発する必要に迫られていました。そこで、
AppleはC99、Objective-C、
C++をサポートする
コンパイラをゼロから開発することを決意し、2007年7月にClangプロジェクトがオープンソース化されました。
当初LLVMはGCCの
フロントエンドを使用する予定でしたが、GCCの
ソースコードが大規模で複雑だったため、より柔軟なシステムの必要性が認識されました。
Clangの革新的な設計
ClangはLLVM上で動作することを前提に設計されており、LLVMと組み合わせることでツールチェーンのほとんどの機能を提供し、GCCスタック全体の置き換えを可能にします。特に、統合開発環境(IDE)との密接な連携を重視しており、より優れた増分コンパイルをサポートします。GCCは古典的なコンパイル-リンク-デバッグのサイクルを前提としており、増分コンパイルや実行中のコンパイルをサポートするものの、他のツールとの統合が難しいという課題がありました。例えば、GCCのコンパイルプロセスには「fold」という段階があり、コードツリーを大きく変形させるため、エラー発生時に元の
ソースコードとの対応付けが困難になります。また、IDEでコードの色付けや補完機能を利用するためには、別途インデックス化ツールが必要でした。
Clangは、コンパイル中にGCCよりも多くの情報を取得し、元のコードと同じ形式で保存します。エラー報告も詳細で具体的に表示され、IDEが利用しやすい形式で出力されます。
コンパイラを動作させたまま、
ソースコードの索引付けや文法チェックなど、RAD(Rapid Application Development)に関連する機能も実行可能です。また、Clangが出力する解析木は自動リファクタリングを容易にします。
さらに、Clangはマルチスレッド対応で設計されており、メモリ使用量を削減しつつコンパイル速度を向上させることができます。一方、GCCはコンパイル処理にマルチスレッドを使用しないため、マルチプロセッサ環境の恩恵を十分に受けられません。
モジュール性と柔軟性
GCCを用いた開発にはいくつかの困難があり、Clangチームはそれらの問題を回避し、より柔軟なシステムを構築しました。Clangはモジュール化されており、コンパイル時にバイナリに組み込まれる
ソースコードモジュールではなく、リンク時に置換可能なライブラリに依存しています。これらのライブラリは十分に文書化されており、新しい開発者が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以降のサポートを目指して開発が進められています。
Android NDKでは、従来GCCが標準でしたが、2012年11月リリースのリビジョンr8cからClangが副選択肢として追加され、2016年10月リリースのリビジョンr13bからはClangが標準となりました。2018年9月リリースのリビジョンr18bではGCCが削除されました。
Microsoft Windowsでは、
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の詳細な情報や開発状況については、以下の資料をご参照ください。
公式ウェブサイト
LLVMdev: New LLVM C front-end: "clang", announcement (11 July 2007)
Tech talk about LLVM future and clang - ウェイバックマシン(2012年5月8日アーカイブ分), Slides
Presentation: Steve Naroff - New LLVM C Front-end, Slides
Presentation: Ted Kremenek - Finding Bugs with the Clang Static Analyzer, Slides
Presentation: Steve Naroff - Clang Internals, Slides
関連項目
静的コード解析
LLVM
Clangは、C/
C++開発において重要な役割を担う
コンパイラフロントエンドとして、今後もその進化が期待されています。