Clang

LLVM > Clang 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をベースに独自の拡張機能を追加した派生コンパイラとして生まれ変わっている。 ^ https://www.llvm.org/releases/2.1/docs/ReleaseNotes.html ^ "Release LLVM 19.1.1 · llvm/llvm-project"; 閲覧日: 2024年10月3日; 作品または名前の言語: 英語. ^ LLVM Release License ^ a b “LICENSE.TXT”. llvm.org. 2019年9月24日閲覧。 ^ Christopher, Eric (3 July 2008). "simply wonder pronunciation of Clang". LLVMdev (Mailing list). 2008年7月9日閲覧。 ^ “OpenMP Support”. The LLVM Project Blog. 2016年3月28日閲覧。 ^ OpenCL Support — Clang git documentation ^ CUDA LLVM Compiler | NVIDIA Developer ^ “C++ Heterogeneous-Compute Interface for Portability”. 2020年2月18日閲覧。 ^ “Clang Language Extensions”. 2017年11月8日閲覧。 “In addition to the language extensions listed here, Clang aims to support a broad range of GCC extensions.” ^ Clang - Features and Goals: GCC Compatibility, (15 April 2013), https://clang.llvm.org/features.html#gcccompat  ^ “Clang Static Analyzer”. LLVM. 2009年9月3日閲覧。 ^ Adam Treat, mkspecs and patches for LLVM compile of Qt4 ^ Kenneth Zadeck - Re: LLVM/GCC Integration Proposal ^ a b Clang team, clang: a C language family frontend for LLVM ^ “Clang - Features and Goals: Fast compiles and Low Memory Use”. October 2007閲覧。 ^ FLANG: NVIDIA Brings Fortran To LLVM ^ Clang - C Programming Language Status ^ Clang - C++ Programming Language Status ^ NDK Revision History ^ LLVM Download Page ^ Visual Studio プロジェクトでの Clang/LLVM のサポート | Microsoft Docs ^ Hans Wennborg, Google (2014年4月). “clang-cl / What it is, how it works, and how to use it (Euro-LLVM 2014)” (PDF). 2021年5月18日閲覧。 ^ Opening HLSL Planning - DirectX Developer Blog ^ HLSL Support — Clang git documentation ^ インテル® C/C++ コンパイラーが LLVM への対応を完了 | iSUS ^ Clang 拡張 C++ コンパイラ - RAD Studio ^ Roman Divacky, [ANNOUNCE] clang/LLVM can compile booting FreeBSD kernel on i386/amd64 ^ http://wiki.freebsd.org/BuildingFreeBSDWithClang ^ Alex Hornung, "llvm/clang once more ^ http://www.dragonflybsd.org/docs/developer/clang/ ^ Bug 4068 – [META] Compiling the Linux kernel with clang ^ Brad Davis, "FreeBSD Status Reports January - March, 2009" ^ LLVM Blog, Clang can compile LLVM and Clang ^ LLVM Project Blog, "Clang Successfully Self-Hosts!" ^ HelenOS mainline changeset head,294 ^ LLVM 2.7 Release Notes ^ Clang++ Builds Boost! ^ Roman Divacky "Import the build makefiles for clang/LLVM" ^ LLVM 2.8 Release Notes ^ [ANNOUNCE] Clang builds a working Linux Kernel (Boots to RL5 with SMP, networking and X, self hosts) ^ New C++0x feature support in Clang ^ C++ and C++'0x Support in Clang ^ Compiling the HotSpot VM with Clang ^ LLVM 2.9 Release Notes ^ Clang 3.0 Release Notes ^ Rebuild of the Debian archive with clang ^ FreeBSD Quarterly Status Report January-March, 2012 ^ Clang 3.1 Release Notes ^ Clang 3.2 Release Notes ^ GitHub 「C++11 support is now feature-complete.」 ^ Clang 3.3 Release Notes ^ Clang 3.4 Release Notes ^ Clang 3.5.0 Release Notes ^ Clang 3.6.0 Release Notes ^ Clang 3.7.0 Release Notes ^ Clang 3.8.0 Release Notes ^ Clang 3.9.0 Release Notes ^ Clang 4.0.0 Release Notes ^ Clang 5.0.0 Release Notes ^ Clang 6.0.0 Release Notes ^ Clang 7.0.0 Release Notes ^ Clang 8.0.0 Release Notes ^ Clang 9.0.0 Release Notes ^ Clang 10.0.0 Release Notes ^ Clang 11.0.0 Release Notes ^ Hankala, Visa (21 December 2020). "Make clang the default compiler on loongson" (Mailing list). 2021年8月8日閲覧。 ^ released ^ “Clang 13.0.0 Release Notes — Clang 13 documentation”. releases.llvm.org. 2022年4月19日閲覧。 ^ “Clang 14.0.0 Release Notes — Clang 14.0.0 documentation”. releases.llvm.org. 2022年4月19日閲覧。 ^ “Clang 15.0.0 Release Notes — Clang 15.0.0 documentation”. releases.llvm.org. 2022年10月24日閲覧。 ポータル FLOSS 静的コード解析 LLVM 公式ウェブサイト 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