clang
読み:クラン
外語:clang

 Low Level Virtual Machine(LLVM)のフロントエンドの一つで、オリジナルのC/C++/Objective-Cコンパイラーである。Cを大文字にClangとも書かれている。
目次

仕様

概要
 clangは、LLVMコンパイラーバックエンドのために新規に開発された、C/Objective-C/C++コンパイラーである。
 プロジェクトの目標は、次の通りとされている。

特徴

性能
 clangは、C++14のドラフト仕様にGCCよりも速く対応した、高性能なコンパイラーである。
 アプリケーションだけでなく、OSのカーネルもビルドできる。FreeBSDDragonFly 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

clang 3.6

clang 3.5

clang 3.4

clang 3.3

clang 3.1

clang 3.0

再検索