コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「Clang」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
Windowsに関して追記。
Cewbot (会話 | 投稿記録)
20行目: 20行目:
'''Clang''' ({{IPAc-en|ˈ|k|l|æ|ŋ}}:クランのように発音<ref>{{Cite mailing list |url=http://lists.cs.uiuc.edu/pipermail/llvmdev/2008-July/015624.html |title=simply wonder pronunciation of Clang |date=2008-07-03 |accessdate=2008-07-09 |mailinglist=LLVMdev |last=Christopher |first=Eric |authorlink= }}</ref>) は、[[プログラミング言語]] [[C言語|C]]、[[C++]]、[[Objective-C]]、[[Objective-C#Objective-C++|Objective-C++]] 向けの[[コンパイラ]][[フロントエンド]]である。バックエンドとして [[LLVM]] を使用しており、LLVM 2.6以降は LLVM の一部としてリリースされている。
'''Clang''' ({{IPAc-en|ˈ|k|l|æ|ŋ}}:クランのように発音<ref>{{Cite mailing list |url=http://lists.cs.uiuc.edu/pipermail/llvmdev/2008-July/015624.html |title=simply wonder pronunciation of Clang |date=2008-07-03 |accessdate=2008-07-09 |mailinglist=LLVMdev |last=Christopher |first=Eric |authorlink= }}</ref>) は、[[プログラミング言語]] [[C言語|C]]、[[C++]]、[[Objective-C]]、[[Objective-C#Objective-C++|Objective-C++]] 向けの[[コンパイラ]][[フロントエンド]]である。バックエンドとして [[LLVM]] を使用しており、LLVM 2.6以降は LLVM の一部としてリリースされている。


プロジェクトの目標は、[[GNUコンパイラコレクション]] (GCC) を置き換えることのできるコンパイラを提供することである。開発は完全にオープンソースの方法で進められており、[[アップル (企業)|アップル]]や[[Google]]といった大企業も参加・資金提供している。ソースコードは、[[イリノイ大学/NCSAオープンソースライセンス]]で提供されている。バージョン9.0.0からはライセンスがLLVM例外付き[[Apache License 2.0]]に変更された<ref name="license_9.0.0" />。
プロジェクトの目標は、[[GNUコンパイラコレクション]] (GCC) を置き換えることのできるコンパイラを提供することである。開発は完全にオープンソースの方法で進められており、[[Apple]]や[[Google]]といった大企業も参加・資金提供している。ソースコードは、[[イリノイ大学/NCSAオープンソースライセンス]]で提供されている。バージョン9.0.0からはライセンスがLLVM例外付き[[Apache License 2.0]]に変更された<ref name="license_9.0.0" />。


[[macOS]]および[[iOS (アップル)|iOS]](ともに[[Xcode]]の付属として)、ならびに[[FreeBSD]]において標準のコンパイラとして採用されている。
[[macOS]]および[[iOS (アップル)|iOS]](ともに[[Xcode]]の付属として)、ならびに[[FreeBSD]]において標準のコンパイラとして採用されている。

2021年5月20日 (木) 12:10時点における版

LLVM > Clang
Clang
作者 Chris Lattner
開発元 LLVM Developer Group
初版 2007年9月26日 (17年前) (2007-09-26)[1]
最新版
19.1.6[2] ウィキデータを編集 - 2024年12月17日 (5日前)
リポジトリ ウィキデータを編集
プログラミング
言語
C++
対応OS Unix系, Microsoft Windows
プラットフォーム クロスプラットフォーム
サポート状況 開発中
種別 コンパイラ
ライセンス イリノイ大学/NCSAオープンソースライセンス[3]
LLVM例外付きApache License 2.0 (バージョン9.0.0以降[4])
公式サイト clang.llvm.org
テンプレートを表示

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

プロジェクトの目標は、GNUコンパイラコレクション (GCC) を置き換えることのできるコンパイラを提供することである。開発は完全にオープンソースの方法で進められており、AppleGoogleといった大企業も参加・資金提供している。ソースコードは、イリノイ大学/NCSAオープンソースライセンスで提供されている。バージョン9.0.0からはライセンスがLLVM例外付きApache License 2.0に変更された[4]

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

Clang プロジェクトではコンパイラのフロントエンドに加えてClang静的コード解析ツールも開発している[6]

背景

2005年初頭、アップルはLLVMシステムを自社で開発している様々なシステム内で利用するための作業を開始した[7]。アップルはObjective-Cを多用しているため、GCCの性能向上に興味を抱いていたがほとんど進展が見られず、Objective-Cの性能を上げるためにGCCをアップル版に分岐させるか、新しいコンパイラを採用するかの選択をせまられていた。そこで、アップルはC99、Objective-CおよびC++をサポートするコンパイラを1から作成した。このClangプロジェクトは2007年7月にオープンソース化された。

GCCは巨大なシステムで開発がしづらい面もあり、長年のGCCの開発者の一人は「カバにダンスを踊らせるのはあまり楽しいことではない」と述べている[8]

概要

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

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

Clang は名前が示すとおりCやCに似た言語の専用のコンパイラであり、C、C++、Objective-C、Objective-C++、OpenCLCUDA以外の言語のフロントエンドは提供しない。FortranAdaGo については LLVM は GCC (dragonegg) に依存し続ける。Clang は必要に応じてツールチェイン全体には影響を与えず GCC と交換することができる[要出典]。非公式のサブプロジェクトとしてNVIDIAが開発した Flang により Fortran サポートが追加された[11]

現在の状況

プロジェクトは2018年現在、活発に開発が行われている。これまでにC11、C++17までの標準規格への準拠を完了し、引き続きC++2aのサポートを目指し開発が行われている。

Googleが提供するAndroid向けのC/C++言語開発キットであるAndroid NDK(Native Development Kit)では、従来GCCが標準であったが、2012年11月リリースのリビジョンr8cからClangが副選択肢として追加され、2016年10月リリースのリビジョンr13bからはClangが標準となった[12]。2018年9月リリースのリビジョンr18bにてGCCは削除された。

Microsoft Windows上でClangを使用するには、CygwinMinGWといったPOSIX互換のサブシステムを利用する方法のほか、Windows用LLVMバイナリを利用する方法もある[13]Visual Studioはバージョン2019 (16.2) 以降で、Windows/Linux用バイナリを生成するMSBuildプロジェクトのC/C++コンパイラにClangを使用できるようになった[14]MSVC (cl.exe) 互換のclang-clもある[15]

歴史

日付 できごと
2009年2月25日 Clang/LLVMが、動作するFreeBSDカーネルをコンパイルできたことが発表された[16][17]
2009年3月16日 Clang/LLVMが、動作するDragonFly BSDカーネルをコンパイルできたことが発表された[18][19]。しかし、Linuxカーネルのコンパイルには更なる作業が必要である[20]
2009年5月9日 FreeBSD Status Reportにおいて、FreeBSDプロジェクトがGCCをClangで置き換えられるかどうか調査していることが報告された[21]
2009年10月23日 Clang 1.0が、初めてLLVM本体 (LLVM 2.6) と同時にリリース。
2009年12月 CおよびObjective-Cのコード生成能力は製品レベルに達した。しかし、C++、Objective-C++のサポートは不完全であった。Clang C++はGCC 4.2のlibstdc++をパースし、小規模なプログラムのコードを生成でき[9]、自分自身をコンパイル可能となった[22]
2010年2月5日 LLVM Project Blogにおいて、Clangがセルフホスティングのコンパイラとなったことが発表された[23]
2010年2月20日 HelenOSのソースコードを修正することでClangでコンパイルに成功した。また、IA-32環境のカーネルとユーザランドの回帰テストに全て合格した。[24]
2010年4月27日 Clang 2.7リリース。CIndex APIとPythonバインディングのサポート。[25]
2010年5月20日 最新バージョンのClangでBoost C++ライブラリのビルドに成功し、ほぼ全てのテストに合格した。[26]
2010年6月9日 Clang/LLVMがFreeBSDのソースコードツリーに取り込まれた。最初は、デフォルトのコンパイラにはならないが、外部コンパイラによるビルドをサポートした上で、デフォルトのシステムコンパイラになる予定である。[27]
2010年10月5日 Clang 2.8リリース。C++98、C++03の機能の実装完了。Objective-C++のサポート。[28]
2010年10月25日 Clang/LLVMがLinuxカーネルをコンパイルし動作したと発表された。[29]
2011年1月 C++0xドラフトのサポート準備が完了した。また、開発バージョンでドラフトの新しい機能をサポート。[30][31]
2011年2月10日 HotSpot Java仮想マシンをコンパイルし、動作させることが出来た。[32]
2011年4月6日 Clang 2.9リリース。C11 の機能を一部サポート。[33]
2011年12月1日 Clang 3.0リリース。GCC互換のコマンドラインドライバを改善。[34]
2012年2月28日 Clang 3.0によってDebianアーカイブの91%以上をリビルドすることが出来た。[35]
2012年5月12日 FreeBSD Quarterly Status Reportにおいて、FreeBSDはGCCをClang/LLVMで置き換えると発表した。[36]
2012年5月22日 Clang 3.1リリース。100%互換ではないものの C++11 規格に従う機能の大半を実装。[37]
2012年12月1日 Clang 3.2リリース。エラーメッセージの改善、C11, C++11 の対応の改善。[38]
2013年4月 安定版としては未リリースだが、C++11規格に従う機能をすべて実装を完了。[39]
2013年6月17日 Clang 3.3リリース。識別子でのUnicode文字対応、C++11 の対応改善。[40]
2014年1月6日 Clang 3.4リリース。C++14 の現時点でドラフトに書いてある部分を実装。[41]
2014年9月4日 Clang 3.5リリース。C++17の機能を実験的にサポート。[42]
2015年2月27日 Clang 3.6リリース。C言語のデフォルトモードをC99からC11に変更。[43]
2015年9月1日 Clang 3.7リリース。OpenMP 3.1のサポート。OpenMP 4.0の一部サポート。[44]
2016年3月8日 Clang 3.8リリース。CUDAの実験的サポート。OpenMP 4.0/4.5、OpenCL 2.0の一部サポート。[45]
2016年9月2日 Clang 3.9リリース。OpenCL 2.0のサポート。オフロード機能を除くOpenMP 3.1およびOpenMP 4.0/4.5をサポート。[46]
2017年3月13日 Clang 4.0.0 リリース。ThinLTOの改善。[47]
2017年9月7日 Clang 5.0.0 リリース。C++17機能の実装完了。[48]
2018年3月8日 Clang 6.0.0 リリース。Spectre対策のためにretpolinesをサポート。C++のデフォルトモードをC++98からC++14に変更。C++2a機能の一部サポート。[49]
2018年9月19日 Clang 7.0.0 リリース。DWARFv5の実験的サポート。[50]
2019年3月20日 Clang 8.0.0 リリース。自動変数の初期化オプション。プロファイルの再マッピングファイルの利用をサポート。OpenMP 5.0の一部サポート。[51]
2019年9月19日 Clang 9.0.0 リリース。OpenCL向けのC++機能の実験的サポート。GCCのインラインアセンブラにおける独自拡張asm gotoをサポートしx64向けLinuxカーネルなどのビルドが可能になった。[52]
2020年3月24日 Clang 10.0.0 リリース。C++2aのコンセプト (Concepts) をサポート。Windows Control Flow Guard (CFG) に対応[53]
2020年10月12日 Clang 11.0.0 リリース。C言語のデフォルトモードをC11からC17に変更。[54]

参考文献

  1. ^ https://www.llvm.org/releases/2.1/docs/ReleaseNotes.html
  2. ^ "LLVM 19.1.6 Released!"; 作品または名前の言語: 英語; 出版日: 2024年12月17日; 閲覧日: 2024年12月18日.
  3. ^ LLVM Release License
  4. ^ a b LICENSE.TXT”. llvm.org. 2019年9月24日閲覧。
  5. ^ Christopher, Eric (3 July 2008). "simply wonder pronunciation of Clang". LLVMdev (Mailing list). 2008年7月9日閲覧
  6. ^ Clang Static Analyzer”. LLVM. 2009年9月3日閲覧。
  7. ^ Adam Treat, mkspecs and patches for LLVM compile of Qt4
  8. ^ Kenneth Zadeck, LLVM/GCC Integration Proposal, 19 Nov 2005, GCC development mailing list
  9. ^ a b Clang team, clang: a C language family frontend for LLVM
  10. ^ Clang - Features and Goals: Fast compiles and Low Memory Use”. October 2007閲覧。
  11. ^ FLANG: NVIDIA Brings Fortran To LLVM
  12. ^ NDK Revision History
  13. ^ LLVM Download Page
  14. ^ Visual Studio プロジェクトでの Clang/LLVM のサポート | Microsoft Docs
  15. ^ 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日閲覧。
  16. ^ Roman Divacky, [ANNOUNCE] clang/LLVM can compile booting FreeBSD kernel on i386/amd64
  17. ^ http://wiki.freebsd.org/BuildingFreeBSDWithClang
  18. ^ Alex Hornung, "llvm/clang once more
  19. ^ http://www.dragonflybsd.org/docs/developer/clang/
  20. ^ Bug 4068 – [META] Compiling the Linux kernel with clang
  21. ^ Brad Davis, "FreeBSD Status Reports January - March, 2009"
  22. ^ LLVM Blog, Clang can compile LLVM and Clang
  23. ^ LLVM Project Blog, "Clang Successfully Self-Hosts!"
  24. ^ HelenOS mainline changeset head,294
  25. ^ LLVM 2.7 Release Notes
  26. ^ Clang++ Builds Boost!
  27. ^ Roman Divacky "Import the build makefiles for clang/LLVM"
  28. ^ LLVM 2.8 Release Notes
  29. ^ [ANNOUNCE] Clang builds a working Linux Kernel (Boots to RL5 with SMP, networking and X, self hosts)
  30. ^ New C++0x feature support in Clang
  31. ^ C++ and C++'0x Support in Clang
  32. ^ Compiling the HotSpot VM with Clang
  33. ^ LLVM 2.9 Release Notes
  34. ^ Clang 3.0 Release Notes
  35. ^ Rebuild of the Debian archive with clang
  36. ^ FreeBSD Quarterly Status Report January-March, 2012
  37. ^ Clang 3.1 Release Notes
  38. ^ Clang 3.2 Release Notes
  39. ^ GitHub 「C++11 support is now feature-complete.」
  40. ^ Clang 3.3 Release Notes
  41. ^ Clang 3.4 Release Notes
  42. ^ Clang 3.5.0 Release Notes
  43. ^ Clang 3.6.0 Release Notes
  44. ^ Clang 3.7.0 Release Notes
  45. ^ Clang 3.8.0 Release Notes
  46. ^ Clang 3.9.0 Release Notes
  47. ^ Clang 4.0.0 Release Notes
  48. ^ Clang 5.0.0 Release Notes
  49. ^ Clang 6.0.0 Release Notes
  50. ^ Clang 7.0.0 Release Notes
  51. ^ Clang 8.0.0 Release Notes
  52. ^ Clang 9.0.0 Release Notes
  53. ^ Clang 10.0.0 Release Notes
  54. ^ Clang 11.0.0 Release Notes

関連項目

外部リンク