Clang ( / ˈ k l æ ŋ / ) [7]は、プログラミング言語C C ++Objective-CObjective-C++、およびソフトウェアフレームワーク OpenMP [8] OpenCLRenderScriptCUDASYCLHIP [9]用のコンパイラフロントエンドです。GNUコンパイラコレクション(GCC)の代替として機能し、そのコンパイルフラグと非公式の言語拡張のほとんどをサポートしています[10] [11]静的アナライザーといくつかのコード分析ツールが含まれています。 [12]

ClangはLLVM コンパイラバックエンドと連携して動作し、LLVM 2.6以降のサブプロジェクトとなっています。[13] LLVMと同様に、 Apache 2.0ソフトウェアライセンスの下で無料のオープンソースソフトウェアです[5] [6]貢献者には、 AppleIBMMicrosoftGoogleARMSonyIntelAMDなどがあります。

Clang 17は、 C++17までのすべての公開C++標準を完全にサポートし、 C++20のほとんどの機能を実装しC++23標準の初期サポートを備えています。[14] v16.0.0以降、ClangはデフォルトでGNU++17方言を使用してC++をコンパイルします。これには、 C++17標準の機能と準拠したGNU拡張機能が含まれています。[15]

背景

2005年、Apple社はiOS SDKXcode 3.1など、いくつかの商用製品[16]でLLVMを広範に採用しました。OS X用のOpenGLコードコンパイラは、OpenGL呼び出しを、特定の機能をサポートしていないグラフィックス・プロセッシング・ユニット(GPU)向けのより基本的な呼び出しに変換するもので、LLVMの初期の採用例の一つでした。これにより、Apple社はIntel GMAチップセットを搭載したコンピュータでOpenGLをサポートし、それらのマシンのパフォーマンスを向上させることができました。[17]

LLVMプロジェクトは当初、GCCのフロントエンドを利用することを想定していました。しかし、GCCのソースコードは大きく、やや扱いにくいものでした。ある長年のGCC開発者はLLVMについて、「カバを踊らせるのは、実際にはあまり楽しいことではない」と述べています。[18]さらに、AppleのソフトウェアはObjective-Cを使用していますが、これはGCC開発者にとって優先度が低いものです。そのため、GCCはAppleの統合開発環境にスムーズに統合されません。[19]最後に、GCCのライセンス契約であるGNU一般公衆利用許諾書(GPL)バージョン3では、GCCの拡張機能または改変版を配布する開発者はソースコードを公開することが義務付けられていますが、LLVMの許容ソフトウェアライセンスではこれは義務付けられていません。[5] [6]

これらの理由から、AppleはC、Objective-C、C++をサポートする新しいコンパイラフロントエンドであるClangを開発しました。[19] 2007年7月、このプロジェクトはオープンソース化の承認を受けました。[20]

デザイン

ClangはLLVMと連携して動作する。[21] ClangとLLVMの組み合わせは、GCCスタックを置き換えるためのツールチェーンの大部分を提供する。Clangの主な目標の1つは、ライブラリベースのアーキテクチャを提供することであり、[22]これにより、コンパイラは、統合開発環境(IDE)などのソースコードを操作する他のツールと相互運用できるようになる。対照的に、GCCはコンパイル-リンク-デバッグのワークフローで動作する。他のツールとの統合は必ずしも簡単ではない。たとえば、GCCは、全体的なコンパイルプロセスの鍵となるfoldと呼ばれるステップを使用するが、その副作用として、コードツリーを元のソースコードとは似ても似つかない形式に変換する。foldステップ中またはその後にエラーが見つかった場合、それを元のソースの1か所に戻すのは難しい場合がある。さらに、IDE内でGCCスタックを使用するベンダーは、構文の強調表示やインテリジェントなコード補完などの機能を提供するために、別のツールを使用してコードをインデックス化し、構文の強調表示インテリジェントなコード補完などの機能を提供する必要がある。

ClangはGCCよりも多くの情報をコンパイルプロセス中に保持し、元のコード全体の形​​式を維持するため、エラーを元のソースにマッピングしやすくなります。Clangのエラーレポートはより詳細で具体的であり、機械可読であるため、IDEはコンパイラの出力をインデックス化できます。コンパイラのモジュール設計により、ソースコードのインデックス作成、構文チェック、その他RAP(ラピッドアプリケーション開発)システムに通常付随する機能を提供できます。また、解析ツリーは元のソースコードを直接表現するため、自動コードリファクタリングのサポートにも適しています

ClangはC、C++、Objective-C、Objective-C++などのC系言語のみをコンパイルします。多くの場合、Clangは必要に応じてGCCを置き換えることができ、ツールチェーン全体への影響はありません。[要出典] Clangは、一般的に使用されるGCCオプションのほとんどをサポートしています。FortranプロジェクトであるFlangは、2022年時点で開発中でした。ただし、Adaなどの他の言語では、LLVMはGCCまたは他のコンパイラフロントエンドに依存しています。

Flang - Fortran

NvidiaPortland GroupによるFlangプロジェクトはFortranサポートを追加します[23] FlangはLLVMのFortranフロントエンドです。「Classic Flang」と区別するために、「LLVM Flang」と呼ばれることがよくあります。これらはそれぞれ独立したFortranコンパイラです。「LLVM Flang」は現在も開発が進められています。Flangの開発版は2023年10月時点で開発中であり、LLVMプロジェクトからダウンロードできます。[24]

パフォーマンスとGCCの互換性

Clang でhtopをコンパイルする

ClangはGCCと互換性があります。[11] ClangのコマンドラインインターフェースはGCCの多くのフラグとオプションを共有しています。Clangは多くのGNU言語拡張機能とコンパイラ組み込み関数を実装しており、その一部は純粋に互換性のために実装されています。例えば、ClangはC11のアトミック関数と完全に一致するアトミック組み込み関数を実装していますが GCC__sync_*およびC++標準ライブラリ(libstdc++)との互換性のためにGCCの組み込み関数も実装しています。ClangはGCCで生成されたオブジェクトコードとのアプリケーションバイナリインターフェース(ABI)の互換性も維持しています。実際には、ClangはGCCの代替品として利用できます。[25]

Clangの開発者は、GCCなどの他のコンパイラと比較して、メモリフットプリントを削減し、コンパイル速度を向上させることを目指しています。2007年10月、彼らはClangがCarbonライブラリをGCCの2倍以上の速度でコンパイルし、メモリとディスクスペースはGCCの約6分の1しか使用しなかったと報告しました。[26] 2011年までに、Clangはコンパイラ性能においてこの優位性を維持しているように見えました。[27] [28] 2014年半ばの時点で、Clangは依然としてコンパイル時間とプログラム性能の混合ベンチマークにおいてGCCよりも一貫して高速にコンパイルしています。[29]しかし、2019年までに、ClangはLinuxカーネルのコンパイルではGCCよりも大幅に遅くなりましたが、LLVMのコンパイルではわずかに高速のままでした。[30]

Clangは歴史的にGCCよりもコンパイル速度が速いものの、出力品質は遅れをとっています。2014年時点では、ClangでコンパイルされたプログラムのパフォーマンスはGCCでコンパイルされたプログラムのパフォーマンスを下回っており、時には大きな差(最大5.5倍)を示していました[29]。これは、以前の報告で報告されていたパフォーマンスの低下を再現しています[27] 。その後、両コンパイラはパフォーマンスを向上させるために進化を続け、その差は縮まっています。

  • 2016年11月にGCC 4.8.2とclang 3.4を大規模なテストファイル群で比較したところ、最適化されたソースコードではGCCがclangを約17%上回る結果となりました。テスト結果はコード固有のものであり、最適化されていないCソースコードではこの差が逆転する可能性があります。したがって、2つのコンパイラは概ね同等であると考えられます。[31] [信頼できない情報源]
  • 2019年にIntel Ice Lakeで行われた比較では、Clang 10で生成されたプログラムは41の異なるベンチマークでGCC 10の96%の性能を達成しました(そのうち22で勝ち、19で負けました)。[30]
  • 2023年に行われた別の比較では、ClangでコンパイルされたプログラムのパフォーマンスがGCCでコンパイルされたプログラムと同等になったことが明らかになりました。平均すると、Clang 16はGCC 13を6%上回っています。[32]

インタフェース

libclangCインターフェースを提供し、比較的小規模なAPIを提供します。公開されている機能には、ソースコードをASTに解析する、ASTをロードする、ASTを走査する、ソースコードの位置をAST内の要素に関連付ける、などがあります。

ステータス履歴

この表には、Clang の歴史における重要なステップとリリースのみが記載されています。

参照

参考文献

  1. ^ “LLVM 2.1 リリースノート”. llvm.org . LLVM Developer Group. 2007年9月27日. 2016年11月17日時点のオリジナルよりアーカイブ2018年4月30日閲覧。
  2. ^ “LLVM 21.1.5”. 2025年11月4日. 2025年11月4日閲覧
  3. ^ “LLVM 21.1.0-rc3”. 2025年8月12日. 2025年8月12日閲覧
  4. ^ “リリース”. llvm – llvm-project リポジトリ. LLVM開発者グループ. 2021年8月27日. オリジナルより2021年9月12日時点のアーカイブ2021年9月12日閲覧– GitHub.com経由。
  5. ^ abc "LICENSE.TXT", llvm.org , LLVM Developer Group, 2020年11月11日時点のオリジナルよりアーカイブ, 2019年9月24日閲覧
  6. ^ abc "LLVM Developer Policy", llvm.org , LLVM Developer Group, § Copyright, License, and Patents, 2012年11月13日時点のオリジナルよりアーカイブ, 2021年9月12日閲覧
  7. ^ Christopher, Eric (2008年7月3日). 「Clangの発音が本当に不思議」. LLVMdev (メーリングリスト) . 2015年9月22日閲覧
  8. ^ “OpenMP Support”. LLVMプロジェクトブログ. 2015年5月22日. 2016年3月26日時点のオリジナルよりアーカイブ2016年3月28日閲覧。
  9. ^ “C++ Heterogeneous-Compute Interface for Portability”. GitHub . 2020年6月27日時点のオリジナルよりアーカイブ2020年2月18日閲覧。
  10. ^ 「Clang言語拡張」。2014年2月24日時点のオリジナルよりアーカイブ2017年11月8日閲覧。ここに挙げた言語拡張に加えて、Clangは幅広いGCC拡張のサポートを目指しています。
  11. ^ ab Clang - Features and Goals: GCC Compatibility、2013年4月15日、2018年4月27日時点のオリジナルよりアーカイブ2018年4月30日閲覧。
  12. ^ “Clang Static Analyzer”. LLVM. 2018年4月30日時点のオリジナルよりアーカイブ2009年9月3日閲覧。
  13. ^ 「Clang プロジェクトに参加する」、clang.llvm.org、LLVM 開発者グループ、2018 年 4 月 27 日のオリジナルからアーカイブ、 2012 年9 月 18 日取得Clang は LLVM プロジェクトのサブプロジェクトですが、コミュニティにはさまざまな興味を持つ人々がいるため、独自のメーリング リストがあります。
  14. ^ ab 「ClangにおけるC++およびC++'0xのサポート」。LLVM。2013年7月4日時点のオリジナルよりアーカイブ2023年3月12日閲覧。
  15. ^ 「Clang 17.0.1 リリースノート」. LLVM . 2023年10月25日閲覧
  16. ^ Treat, Adam (2005年2月19日). 「Qt4のLLVMコンパイル用のmkspecsとパッチ」. Qt4-preview-feedback (メーリングリスト). 2011年10月4日時点のオリジナルよりアーカイブ。
  17. ^ Lattner, Chris (2007年5月25日). LLVM for OpenGL and other stuff (スライド) . LLVM Developers' Meeting. 2016年5月8日時点のオリジナルよりアーカイブ(PDF) . 2018年4月30日閲覧.
  18. ^ Zadeck, Kenneth (2005年11月19日). 「Re: LLVM/GCC 統合提案」. GCC 開発(メーリングリスト). 2016年3月10日時点のオリジナルよりアーカイブ。 2016年7月25日閲覧
  19. ^ ab Naroff, Steve (2007年5月25日). 新しいLLVM Cフロントエンド(スライド) . LLVM開発者会議. 2019年4月3日時点のオリジナルよりアーカイブ(PDF) 。 2018年4月30日閲覧
  20. ^ Lattner, Chris (2007年7月11日). 「新しいLLVM Cフロントエンド: "clang"」. cfe-dev (メーリングリスト). 2020年3月26日時点のオリジナルよりアーカイブ。 2020年3月26日閲覧
  21. ^ ab Clang チーム、clang: LLVM の C 言語ファミリーフロントエンド 2017 年 11 月 12 日アーカイブ、Wayback Machine
  22. ^ “Clang: ユーティリティとアプリケーション: ライブラリベースのアーキテクチャ”. 2018年4月27日時点のオリジナルよりアーカイブ2018年4月30日閲覧。
  23. ^ “FLANG: NVIDIAがFortranをLLVMに導入”. 2017年5月20日時点のオリジナルよりアーカイブ2017年5月18日閲覧。
  24. ^ 「Flang のドキュメントへようこそ - Flang コンパイラ」。
  25. ^ ClangはGCCの代替としてよく使われる、2020年5月、2020年5月8日時点のオリジナルよりアーカイブ、 2020年5月9日閲覧。
  26. ^ Clang - 機能と目標: 高速コンパイルと低メモリ使用、2007年10月、2018年4月27日時点のオリジナルからアーカイブ、 2018年4月30日取得
  27. ^ abc Simonis, Volker (2011年2月10日). 「ClangによるHotSpot VMのコンパイル」。2011年2月18日時点のオリジナルよりアーカイブ2011年2月13日閲覧。GCCとの全体的な互換性は優れており、コンパイル時間も印象的ですが、生成されたコードのパフォーマンスは最近のGCCバージョンに比べて依然として劣っています。
  28. ^ 「LLVMとClangのGCC 4.5ベンチマーク」Phoronix 2010年4月21日。2016年11月2日時点のオリジナルからアーカイブ。 2011年2月13日閲覧。LLVM -GCCとClangのバイナリはどちらも、Pfamデータベース検索のHMMerベンチマークにおいて、GCC 4.5.0に苦戦しました。LLVM-GCCとClangは約23%遅くなりました(...)LLVM / Clangは現時点ではパフォーマンスのチャンピオンではありませんが、両コンポーネントとも非常に活発に開発が続けられており、今後数ヶ月で新たなニュースが発表されることを期待しています。
  29. ^ ab “GCC 4.9 VS. LLVM Clang 3.5 Linuxコンパイラベンチマーク”. OpenBenchmarking.org. 2014年4月14日. 2017年10月23日時点のオリジナルよりアーカイブ。 2014年6月25日閲覧
  30. ^ Michael Larabel (2019年12月23日). 「LLVM ClangはIntel Ice Lake上でGCCの約96%のパフォーマンスを達成」. 2021年1月15日時点のオリジナルよりアーカイブ。 2021年1月14日閲覧
  31. ^ 「Clang vs GCC - どちらがより良いバイナリを生成するのか?」stackoverflow.com。2017年6月1日時点のオリジナルよりアーカイブ。 2018年10月1日閲覧
  32. ^ Michael Larabel (2023年5月11日). 「Intel Raptor LakeにおけるLLVM Clang 16とGCC 13のコンパイラパフォーマンスの比較」 . 2024年4月24日閲覧
  33. ^ Divacky, Roman (2009年2月25日). 「[発表] clang/llvm は i386/amd64 上で FreeBSD カーネルを起動してコンパイル可能」. 2018年5月1日時点のオリジナルよりアーカイブ。 2018年4月30日閲覧
  34. ^ Building FreeBSD with Clang、Wiki.freebsd.org、2012年8月24日、2018年4月30日時点のオリジナルよりアーカイブ、 2012年9月18日取得
  35. ^ Hornung, Alex. 「llvm/clang once more」。2018年4月30日時点のオリジナルよりアーカイブ2018年4月30日閲覧。
  36. ^ Clang、DragonFly BSD、2018年4月30日時点のオリジナルよりアーカイブ。 2012年9月18日閲覧。
  37. ^ 「ClangはLLVMとClangをコンパイルできる」LLVMプロジェクトブログ、2009年12月24日。2012年4月26日時点のオリジナルよりアーカイブ2009年12月31日閲覧。
  38. ^ 「Clangがセルフホストに成功」LLVMプロジェクトブログ、2010年2月4日。2012年4月26日時点のオリジナルよりアーカイブ2010年2月5日閲覧。
  39. ^ Gregor, Doug (2010年5月20日). 「Clang++ Builds Boost!」. LLVMプロジェクトブログ. 2012年4月26日時点のオリジナルよりアーカイブ。 2010年5月21日閲覧
  40. ^ Davis, Brad. 「FreeBSD Status Reports April–June, 2010」。2018年6月24日時点のオリジナルよりアーカイブ。 2018年4月30日閲覧
  41. ^ Clang は動作する Linux カーネルを構築します (SMP、ネットワーク、X、自己ホストで RL5 を起動)、Lists.cs.uiuc.edu、2015 年 9 月 7 日のオリジナルからアーカイブ、 2012 年9 月 18 日取得
  42. ^ Gregor, Douglas (2011年1月26日). 「Clangにおける新しいC++0x機能のサポート」(メーリングリスト). 2011年1月30日時点のオリジナルよりアーカイブ。 2011年1月29日閲覧
  43. ^ Sonnenberger, Jörg (2012年1月19日). 「NetBSDとLLVMの現状」. 2016年9月21日時点のオリジナルよりアーカイブ2014年2月26日閲覧。
  44. ^ Ledru, Sylvestre. 「clang による Debian アーカイブの再構築」。2018年5月1日時点のオリジナルよりアーカイブ2018年4月30日閲覧。
  45. ^ “Official Minix 3 website: News”. 2009年12月17日時点のオリジナルよりアーカイブ2012年12月7日閲覧。
  46. ^ Gerzo, Daniel (2012年5月12日). 「FreeBSD Quarterly Status Report January–March, 2012」(メーリングリスト). 2018年2月18日時点のオリジナルよりアーカイブ。 2012年5月14日閲覧
  47. ^ Davis, Brooks (2012年11月5日). 「Heads Up: Clang now the default on x86」(メーリングリスト). 2018年4月30日時点のオリジナルよりアーカイブ。 2012年11月7日閲覧
  48. ^ Webster, Behan (2013年2月18日). 「LLVMLinux: LLVMによるAndroidのコンパイル」(PDF) . 2014年5月12日時点のオリジナル(PDF)からアーカイブ。 2013年5月11日閲覧
  49. ^ Tinti, Vinicius (2013年3月17日). 「LLVMLinux: Nexus 7」. 2014年6月11日時点のオリジナルよりアーカイブ2013年5月11日閲覧。
  50. ^ Du Toit, Stefanus. 「Clangは*たった今*C++11の機能が完成しました!」。2019年9月24日時点のオリジナルよりアーカイブ2013年4月20日閲覧。
  51. ^ "[llvm-project] リビジョン 194194". 2018年11月18日時点のオリジナルよりアーカイブ2018年4月30日閲覧。
  52. ^ Ledru, Sylvestre. 「Clang 3.5.0を使用したDebianの再構築」。2018年5月1日時点のオリジナルよりアーカイブ2018年4月30日閲覧。
  53. ^ “NDK Revision History | Android Developers”. developer.android.com . 2018年3月6日時点のオリジナルよりアーカイブ2018年3月6日閲覧。
  54. ^ “NDK 改訂履歴 | Android NDK | Android Developers”. Android Developers . 2019年4月5日時点のオリジナルよりアーカイブ2018年4月30日閲覧。
  55. ^ Nagy, Robert (2017年7月26日). 「amd64およびi386のデフォルトコンパイラをclangに切り替える」(メーリングリスト). 2018年10月25日時点のオリジナルよりアーカイブ。 2017年9月30日閲覧
  56. ^ Kettenis, Mark (2018年1月19日). “Switch the default compiler on armv7 to clang” (メーリングリスト). 2022年4月8日時点のオリジナルよりアーカイブ。 2020年8月27日閲覧
  57. ^ “Clang が Windows 版 Chrome のビルドに利用されるようになりました”. blog.llvm.org . 2018年3月5日. オリジナルより2018年3月5日時点のアーカイブ。 2018年4月7日閲覧
  58. ^ “Firefox Beta 63.0beta、新機能、アップデート、修正点をすべてご覧ください”. www.mozilla.org . 2021年4月19日時点のオリジナルよりアーカイブ2020年3月18日閲覧。
  59. ^ Hankala, Visa (2019年7月1日). “Switch the default compiler on octeon to clang” (メーリングリスト). 2022年4月8日時点のオリジナルよりアーカイブ。 2020年8月27日閲覧
  60. ^ “LLVM 9 Releases With Official RISC-V Target Support, Asm Goto, Clang 9, And More”. riscv.org . 2019年9月26日. 2019年12月28日時点のオリジナルよりアーカイブ。 2019年9月26日閲覧
  61. ^ “FreeBSD svn commit r358454”. 2020年2月29日. 2020年3月10日時点のオリジナルよりアーカイブ2020年3月7日閲覧。
  62. ^ Kettenis, Mark (2020年4月2日). “Switch the default compiler on powerpc to clang” (メーリングリスト). 2022年4月8日時点のオリジナルよりアーカイブ。 2020年8月27日閲覧
  63. ^ Hankala, Visa (2020年12月21日). “Make clang the default compiler on loongson” (メーリングリスト). 2021年1月13日時点のオリジナルよりアーカイブ。 2021年1月1日閲覧
  • 公式サイト