Clang

Clang:コンパイラフロントエンドの新たな選択肢



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++OpenCLCUDA以外の言語のフロントエンドは提供しません。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++開発において重要な役割を担うコンパイラフロントエンドとして、今後もその進化が期待されています。

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。