Clang

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
LLVM > Clang
Clang
作者 Chris Lattner 他
開発元 アップル, Google
最新版 3.4 / 2014年01月6日(6か月前) (2014-01-06
プログラミング言語 C++
対応OS Unix系, Cygwin, MinGW
プラットフォーム クロスプラットフォーム
サポート状況 開発中
種別 コンパイラ
ライセンス University of Illinois/NCSA Open Source License[1]
公式サイト clang.llvm.org
テンプレートを表示

Clang (play /ˈklæŋ/:クランのように発音 [2] )は、プログラミング言語 CC++Objective-CObjective-C++ 向けのコンパイラフロントエンドである。バックエンドとして LLVM を使用しており、LLVM 2.6以降は LLVM の一部としてリリースされている。

プロジェクトの目標は、GNUコンパイラコレクション (GCC) を置き換えることのできるコンパイラを提供することである。開発は完全にオープンソースの方法で進められており、アップルGoogleといった大企業も参加・資金提供している。ソースコードは、University of Illinois/NCSA License英語版ライセンスで提供されている。

Mac OS XおよびiOS(ともにXcodeの付属として)、ならびにFreeBSDにおいて標準のコンパイラとして採用されている。

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 を多用しているため性能を向上させることに興味を抱いていたが、通常の GCC の開発からはほとんど進展が見られず、Objective-C の性能を上げるためには、 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) 以降の一部である。

Android NDK では、デフォルトは gcc ではあるものの、2012年11月の Revision 8c より、Clang もコンパイラの一つとして提供している。

概要[編集]

ClangはCをターゲットとした新しいコンパイラで、LLVM上で動作することを意図して設計されている[5]。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の二倍以上の速度でコンパイルできる[8]

GCCを用いた開発には困難な点もあるが、その理由については開発者が十分調査を行ってきた。その結果ClangチームはGCCの問題を避け、より柔軟なシステムを構築できるようになった。Clangはモジュラー化されており、コンパイル時にバイナリに組み込まれてしまうソースコードモジュールではなく、ほぼリンク時に置換できるライブラリだけに依存しており、しかもよく文書化されている。新しい開発者がClangを使いこなし、開発に加わるスピードを加速させる。ライブラリは実行時に交換可能な複数のバージョンで提供される場合もあり、例えばパーサーは、コンパイルの性能測定の機能を持ったバージョンもある。

Clang は名前が示すとおりCやCに似た言語の専用のコンパイラであり、C、C++、Objective-C、Objective-C++ 以外の言語のフロントエンドは提供しない。FortranAdaGo については LLVM は GCC (dragonegg) に依存し続ける。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本体(LLVM 2.6)と同時にリリースされた。
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年4月27日 Clang 2.7リリース[20]
2010年5月20日 最新バージョンのClangでBoost C++ Libraryのビルドに成功し、ほぼ全てのテストに合格した。[21]
2010年6月9日 Clang/LLVMがFreeBSDのソースコードツリーに取り込まれた。最初は、デフォルトのコンパイラにはならないが、外部コンパイラによるビルドをサポートした上で、デフォルトのシステムコンパイラになる予定である。[22]
2010年10月5日 Clang 2.8リリース[23]
2010年10月25日 Clang/LLVMがLinuxカーネルをコンパイルし動作したと発表された。[24]
2011年1月 C++0xドラフトのサポート準備が完了した。また、開発バージョンでドラフトの新しい機能をサポートした。[25][26]
2011年2月10日 HotSpot Java仮想マシンをコンパイルし、動作させることが出来た。[27]
2011年4月6日 Clang 2.9リリース[28]
2011年12月1日 Clang 3.0リリース[29]C11 の実装の開始。
2012年2月28日 Clang 3.0によってDebianアーカイブの91%以上をリビルドすることが出来た。[30]
2012年5月12日 FreeBSD Quarterly Status Reportにおいて、FreeBSDはGCCをClang/LLVMで置き換えると発表した。[31]
2012年5月22日 Clang 3.1リリース。100%互換ではないものの C++11 規格に従う機能の大半を実装した[32]
2012年12月1日 Clang 3.2リリース。エラーメッセージの改善、C11, C++11 の対応の改善など[33]
2013年4月 安定版としては未リリースだが、C++11規格に従う機能をすべて実装完了した。[34]
2013年6月17日 Clang 3.3リリース。識別子でのUnicode文字対応、C++11 の対応改善など[35]
2014年1月6日 Clang 3.4リリース。C++14 の現時点でドラフトに書いてある部分を実装。[36]

参考文献[編集]

  1. ^ LLVM Release License
  2. ^ Christopher, Eric (2008年7月3日). “simply wonder pronunciation of Clang”. LLVMdev mailing list.. http://lists.cs.uiuc.edu/pipermail/llvmdev/2008-July/015624.html 2008年7月9日閲覧。 
  3. ^ Clang Static Analyzer”. LLVM. 2009年9月3日閲覧。
  4. ^ Adam Treat, mkspecs and patches for LLVM compile of Qt4
  5. ^ a b c Clang team, clang: a C language family frontend for LLVM
  6. ^ Kenneth Zadeck, LLVM/GCC Integration Proposal, 19 Nov 2005, GCC development mailing list
  7. ^ Chris Lattner, LLVM for OpenGL and other stuff, Apple Computer, May 2007
  8. ^ Clang - Features and Goals: Fast compiles and Low Memory Use”. 2007年10月閲覧。
  9. ^ https://github.com/llvm-mirror/clang/commit/e6e68b53778bb5a15c10a73a5bf18d8ab73f75e3, GitHub 「C++11 support is now feature-complete.」
  10. ^ http://cpplover.blogspot.jp/2013/04/clangc11c11.html, 本の虫「2013-04-20 ClangがC++11を完全実装! 繰り返す、C++11を完全実装」
  11. ^ Roman Divacky, [ANNOUNCE] clang/LLVM can compile booting FreeBSD kernel on i386/amd64
  12. ^ http://wiki.freebsd.org/BuildingFreeBSDWithClang
  13. ^ Alex Hornung, "llvm/clang once more
  14. ^ http://www.dragonflybsd.org/docs/developer/clang/
  15. ^ Bug 4068 – [META] Compiling the Linux kernel with clang
  16. ^ Brad Davis, "FreeBSD Status Reports January - March, 2009"
  17. ^ LLVM Blog, Clang can compile LLVM and Clang
  18. ^ LLVM Project Blog, "Clang Successfully Self-Hosts!"
  19. ^ HelenOS mainline changeset head,294
  20. ^ LLVM 2.7 Release Notes
  21. ^ Clang++ Builds Boost!
  22. ^ Roman Divacky "Import the build makefiles for clang/LLVM"
  23. ^ LLVM 2.8 Release Notes
  24. ^ [ANNOUNCE] Clang builds a working Linux Kernel (Boots to RL5 with SMP, networking and X, self hosts)
  25. ^ New C++0x feature support in Clang
  26. ^ C++ and C++'0x Support in Clang
  27. ^ Compiling the HotSpot VM with Clang
  28. ^ LLVM 2.9 Release Notes
  29. ^ Clang 3.0 Release Notes
  30. ^ Rebuild of the Debian archive with clang
  31. ^ FreeBSD Quarterly Status Report January-March, 2012
  32. ^ Clang 3.1 Release Notes
  33. ^ Clang 3.2 Release Notes
  34. ^ GitHub 「C++11 support is now feature-complete.」
  35. ^ Clang 3.3 Release Notes
  36. ^ Clang 3.4 Release Notes

関連項目[編集]

外部リンク[編集]