FreeBSDがGCCを廃止してClang / LLVMを支持するのはなぜですか?


241

それで、私はネットサーフィンしていて、この記事につまずきました。基本的に、バージョン10以降のFreeBSDでは、Clang / LLVMを優先してGCCを廃止する予定です。

私がこれまでネットで見てきたことから、Clang / LLVMはかなり野心的なプロジェクトですが、信頼性の観点からはGCCに匹敵するものではありません。

FreeBSDがコンパイラインフラストラクチャとしてLLVMを選択している技術的な理由はありますか、それとも全体の問題は永遠のGNU / GPL対BSDライセンスに要約されていますか?

この質問には(何らかの形で)FreeBSDでのGCCの使用に関する関連情報が含まれています

回答:


361

要約: GCCからClangに切り替える主な理由は、GCCのGPL v3ライセンスとFreeBSDプロジェクトの目標との非互換性です。ユーザーベースの要件だけでなく、企業投資に関する政治的な問題もあります。最後に、標準への準拠とデバッグの容易さに関して、技術的な利点が期待されます。コンパイルと実行における実際のパフォーマンスの向上は、コード固有で議論の余地があります。両方のコンパイラについてケースを作成できます。

FreeBSDとGPL: FreeBSDGPLと不安な関係にあります。BSDライセンスの支持者は、真にフリーなソフトウェアには使用制限ないと考えています。GPLの支持者は、ソフトウェアの自由を保護するために制限が必要であり、特に、フリーソフトウェアから非フリーソフトウェアを作成する能力は、自由ではなく権力の不当な形態であると考えています。FreeBSDプロジェクトは、可能な場合、GPLの使用避けようとします

しかし、GPLソフトウェアの商用利用で進化する可能性がある追加の複雑さのために、可能な場合は、より緩和されたFreeBSDライセンスの下で、そのようなソフトウェアを提出物に置き換える努力をします。

FreeBSDとGPL v3の:GPL v3の明示いわゆる禁じTivo化コードの、中抜け穴GPL v2のユーザーがそれ以外の場合は法的なソフトウェア変更を許可しないように、ハードウェアの制限を可能にしました。この抜け穴を塞ぐことは、FreeBSDコミュニティの多くの人々にとって受け入れがたいステップでした。

特にGPLv2の下で現在ライセンスされているソフトウェアの大部分が現在新しいライセンスに移行した場合、アプライアンスベンダーが最も失うものが多くなります。GPLv3ソフトウェアを使用したり、ハードウェアにインストールされているソフトウェアの変更を制限したりすることはできなくなります。要するに、GPLライセンスソフトウェアの代替手段を理解することに突然興味を抱くオープンソースコンシューマーが大勢います。

GCCがGPL v3に移行したため、FreeBSDは2007年リリースされた GCC 4.2.1(GPL v2)の使用を余儀なくされ、現在ではかなり古くなっています。古いコンパイラを実行し、修正をバックポートするという追加のメンテナンスの頭痛があっても、FreeBSDが最新のバージョンのGCCを使用するように移行しなかったという事実は、GPL v3を回避するための要件の強さのいくらかの考えを与えます。CコンパイラはFreeBSDベースの主要コンポーネントであり、「FreeBSD 10の(仮の)目標の1つはGPLフリーのベースシステムです」。

企業投資:多くの主要なオープンソースプロジェクトと同様に、FreeBSDは企業から資金提供開発作業を受けています。AppleによるFreeBSDへの資金提供や開発の程度は簡単には発見できませんが、AppleのDarwin OSはBSD由来の実質的なカーネルコードを使用しているため、かなりの重複があります。さらに、2007年オープンソース化されるまで、Clang自体は元々社内のAppleプロジェクトでした。企業のリソースはFreeBSDプロジェクトの重要なイネーブラーであるため、スポンサーのニーズを満たすことはおそらく重要な現実世界のドライバーです。

ユーザーベース: FreeBSDは多くの企業にとって魅力的なオープンソースオプションです。ライセンスはシンプルで制限がなく、訴訟につながる可能性が低いためです。GPL v3の登場と新しいTivoisation対策規定によりより寛容なライセンスに向けて、ベンダー主導の加速的な傾向があることが示唆されています。FreeBSDの商業エンティティに対する認識された利点は、その寛容なライセンスにあるため、GCCおよびGPL全般から遠ざかるという企業ユーザーベースからの圧力が高まっています。

GCCの問題:ライセンスとは別に、GCCの使用にはいくつかの問題があります。GCCは完全に標準に準拠しておらず、ISO標準Cにはない多くの拡張機能があります。300万行を超えるコードで、「最も複雑でフリー/オープンソースのソフトウェアプロジェクトの1つでもあります。この複雑さにより、ディストリビューションレベルのコード変更が困難なタスクになります。

技術的な利点: Clangには、GCCと比較していくつかの技術的な利点があります。最も注目すべきは、はるかに有益なエラーメッセージと、IDE、リファクタリング、およびソースコード分析ツール用に明示的に設計されたAPIです。ClangのWebサイトに、はるかに効率的なコンパイルとメモリ使用量を示すプロットが表示されますが、実際の結果は非常に変わりやすく、GCCのパフォーマンスとほぼ一致しています。一般に、Clangで作成されたバイナリは、同等のGCCバイナリよりも実行が遅くなります。

LLVMの使用は、GCCよりもコードのビルドが高速ですが、ほとんどの場合、GCC 4.5でビルドされたバイナリはLLVM-GCCまたはClangよりも優れたパフォーマンスを示しました...残りのテストでは、パフォーマンスはGCCのパフォーマンスに近いか十分でした後ろに。一部のテストでは、Clangで生成されたバイナリのパフォーマンスはひどいものでした。

結論:特にバイナリのパフォーマンスが不足している場合、FreeBSDのような大規模なプロジェクトをまったく新しいコンパイラツールチェーンに移行する大きなリスクを冒すために、コンパイルの効率が重要な動機となることはほとんどありません。しかし、状況は実際には持続可能ではありませんでした。1)古いGCCを実行する、2)最新のGCCに移行してプロジェクトの目標と互換性のないライセンスを使用する、または3)安定したBSDライセンスコンパイラに移行するという選択肢があります。おそらく避けられなかった。これは基本システムとディストリビューションからのサポートにのみ適用されることに注意してください。ユーザーが自分のFreeBSDボックスに最新のGCCをインストールして使用することを妨げるものは何もありません。


4
あなたが引用したベンチマークは、Clangの古いバージョンのものです。最近のバージョンのベンチマークは最近のバージョンに近いようです。私自身の単純なプログラムの研究により、Clang 3.0はGCC 4.6よりも数パーセント高速でしたが、GCCはスレッドバージョンで20%高速でした。phoronix.com/scan.php?page=news_item&px=MTA5Nzcは、より新しいPhoronixベンチマークです。
ショーン

6
「GCCは完全に標準に準拠していません」:コンパイラスイッチを使用して特定の標準への準拠を強制することはできませんか?
ジョルジオ

4
まず第一に、Phoronixベンチマークを読みすぎないか、むしろまったく読みません。第二に、GCCがデフォルトで完全に標準に準拠していないのは確かです。明示的に標準を指定しない限り、GNU拡張も有効にしない場合は、Clangを使用するのは奇妙な理由のように見えますが、彼らも、最も一般的に使用されるGNU拡張機能を実装しています。これは、ClangがGCCの代替として使用できるように努力しているためです。
キリアス

1
@Giorgio:いいえ。例についてはgcc.gnu.org/c99status.htmlを参照してください。これは単なるC99です(現在は14歳です)。また、gcc.gnu.org / onlinedocs / libstdc ++ / manual / status.html -clangは両方のサポートが優れています(完全だと思います-そうでない場合は、少なくとも優れています)。
ティムČas13年

4
@Demizey私はPhoronixを擁護していませんが、何かを却下する場合は、少なくとも正当な理由を提供する必要があります。
マリオ14

38

検討する価値のあることの1つは、ireBSDがire_and_cursesの回答に記載されているように、現在GCC 4.2.1を使用しているため、パフォーマンスの比較が4.5ではなく、4.6でさえプロジェクトに関連しないことです。したがって、あなたが尋ねるべき質問は次のとおりです。

  1. プロジェクトで使用している古いGCCと比較して、新しいClangのパフォーマンスはどの程度向上していますか?

  2. GCC 4.2.1でコンパイルされた同じバイナリは、新しいClangと比較してどうですか?

GCCがGPL v3に移行したため、FreeBSDはGCC 4.2.1(GPL v2)の使用を余儀なくされました。これは2007年にリリースされ、現在ではかなり古くなっています。

Clangが現在のGCCに遅れを取っているが、プロジェクトに実装されたGCCよりもまだ数年先である場合、進化するという彼らの決定は十分に正当化され、本当に刺激を受けます。


19

GCCはGPLv3ですが、GCCによって生成された結果のバイナリにはライセンスの制約がありませんでした。明らかに、GCCを使用して、必要なライセンスに該当するソフトウェアを構築できます。GCCに付属し、バイナリに含まれているCライブラリもライセンス不要です。http://www.gnu.org/licenses/gcc-exception-faq.html

GNU GPLv3のセクション2:

すべてのターゲットコードが適格なコンパイルプロセスによって生成された場合、ランタイムライブラリを独立したモジュールと組み合わせることによって形成されたターゲットコードの作業を伝播する許可があります。その後、独立したモジュールのライセンスに合わせて、選択した条件でそのような組み合わせを伝えることができます

「適格」とは、コンパイルにGCCとGPL非互換ソフトウェアの両方が含まれないことを意味します。それは制限ではありません:BSDライセンスのソフトウェアは、GNU GCCを含むビルドプロセスで使用できます。

ご覧のように、上記で述べたことに反して、FreeBSD内でGCCを使用することには非互換性がないため、GCCから離れる本当のライセンス関連の理由はありません。

この変更の背後にある本当の理由は、政治的で日和見的です。

  • BSDには、GNUパブリックライセンスと哲学的に競合する独自のライセンスがあります(上記の* ire_and_curses *を参照)。
  • CLANGは、FreeBSDのスポンサーによって開始された新しい非GPLコンパイラであり、技術的にはGPLライセンスのGCC(* ire_and_curses *で説明)と同等であると思われます。

これらの事実は、FreeBSDがGCCから離れてそれを取り除く機会を作り出します。彼らは、GCCを使用してフリーまたはBSDライセンスのソフトウェアを構築することができるため、実際には法的に強制されていませんが、 「すべてのBSDライセンスソフトウェア」哲学。


5
申し訳ありませんが、これを投票しなければなりませんでした。残念ながら、BSDやソフトウェアの低さに不慣れであることは明らかです。記録のためだけに、90年代前半にBSDを従来のポータブルCコンパイラ(PCC)からGCCに切り替えるのは、技術的な決定ではなく政治的な決定でした。ClangはAppleプロジェクトです!PCCに戻ろうとするOpenBSDで生活するためにGCCを日常的に使用している人として、あなたはすべてのアカウントで間違っています。
Predrag Punosevac

5
結果のバイナリに関するものではなく、gccがFreeBSDの一部であるという事実に関するものです。したがって、ライセンスの制約は重要です。
sstn

3
プロジェクトの宗教に「No GPLv3」と書かれている場合、技術的な側面は消えていきます。たとえば、Microsoftコンパイラを使用していると想像してください。
トールビョールンラヴンアンデルセン

3
これがそのことを正しく指摘している唯一の答えですlicense of compiler != license of end product。コンパイラーのライセンスに関する苦情は、ユーザーがライセンスを理解していない限り関係がない可能性があります。
ブランディン14

6
生成されたバイナリがGPLv3に該当するかどうかではなく、コンパイラ自体を変更するにはGPLv3に準拠する必要があるかどうかです。多くの場合、ハードウェアベンダーは、ストックコンパイラを変更して、ハードウェアをより適切に動作させたり、独自の方法でハードウェアを利用したりします。カスタム変更がGPLv3に準拠しなければならないリスクや法的措置のリスクを取り除くことは、このような組織にとって大したことです。ここで重要なのは、実際にコンパイラのライセンスです。
デビッドハークス14年

7

私は専門家ではありませんが、私の理解では、Clang / LLVMはGCCよりも少ないリソースを使用し、より高速です。

http://clang.llvm.org/features.html#performance

多くのものを何度も構築する必要がある環境を実行している場合、そのパフォーマンスはエネルギーコストと時間の実際の節約に変わる可能性があります。それが本物なら。


マイナー..さらに繰り返し、コンパイル時間を短縮するためのツールがあります- ccache.samba.orgが parrallelのコンパイルのための明白な可能性を気にしないが、リンク時間が大規模なプロジェクトでは解決が困難になる傾向があり(distccのを参照してください)
Rob11311

はい、非常に良いですが、結果のバイナリコードは遅くなります; p
rustyx 14

1
@rustyxはgcc 4.2と比較されません!
マイルルーティング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.