web-dev-qa-db-ja.com

WindowsでGCCはスレッドサポートなしで終了しますか?

私はいくつかの意見が必要です。 GCCは常に非常に優れたコンパイラでしたが、最近は「魅力」を失っています。 Windows GCCにはstd::threadサポート。Windowsユーザーは、最もエキサイティングな機能がまだ不足しているため、別のコンパイラを使用する必要があります。

しかし、なぜGCCはまだWindowsでスレッドをサポートしていないのですか?ライセンスの問題? ABIの非互換性? (マルチスレッドを使用するクロスプラットフォームライブラリはすでにいくつかあります:boost、POCO、SDL、wxwidgetsなど。GCCリリースを出荷する代わりに、既存の既存のコードやMIT/libpngライセンスのコードをこの穴に合わせるのは簡単ではないでしょうか。スレッドのサポートなし?)

最近、コンパイラー比較を見ると、GCCは他のコンパイラーに関してC++ 11機能を最も広くサポートしていますが、Windowsではアトミック、ミューテックス、スレッドがまだないため、これは当てはまりません:/

このトピックについて詳しく知りたいのですが、見つけることができるのは、次の理由で助けを求めている人だけです。

「スレッド」はstd名前空間に存在しません

GCC/TDM-GCCのチケット追跡とメールディスカッションを見ると、2009年からスレッドサポートのリクエストがありました。4年経ってもまだ解決策がない可能性はありますか?本当に何が起こっているのですか?

31
CoffeDeveloper

GCCを維持している人々がやや傲慢になったためにGCCが支持を失っていることを理解し、LLVMがここに(そして非常に良い)人々が足で投票していることを理解しました。

Slashdotは LLVMのC++ 11の新しいサポート について議論しました。 _merlin 言う:

ああ、それが邪悪だと誰もが思っているとは思いません。寛大さというよりは純粋に自己利益であることだけです。 GCCの驚異的な人気により、メンテナーは大規模な自我を成長させ、合計のように振る舞っています[**** ]。バグはRed Hatよりも早く導入され、Appleはパッチを受け入れられる可能性があり、バグレポートを表示せず、実際に修正せずに非アクティブのためにバグを閉じるという厄介な癖があります。

4年の遅れについてのあなたの観察と一致します。

23
gbjbaanb

GCCの人気と使いやすさには疑問の余地はありません。

から https://stackoverflow.com/questions/12210102/does-gcc-4-7-1-support-threads mingw build at http://code.google.com/ p/mingw-builds/downloads/list はスレッドをサポートします。

ただし、重要な考慮事項はライセンスです。

FreeBSDはGPLと不安な関係にあります。 BSDライセンスの擁護者は、真にフリーなソフトウェアには使用制限がないと信じています。 GPLの支持者は、ソフトウェアの自由を保護するために制限が必要であり、特にフリーソフトウェアから非フリーソフトウェアを作成する能力は、自由というよりは不正な力の形態であると信じています。 FreeBSDプロジェクトは、可能な場合、GPLの使用を回避しようとします(詳細については https://unix.stackexchange.com/questions/49906/why-is-freebsd-deprecating-gcc-in-favor- of-clang-llvm

その他の重要な考慮事項

http://clang.llvm.org/comparison.html#gcc から

  • ClangのASTと設計は、関連する言語に精通していて、コンパイラーの動作の基本を理解している人なら誰でも簡単に理解できるように意図されています。 GCCには非常に古いコードベースがあり、新しい開発者に急な学習曲線を提示します。
  • Clangは当初からAPIとして設計されており、ソース分析ツール、リファクタリング、IDE(など)、およびコード生成で再利用できます。 GCCはモノリシック静的コンパイラーとして構築されているため、APIとして使用して他のツールに統合することは非常に困難です。さらに、その歴史的なデザインと現在のポリシーにより、フロントエンドをコンパイラの他の部分から切り離すことが難しくなっています。
  • さまざまなGCC設計の決定により、再利用が非常に困難になっています。そのビルドシステムを変更するのは困難です。複数のターゲットを1つのバイナリにリンクすることはできません。複数のフロントエンドを1つのバイナリにリンクすることはできません。カスタムガベージコレクターを使用します。グローバル変数を広範囲に使用し、リエントラントでもマルチスレッドでもありません。Clangにはこれらの問題はありません。
  • すべてのトークンについて、clangはそれが書き込まれた場所、およびマクロに関与している場合は最終的にどこに展開されたかについての情報を追跡します。 GCCは、ソースコードの解析時にマクロのインスタンス化に関する情報を追跡しません。これにより、ソースリライトツール(たとえば、リファクタリング)が(単純な)マクロの存在下で動作することが非常に困難になります。
  • ClangはGCCのようにコードを解析するため、コードを暗黙的に単純化しません。これを行うと、ソース分析ツールに多くの問題が発生します。1つの簡単な例として、ソースコードに「xx」と書くと、GCC ASTには「0」が含まれますが、「x '。これは、' x 'の名前を変更したいリファクタリングツールにとって非常に悪いことです。
  • Clangは、そのAST=をディスクに出力して別のプログラムに読み戻すことができます。これは、プログラム全体の分析に役立ちます。GCCにはこれがありません。GCCのPCHメカニズム(これは単なるダンプです)コンパイラー・メモリー・イメージ)は関連していますが、アーキテクチャーでは、それを生成したものとまったく同じ実行可能ファイルに構造的にのみ読み取ることができます(構造化フォーマットではありません)。
  • ClangはGCCよりもはるかに高速で、使用するメモリもはるかに少ないです。
  • Clangは、非常に明確で簡潔な診断(エラーおよび警告メッセージ)を提供することを目的としており、表現力豊かな診断のサポートが含まれています。 GCCの警告は許容できる場合もありますが、しばしば混乱を招き、表現力豊かな診断をサポートしません。 Clangはまた、診断でtypedefを一貫して保持し、マクロ展開やその他の多くの機能を示します。
  • Clangは、LLVMをバックエンドとして使用することから、中間コードのバイトコード表現のサポート、プラガブルオプティマイザー、リンク時最適化サポート、ジャストインタイムコンパイル、複数のコードジェネレーターでリンクする機能など、多くの機能を継承しています。 。
  • C++のClangのサポートは、多くの点でGCCのサポートよりも準拠しています(たとえば、2フェーズ名の準拠のルックアップ)。

から http://www.linuxquestions.org/questions/slackware-14/gcc-vs-llvm-931034/

  • Llvm/clangの利点は、モジュール式の設計であるため、
    インターフェース化され、静的コード分析ツールの作成などに使用され、ますます重要になるもの()

http://clang.debian.net/ から

  • これで、clangは本番用ソフトウェア(C、C++、またはObjective-C用)を構築する準備ができました。このコンパイラは、gccと同じレガシーを持たない一方で、gccスイートよりもはるかに多くの警告と興味深いエラーを提供しています。
29

時間がかかるのは、ヘッダーを上に構築するための強固な基盤を得るために多くの作業が必要だからです。 mingw-w64がboのように見える方法は、Windowsでpthreadsのようなライブラリを構築することです。 Windows APIのネイティブスレッドへの依存関係を導入するよりも、上流の不機嫌さは少なくなります。

mingw-w64は、独自のwinpthreadsライブラリの上に<thread>およびその他のC++ 11ヘッダーを実装します。これは、mingw-w64ツールチェーンのMingw-buildsとrubenvbの両方のディストリビューションでのテストに使用できます。ネイティブのWindows GCC作業のほとんどの作業が行われた場所を追跡する場合は、mingw-w64メーリングリストに従うことをお勧めします。

Qtプロジェクトには、現在の推奨事項と、Windows上のGCCツールチェーンの概要を詳しく説明するWikiページがあります。詳細は このQtプロジェクトWikiページ を参照してください。

11
Lars Viklund