clang
読み:クラン
外語:clang
Low Level Virtual Machine(LLVM)のフロントエンドの一つで、オリジナルのC/C++/Objective-Cコンパイラーである。Cを大文字にClangとも書かれている。
仕様
- 使用途 ‐ コンパイラー
- 初出年 ‐ 2007(平成19)年
- 設計者 ‐ ?
- 開発者 ‐ Apple
- 最新版 ‐ clang 3.7 (2015(平成27)年9月1日)
- 影響関係
- 主要動作環境 ‐ クロスプラットフォーム
- ライセンス ‐ University of Illinois/NCSA Open Source License
- 記述言語 ‐ C++
概要
clangは、LLVMコンパイラーバックエンドのために新規に開発された、C/Objective-C/C++コンパイラーである。
プロジェクトの目標は、次の通りとされている。
- エンドユーザー向け機能
- 高速コンパイル、かつ低メモリー消費
- 表情の診断(Expressive diagnostics)
- GCCとの互換性
- ユーティリティとアプリケーション
- モジュラーライブラリベースのアーキテクチャ
- 多様なクライアントのサポート(リファクタリング、静的解析、コード生成など)
- IDEとの緊密な統合を実現
- LLVM'BSD'ライセンスの採用
- 内部の設計と実装
- 実社会で、生産品質のコンパイラー
- シンプルでハック可能なコードベース
- C、Objective-C、C++、およびObjective-C++を単一のパーサーで統合
- C/C++/Obj-Cやその変種に順応
特徴
性能
clangは、C++14のドラフト仕様にGCCよりも速く対応した、高性能なコンパイラーである。
アプリケーションだけでなく、OSのカーネルもビルドできる。FreeBSDやDragonFly BSDなどのビルドが可能で、実際にFreeBSD 10からはGCCを捨ててclang/llvmを正式採用した。
clangはC/C++/Objective-Cの公式仕様への準拠はもちろん、GCCの拡張機能にも対応している。
Linuxカーネルのように、GCCの拡張機能を多用したプログラムでもかなりの部分までビルドが可能である。GCCより性能のよいclangは、Linuxカーネルのビルドにも適しているため望まれているが、しかしGCC拡張には「汚い」拡張も目立ち、こういった不潔なものはclang/llvm陣営は意地でも対応したくないとしていることから、Linux側を衛生的に清掃しないかぎりは完全対応は不可能である。
clangが対応しないVLAIS
GCCが昔から対応していた可変長配列(VLA=variable length array)は、C99から正式採用された。
しかしGCCには、C99でも採用されなかった拡張がある。GCC拡張では、この可変長配列は構造体内でも宣言することができる。これは構造体内可変長配列(VLAIS=variable length array in structs)と呼ばれている。
具体的には次のような宣言である。
int main()
{
int size = 1;
struct
{
char array[size];
} st;
return 0 ;
}
GCCならもちろんビルドできるが、clang/llvmでは対応する気がない宣言をエラーメッセージに見ることができる。
> clang test.c
test.c:6:14: error: fields must have a constant size: 'variable length array in structure'
extension will never be supported
char array[size];
^
1 error generated.
>
訳すと、「test.c:6:14: エラー: フィールドは一定のサイズでなければならない: '構造体内可変長配列' 拡張機能がサポートされることはない」となる。
そこで、LinuxをLLVMでビルドすることを目指すLLVMLinux Projectでは、clangおよびLinuxカーネル双方に改良の働きかけをしている。
経緯
沿革
バージョン
LLVM 2.7以降、clangのバージョンはLLVMと一致している(新しい順)。
- clang 3.7 ‐ BPFの拡張命令セット(eBPF)サポート (2015(平成27)年9月1日)
- clang 3.6 ‐ C++17対応強化、CのデフォルトをC99からC11に変更 (2015(平成27)年2月27日)
- clang 3.5 ‐ C++17(C++1z)のドラフト仕様への対応を開始 (2014(平成26)年9月4日)
- clang 3.4 ‐ C++14のドラフト(n3797)完全対応 (2013(平成25)年12月23日)
- clang 3.3 ‐ C++11完全対応 (2013(平成25)年6月17日)
- clang 3.2 ‐ C11対応強化、C++11対応強化 (2012(平成24)年12月20日)
- clang 3.1 ‐ C++11対応強化、Objective-C対応強化 (2012(平成24)年5月22日)
- clang 3.0 ‐ C++11対応 (2011(平成23)年12月1日)
- clang 2.9 ‐ C++0x完全対応 (2011(平成23)年4月6日)
- clang 2.8 ‐ C++03のサポート完了 (2010(平成22)年10月)
- clang 2.7 ‐ clang/LLVMのセルフホスティング対応版 (2010(平成22)年4月)
- clang 1.0 ‐ 初版 (2009(平成21)年10月)
clang 3.7
- OpenMP 3.1のフルサポート
- C++用JIT APIであるORCを導入
- Windows向けに、Visual C++のキーワードである __try、__except、__finally などに対応
clang 3.6
- __has_attribute組み込みマクロは、複数の属性構文にまたがる属性のクエリーにはもはや対応せず(GNU、C++11、__declspec、など)、GNUスタイルの属性のクエリーのみとなる。__has_cpp_attribute と __has_declspec_attribute の追加により、属性構文のクエリーをより正確に把握できるようになる
- clang-formatは、Javaコードに対応した
- Windows向けに、Visual C++のキーワードである __super や __vectorcall などに対応
- Cのデフォルトを、GNU拡張付きC99から、GNU拡張付きC11に変更
clang 3.5
- C++17(C++1z)のドラフト仕様への試験的な対応を開始
- GCC 4.7 abi への対応
- OpenMP 3.1対応
clang 3.4
clang 3.3
clang 3.1
clang 3.0
- C++の機能に対応
- 非staticデータメンバーの初期化子
- テンプレートエイリアス
- 空ポインター定数nullptr
- アライメント
- デリゲートコンストラクター
- explicit変換演算子
- Unicode文字列直定数
- raw文字列直定数
- 標準レイアウト
- 範囲指定のfor
- 明示的な仮想関数のオーバーライド
- ムーブコンストラクターで[noexcept]をthrowする機能
- moveスペシャルメンバー関数の定義
- コンパイラーが自動生成する関数(コンストラクター、デストラクタ-等)にdefault/delete指定を可能とする
再検索