Clang
| 作者 | Chris Lattner 他 |
|---|---|
| 開発元 | アップル 他 |
| 最新版 | 3.2 / 2012年12月20日 |
| プログラミング言語 | C++ |
| 対応OS | Unix系 |
| プラットフォーム | クロスプラットフォーム |
| サポート状況 | 開発中 |
| 種別 | コンパイラ |
| ライセンス | University of Illinois/NCSA Open Source License[1] |
| 公式サイト | http://clang.llvm.org/ |
Clang (
/ˈklæŋ/:クランのように発音 [2] )は、プログラミング言語C、C++、Objective-C、Objective-C++向けのコンパイラフロントエンドである。バックエンドとしてLow Level Virtual Machine (LLVM) を使用しており、LLVM 2.6以降はLLVMの一部としてリリースされている。
プロジェクトの目標は、GNUコンパイラコレクション (GCC) を置き換えることのできるコンパイラを提供することである。開発は完全にオープンソースな方法で進められており、Googleやアップルといった大企業も参加・資金提供している。ソースコードは、University of Illinois/NCSA Licenseライセンスで提供されている。
Clang プロジェクトではコンパイラのフロントエンドに加えて Clang 静的コード解析ツールも開発している[3]。
目次 |
背景 [編集]
2005年初頭、アップルは LLVM システムを自社で開発している様々なシステム内で利用するための作業を開始した[4]。LLVM は GCC のツールチェインの低レベルの部分を置き換えることが可能であり、GCC の3番地コードによる中間表現よりも積極的な最適化が可能である。LLVM では GCC 同様にコードを静的にコンパイルすることも、Java のようにJITコンパイルを用いて後で中間言語から機械語に変換することもできる。
LLVM は元々イリノイ大学アーバナ・シャンペーン校で開発され、BSDライクなライセンスでリリースされていた[5]。したがって Clang は再配布に制約がほとんどないが、GCC は GPL でライセンスされており、開発者にコードを GPL で配布してもらう必要があった。
当初 LLVM は GCC ツールチェーンの一部となることを目標にしていたが、最近では GCC の他の部分を置き換えることにも興味の対象を置いている。GCC は巨大なシステムで開発がしづらい面もあり、長年の GCC の開発者の一人は「カバにダンスを踊らせるのはあまり楽しいことではない」と述べている[6]。
アップルは Objective-C (ObjC) を多用しているため性能を向上させることに興味を抱いていたが、通常の GCC の開発からはほとんど進展が見られず、ObjC の性能を上げるためには、 GCC をアップル版に分岐させるか、新しいコンパイラを採用するかを選択することになった。そこで、アップルはC99、Objective-CとC++をサポートするコンパイラを1から作成した。このClangプロジェクトは2007年7月にオープンソース化された。
アップルは LLVM を多数の商用システムに使用している。現在最も目に触れるのは Mac OS X 用の OpenGL コードコンパイラであり、OpenGL をサポートしないGPU用にOpenGL の呼び出しをより基礎的なコードに変換する。これにより、アップルはIntel GMAチップセットを搭載したコンピュータ上でも、 OpenGL の API 全体をサポートできるようになった[7] 。もっと強力なチップセット用にはコードは使用するハードウェアの機能を用いるようコンパイルされるが、GMA を用いたシステムでは同じ OpenGL のコードを同じように動作するソフトウェアのサブルーチンに置き換える。LLVM はXcode 3.1 (iOS SDK)以降の一部である。
概要 [編集]
Clang は C をターゲットとした新しいコンパイラで、LLVM 上で動作することを意図して設計されている[5]。Clang と LLVM の組み合わせによって、ツールチェインの大半の機能を提供し、GCC スタック全体の置き換えが可能になる。Clang の主要な目標の一つは、統合開発環境の GUI と密接に連携したよりよい増分コンパイルのサポートである。GCC は古典的なコンパイル-リンク-デバッグのサイクルで用いるよう設計されており、増分コンパイルと実行中のコンパイルをサポートしているものの、他のツールと統合して使うことは簡単ではない。たとえば GCC のコンパイルにはコンパイル全体の中で重要な "fold" という段階があるが、これはコードツリーを元のソースコードと大きく異なる形に変換してしまう。fold 中、あるいはその後でエラーが発見されると、元のソースの一箇所に対応付けるのは難しい。さらに GCC スタックを IDE で使用する場合、コードの色付表示や自動補完などの機能のために、コードをインデックス化する別のツールが必要になる。
Clang は、コンパイル中に GCC よりも多くの情報を取得し、得られた情報を元のコードと同じ形態で保存する。また Clang によるエラーの報告は、より詳細で具体的であり IDE などが表示しやすいようプログラムで利用できる書式になっている。コンパイラは動作させたままで、ソースコード 索引付け、文法のチェックなどのRADに関係したその他の機能を実行する。またコードは常にパース可能なテキストであるので、Clang が出力する解析木は自動的なリファクタリングをサポートするのに適している。
GCC は一回のコンパイルにはマルチスレッドをサポートしておらず、一回のコンパイル単位でマルチプロセッサのハードウェアの恩恵を受けられない。一方 Clang はメモリ使用量の削減と速度の向上を目指して最初からマルチスレッド対応で設計されている。2007年10月の時点で、Clang はCarbon のライブラリを、メモリとディスクを1/5程度しか使用せずに、GCC の二倍以上の速度でコンパイルできる[8]。
GCC を用いた開発には困難な点もあるが、その理由については開発者が十分調査を行ってきた。その結果 Clang チームは GCC の問題を避け、より柔軟なシステムを構築できるようになった。Clang はモジュラー化されており、コンパイル時にバイナリに組み込まれてしまうソースコードモジュールではなく、ほぼリンク時に置換できるライブラリだけに依存しており、しかもよく文書化されている。新しい開発者が Clang を使いこなし、開発に加わるスピードを加速させる。ライブラリは実行時に交換可能な複数のバージョンで提供される場合もあり、例えばパーサーは、コンパイルの性能測定の機能を持ったバージョンもある。
Clang は名前が示すとおり C と Cライクな言語専用のコンパイラであり、C、C++、Objective C 以外の言語のフロントエンドは提供しない。Java、FORTRAN、Ada など他の言語については LLVM は GCC に依存し続ける。Clang は必要に応じてツールチェイン全体には影響を与えず GCC と交換することができる[要出典]。
現在の状況 [編集]
プロジェクトは現在も活発に開発中だが、2012年5月の時点で、C 用のコード生成部分は完了しており、Objective-C のコード生成部分も完了している。またC++11のサポートが強化され、2013年4月にC++11規格に従う機能がすべて実装された[9][10]。
歴史 [編集]
| 日付 | できごと |
|---|---|
| 2009年2月25日 | Clang/LLVM が、動作する FreeBSD カーネルをコンパイルできたことが発表された[11][12]。 |
| 2009年3月16日 | Clang/LLVM が、動作する DragonFly BSD カーネルをコンパイルできたことが発表された[13][14]。しかし、Linux カーネルのコンパイルには更なる作業が必要である[15]。 |
| 2009年5月9日 | FreeBSD Status Report において、FreeBSD プロジェクトが GCC を Clang で置き換えられるかどうか調査していることが報告された[16]。 |
| 2009年10月23日 | Clang 1.0 が、初めて LLVM 本体と同時にリリースされた。 |
| 2009年12月 | C および Objective-C のコード生成能力は製品レベルに達した。しかし、C++、Objective-C++ のサポートは不完全であった。Clang C++ は GCC 4.2 の libstdc++ をパースし、小規模なプログラムのコードを生成でき[5]、自分自身をコンパイル可能となった[17]。 |
| 2010年2月5日 | LLVM Project Blog において、Clang がセルフホスティングなコンパイラとなったことが発表された[18]。 |
| 2010年2月20日 | HelenOSのソースコードを修正することでClangでコンパイルに成功した。また、IA-32環境のカーネルとユーザランドの回帰テストに全て合格した。[19] |
| 2010年5月20日 | 最新バージョンのClangでBoost C++ Libraryのビルドに成功し、ほぼ全てのテストに合格した。[20] |
| 2010年6月9日 | Clang/LLVM が FreeBSD のソースコードツリーに取り込まれた。最初は、デフォルトのコンパイラにはならないが、外部コンパイラによるビルドをサポートした上で、デフォルトのシステムコンパイラになる予定である。[21] |
| 2010年10月25日 | Clang/LLVM がLinuxカーネルをコンパイルし動作したと発表された。[22] |
| 2011年1月 | C++0xドラフトのサポート準備が完了した。また、開発バージョンでドラフトの新しい機能をサポートした。[23][24] |
| 2011年2月10日 | HotSpot Java仮想マシンをコンパイルし、動作させることが出来た。[25] |
| 2012年2月28日 | Clang 3.0によってDebianアーカイブの91%以上をリビルドすることが出来た。[26] |
| 2012年5月12日 | FreeBSD Quarterly Status Reportにおいて、FreeBSDはGCCをClang/LLVMで置き換えると発表した。[27] |
| 2013年4月 | C++11規格に従う機能をすべて実装完了した。[28] |
参考文献 [編集]
- ^ LLVM Release License
- ^ Christopher, Eric (2008年7月3日). “simply wonder pronunciation of Clang”. LLVMdev mailing list. 2008年7月9日閲覧。
- ^ “Clang Static Analyzer”. LLVM. 2009年9月3日閲覧。
- ^ Adam Treat, mkspecs and patches for LLVM compile of Qt4
- ^ a b c Clang team, clang: a C language family frontend for LLVM
- ^ Kenneth Zadeck, LLVM/GCC Integration Proposal, 19 Nov 2005, GCC development mailing list
- ^ Chris Lattner, LLVM for OpenGL and other stuff, Apple Computer, May 2007
- ^ “Clang - Features and Goals: Fast compiles and Low Memory Use”. 2007年10月閲覧。
- ^ https://github.com/llvm-mirror/clang/commit/e6e68b53778bb5a15c10a73a5bf18d8ab73f75e3, GitHub 「C++11 support is now feature-complete.」
- ^ http://cpplover.blogspot.jp/2013/04/clangc11c11.html, 本の虫「2013-04-20 ClangがC++11を完全実装! 繰り返す、C++11を完全実装」
- ^ 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
- ^ Clang++ Builds Boost!
- ^ Roman Divacky "Import the build makefiles for clang/LLVM"
- ^ [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
- ^ Rebuild of the Debian archive with clang
- ^ FreeBSD Quarterly Status Report January-March, 2012
- ^ GitHub 「C++11 support is now feature-complete.」
関連項目 [編集]
外部リンク [編集]
- Clang: a C language family frontend for LLVM
- LLVMdev: New LLVM C front-end: "clang", announcement (11 July 2007)
- Tech talk about LLVM future and clang, 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