デザイン
Clang は LLVM と連携して動作します。[ 20 ] Clang と LLVM の組み合わせにより、GCCスタックを置き換えるためのツールチェーンの大部分が提供されます。Clang の主な目標の 1 つはライブラリベースのアーキテクチャを提供することです。[ 21 ]これにより、コンパイラは統合開発環境(IDE) など、ソース コードとやり取りする他のツールと相互運用できます。対照的に、GCC はコンパイル-リンク-デバッグのワークフローで動作するため、他のツールとの統合は必ずしも容易ではありません。たとえば、GCC はコンパイル プロセス全体の鍵となるfoldと呼ばれるステップを使用しますが、このステップにはコード ツリーを元のソース コードとは異なる形式に変換するという副作用があります。fold ステップ中または後にエラーが見つかった場合、それを元のソースの 1 つの場所に戻すのは難しい場合があります。さらに、IDE 内で GCC スタックを使用するベンダーは、構文ハイライトやインテリジェントなコード補完などの機能を提供するために、コードをインデックス化するための別のツールを使用する必要があります。
Clangはコンパイルプロセス中にGCCよりも多くの情報を保持し、元のコードの全体的な形式を維持するため、エラーを元のソースコードにマッピングしやすくなります。Clangのエラーレポートはより詳細で具体的、かつ機械可読であるため、IDEはコンパイラの出力をインデックス化できます。コンパイラのモジュール設計により、ソースコードのインデックス化、構文チェック、および通常、高速アプリケーション開発システムに関連付けられるその他の機能を提供できます。また、構文解析ツリーは元のソースコードを直接表現するため、自動コードリファクタリングをサポートするのに適しています。
Clang は、C、C++、Objective-C、Objective-C++ などの C ライクな言語のみをコンパイルします。多くの場合、Clang は必要に応じて GCC を置き換えることができ、ツールチェーン全体に他の影響を与えることはありません。Clangは、一般的に使用される GCC オプションのほとんどをサポートしています。Fortran プロジェクトである Flang は、2022 年時点で開発中でした。ただし、Adaなどの他の言語については、LLVM は GCC または別のコンパイラ フロントエンドに依存しています。
フランジ
NvidiaとThe Portland GroupによるFlangプロジェクトは、Fortranのサポートを追加しています。[ 22 ] FlangはLLVMのFortranフロントエンドであり、 Classic Flangと区別するためにLLVM Flang と呼ばれることがよくあります。これらは2つの独立したFortranコンパイラです。LLVM Flangは活発に開発されています。2023年10月現在 当時、Flangの開発版が開発中で、LLVMプロジェクトからダウンロードすることができた。[ 23 ]
ClangでhtopをコンパイルClang は GCC と互換性があります。[ 10 ]そのコマンドラインインターフェイスは、 GCC のフラグやオプションの多くを共有しています。Clang は多くの GNU 言語拡張機能とコンパイラ組み込み関数を実装しており、その一部は純粋に互換性のためです。たとえば、Clang は C11アトミック__sync_*と完全に一致するアトミック組み込み関数を実装していますが、 GCC およびC++ 標準ライブラリ(libstdc++) との互換性のためにGCC の組み込み関数も実装しています。Clang はまた、GCC で生成されたオブジェクトコードとのアプリケーションバイナリインターフェイス(ABI) 互換性を維持しています。実際には、Clang は GCC のドロップイン代替品です。[ 24 ]
Clangの開発者は、GCCなどの他のコンパイラと比較して、メモリ使用量を削減し、コンパイル速度を向上させることを目指しています。2007年10月、彼らはClangがCarbonライブラリをGCCの2倍以上の速さでコンパイルし、メモリとディスク容量の使用量はGCCの約6分の1で済んだと報告しました。[ 25 ] 2011年までに、Clangはこのコンパイラ性能の優位性を維持しているように見えました。[ 26 ] [ 27 ] 2014年半ばの時点で、Clangはコンパイル時間とプログラム性能の混合ベンチマークで、GCCよりも一貫して高速にコンパイルしています。[ 28 ]しかし、2019年までに、ClangはLinuxカーネルのコンパイルではGCCよりも大幅に遅くなりましたが、LLVMのコンパイルではわずかに高速のままです。[ 29 ]
Clangはこれまでコンパイル速度においてGCCよりも優れていましたが、出力品質は劣っていました。2014年の時点では、ClangでコンパイルされたプログラムのパフォーマンスはGCCでコンパイルされたプログラムのパフォーマンスに大きく劣り、場合によっては5.5倍もの差がありました[ 28 ]。これは、以前のパフォーマンス低下の報告を裏付けるものでした[ 26 ] 。その後、両コンパイラはパフォーマンス向上に向けて進化し、その差は縮まっています。
- 2016年11月に行われた、多数のテストファイルを用いたGCC 4.8.2とclang 3.4の比較では、最適化されたソースコードにおいてGCCがclangを約17%上回る結果となった。テスト結果はコード固有のものであり、最適化されていないCソースコードではこのような差が逆転する可能性がある。したがって、両コンパイラは概ね同等であると考えられる。[ 30 ]
- Intel Ice Lake上での 2019 年の比較では、Clang 10 で生成されたプログラムが 41 種類のベンチマークで GCC 10 の 96% のパフォーマンスを達成したことが示されています (そのうち 22 で勝ち、19 で負けています)。[ 29 ]
- 2023年に実施された別の比較では、Clangを使用してコンパイルされたプログラムのパフォーマンスが、GCCを使用してコンパイルされたプログラムのパフォーマンスと同等になったことが明らかになった。平均して、Clang 16はGCC 13を6%上回っている。[ 31 ]
インタフェース
libclangC言語インターフェースを提供し、比較的小規模なAPIを提供します。公開される機能には、ソースコードをASTに解析する、ASTをロードする、ASTを走査する、ソースコードの位置をAST内の要素に関連付ける、などが含まれます。
ステータス履歴
この表は、Clangの歴史における重要なステップとリリースのみを示しています。
参考文献
- ↑ "LLVM 2.1 リリース ノート" . llvm.org . LLVM 開発者グループ。2007 年 9 月 27 日。2016年 11 月 17 日のオリジナルからアーカイブ済み。2018年4 月 30 日取得。
- ↑ "LLVM 22.1.8" . 2026年6月16日. 2026年6月16日に取得.
- ↑ "リリース" . llvm – llvm-project リポジトリ. LLVM 開発者グループ。2021 年 8 月 27 日。2021年 9 月 12 日のオリジナルからアーカイブ済み。2021年9 月 12 日取得– GitHub.com経由。
- 1 2 3 "LICENSE.TXT"、llvm.org、LLVM開発者グループ、2020年11月11日にオリジナルからアーカイブ、2019年9月24日に取得
- 1 2 3 「LLVM開発者ポリシー」、llvm.org、LLVM開発者グループ、§著作権、ライセンス、特許、2012年11月13日のオリジナルからアーカイブ、2021年9月12日取得
- ↑ Christopher, Eric (2008年7月3日). "Clangの発音について単純に疑問に思う" . LLVMdev (メーリングリスト) . 2015年9月22日取得.
- ↑ 「OpenMP サポート」 . LLVM プロジェクト ブログ. 2015 年 5 月 22 日。2016年 3 月 26 日のオリジナルからアーカイブ済み。2016年3 月 28 日取得。
- ↑ "C++ 移植性のための異種計算インターフェース" . GitHub . 2020 年 6 月 27 日のオリジナルからアーカイブ済み。2020年2 月 18 日取得。
- ↑ 「Clang 言語拡張機能」。2014年 2 月 24 日のオリジナルからアーカイブ済み。2017年11 月 8 日取得。
ここにリストされている言語拡張機能に加えて、Clang は幅広い GCC 拡張機能をサポートすることを目指しています。
- 1 2 Clang - 機能と目標: GCC との互換性、2013 年 4 月 15 日、2018 年 4 月 27 日にオリジナルからアーカイブ、2018 年4 月 30 日に取得
- ↑ 「Clang Static Analyzer」 . LLVM。2018年4月30日にオリジナルからアーカイブ済み。2009年9月3日に取得。
- ↑ 「Clangプロジェクトへの参加」、clang.llvm.org、LLVM開発者グループ、2018年4月27日のオリジナルからアーカイブ、 2012年9月18日取得、
ClangはLLVMプロジェクトのサブプロジェクトですが、コミュニティにはさまざまな関心を持つ人々がいるため、独自のメーリングリストがあります。
- 1 2 "Clang における C++ および C++'0x サポート" . LLVM. 2013 年 7 月 4 日のオリジナルからアーカイブ済み。2023年3 月 12 日取得。
- ↑ 「Clang 17.0.1 リリースノート」 . LLVM . 2023年10月25日取得。
- ↑ Treat, Adam (2005年2月19日). "Qt4のLLVMコンパイル用のmkspecとパッチ" . Qt4-preview-feedback (メーリングリスト). 2011年10月4日のオリジナルからアーカイブ済み。
- ↑ Lattner, Chris (2007 年 5 月 25 日). LLVM for OpenGL およびその他のもの(スライド) . LLVM 開発者会議. 2016 年 5 月 8 日のオリジナルからアーカイブ(PDF) . 2018 年4 月 30 日取得.
- ↑ Zadeck, Kenneth (2005年11月19日)。「Re: LLVM/GCC統合提案」。GCC開発(メーリングリスト)。2016年3月10日のオリジナルからアーカイブ。 2016年7月25日取得。
- 1 2 Naroff, Steve (2007 年 5 月 25 日).新しい LLVM C フロントエンド(スライド) . LLVM 開発者会議. 2019 年 4 月 3 日のオリジナルからアーカイブ(PDF) . 2018 年4 月 30 日取得.
- ↑ Lattner, Chris (2007年7月11日). 「新しいLLVM Cフロントエンド: "clang"」" . cfe-dev (メーリングリスト)。2020年3月26日のオリジナルからアーカイブ済み。2020年3月26日に取得。
- 1 2 Clangチーム、 clang: LLVM用のC言語ファミリーのフロントエンド2017年11月12日にWayback Machineにアーカイブされました
- ↑ 「Clang: ユーティリティとアプリケーション: ライブラリベースのアーキテクチャ」。2018年4月27日にオリジナルからアーカイブ済み。2018年4月30日に取得。
- ↑ "FLANG: NVIDIAがFortranをLLVMに導入" . 2017年5月20日のオリジナルからアーカイブ済み。2017年5月18日取得。
- ↑ 「Flangのドキュメントへようこそ - Flangコンパイラ」。
- ↑ ClangはGCCの代替としてそのまま使用できる場合が多い、2020年5月、2020年5月8日のオリジナルからアーカイブ、 2020年5月9日取得
- ↑ Clang - 機能と目標: 高速コンパイルと低メモリ使用量、2007年10月、2018年4月27日にオリジナルからアーカイブ、2018年4月30日に取得
- 1 2 3 Simonis, Volker (2011年2月10日)。「ClangでHotSpot VMをコンパイルする」。2011年2月18日のオリジナルからアーカイブ。2011年2月13日に取得。GCC
との全体的な互換性は優れており、コンパイル時間も印象的ですが、生成されたコードのパフォーマンスは、最新のGCCバージョンに比べてまだ劣っています。
- ↑ 「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はパフォーマンスチャンピオンではないが、両コンポーネントとも非常に活発に開発が続けられており、今後数ヶ月でさらに多くのニュースを報告できることが期待される。
- 1 2 "GCC 4.9 VS. LLVM Clang 3.5 Linux コンパイラ ベンチマーク" . OpenBenchmarking.org. 2014 年 4 月 14 日。2017年 10 月 23 日のオリジナルからアーカイブ済み。2014年6 月 25 日取得。
- 1 2 Michael Larabel (2019年12月23日)。「LLVM ClangがIntel Ice Lake上でGCCの約96%のパフォーマンスを達成」。2021年1月15日にオリジナルからアーカイブ。2021年1月14日に取得。
- ↑ 「Clang vs GCC - どちらがより良いバイナリを生成するか?」 stackoverflow.com 2017年6月1日のオリジナルからアーカイブ済み。2018年10月1日に取得。
- ↑ Michael Larabel (2023年5月11日) 「Intel Raptor LakeにおけるLLVM Clang 16とGCC 13のコンパイラ性能比較」 。 2024年4月24日取得。
- ↑ Divacky, Roman (2009年2月25日). " [アナウンス] clang/llvm は i386/amd64 上で起動可能な FreeBSD カーネルをコンパイルできます "。2018年5月1日のオリジナルからアーカイブ済み。 2018年4月30日取得。
- ↑ Clang を使用した FreeBSD のビルド、Wiki.freebsd.org、2012 年 8 月 24 日、2018 年 4 月 30 日にオリジナルからアーカイブ、2012 年9 月 18 日に取得
- ↑ Hornung, Alex. "llvm/clang once more" . 2018年4月30日のオリジナルからアーカイブ済み。2018年4月30日に取得。
- ↑ Clang、DragonFly BSD、2018年4月30日にオリジナルからアーカイブ、2012年9月18日に取得
- ↑ 「ClangはLLVMとClangをコンパイルできる」。LLVMプロジェクトブログ。2009年12月24日。2012年4月26日のオリジナルからアーカイブ。2009年12月31日取得。
- ↑ 「Clangがセルフホストに成功」。LLVMプロジェクトブログ。2010年2月4日。2012年4月26日のオリジナルからアーカイブ。 2010年2月5日取得。
- ↑ Gregor, Doug (2010年5月20日). "Clang++ が Boost をビルド!" . LLVM プロジェクト ブログ。2012年4月26日のオリジナルからアーカイブ。 2010年5月21日取得。
- ↑ Davis, Brad. "FreeBSD ステータス レポート 2010 年 4 月~6 月" . 2018 年 6 月 24 日のオリジナルからアーカイブ済み。2018年4 月 30 日取得。
- ↑ Clang が動作する Linux カーネルをビルド (SMP、ネットワーク、X、セルフホストを備えた RL5 にブート)、Lists.cs.uiuc.edu、2015 年 9 月 7 日のオリジナルからアーカイブ、 2012 年9 月 18 日取得
- ↑グレゴール、ダグラス(2011年1月26日)。「Clangにおける新しいC++0x機能のサポート」(メーリングリスト)。2011年1月30日のオリジナルからアーカイブ。 2011年1月29日取得。
- ↑ Sonnenberger, Jörg (2012年1月19日). 「NetBSDとLLVMの現状」 . 2016年9月21日にオリジナルからアーカイブ済み。2014年2月26日取得。
- ↑ Ledru, Sylvestre. 「clang を使用した Debian アーカイブの再構築」。2018年 5 月 1 日のオリジナルからアーカイブ済み。2018年4 月 30 日に取得。
- ↑ 「Minix 3 公式サイト: ニュース」。2009年 12 月 17 日のオリジナルからアーカイブ済み。2012年12 月 7 日取得。
- ↑ Gerzo, Daniel (2012年5月12日). "FreeBSD 四半期状況報告 2012年1月~3月" (メーリングリスト). 2018年2月18日のオリジナルからアーカイブ済み。 2012年5月14日取得。
- ↑ Davis, Brooks (2012年11月5日) 「お知らせ:Clangがx86のデフォルトになりました」 (メーリングリスト)。2018年4月30日のオリジナルからアーカイブ済み。 2012年11月7日取得。
- ↑ Webster, Behan (2013年2月18日)。「LLVMLinux: LLVM を使用した Android のコンパイル」(PDF)。2014年5月12日にオリジナル(PDF)からアーカイブ済み。2013年5月11日に取得。
- ↑ Tinti, Vinicius (2013年3月17日). "LLVMLinux: Nexus 7" . 2014年6月11日のオリジナルからアーカイブ済み。2013年5月11日に取得。
- ↑ Du Toit, Stefanus. "Clang は *つい最近* C++11 の機能を完全に実装しました!" . 2019 年 9 月 24 日のオリジナルからアーカイブ済み。2013年4 月 20 日取得。
- ↑ " [ llvm-project ]リビジョン 194194"。2018年11月18日にオリジナルからアーカイブされました。2018年4月30日に取得。
- ↑ Ledru, Sylvestre. "Clang 3.5.0 を使用した Debian の再構築" . 2018 年 5 月 1 日のオリジナルからアーカイブ済み。2018年4 月 30 日に取得。
- ↑ "NDK 改訂履歴 | Android 開発者" . developer.android.com . 2018 年 3 月 6 日のオリジナルからアーカイブ済み. 2018 年3 月 6 日取得.
- ↑ "NDK 改訂履歴 | Android NDK | Android 開発者" . Android 開発者. 2019 年 4 月 5 日のオリジナルからアーカイブ済み. 2018 年4 月 30 日取得.
- ↑ Nagy, Robert (2017年7月26日). "amd64とi386のデフォルトコンパイラをclangに切り替える" (メーリングリスト). 2018年10月25日のオリジナルからアーカイブ済み。 2017年9月30日取得。
- ↑ Kettenis, Mark (2018年1月19日)。「armv7のデフォルトコンパイラをclangに切り替える」 (メーリングリスト)。2022年4月8日のオリジナルからアーカイブ済み。 2020年8月27日取得。
- ↑ 「Clang が Windows 版 Chrome のビルドに使われるようになりました」。blog.llvm.org。2018年3 月 5 日。2018年 3 月 5 日のオリジナルからアーカイブ済み。2018年4 月 7 日取得。
- ↑ 「Firefox Beta 63.0beta、すべての新機能、アップデート、修正点を見る」。www.mozilla.org 。 2021年4月19日のオリジナルからアーカイブ済み。2020年3月18日取得。
- ↑ Hankala, Visa (2019年7月1日) 「OcteonのデフォルトコンパイラをClangに切り替える」 (メーリングリスト)。2022年4月8日のオリジナルからアーカイブ済み。 2020年8月27日取得。
- ↑ "LLVM 9 が公式 RISC-V ターゲット サポート、Asm Goto、Clang 9 などを搭載してリリース" . riscv.org . 2019 年 9 月 26 日。2019年 12 月 28 日のオリジナルからアーカイブ済み。2019年9 月 26 日取得。
- ↑ "FreeBSD svn commit r358454"。2020年2月29日。2020年3月10日のオリジナルからアーカイブ済み。2020年3月7日取得。
- ↑ Kettenis, Mark (2020年4月2日). 「PowerPCのデフォルトコンパイラをclangに切り替える」 (メーリングリスト). 2022年4月8日のオリジナルからアーカイブ済み。 2020年8月27日取得。
- ↑ Hankala, Visa (2020年12月21日) 「loongsonでclangをデフォルトコンパイラにする」 (メーリングリスト)。2021年1月13日のオリジナルからアーカイブ。2021年1月1日に取得。
外部リンク
- 公式サイト
