15

C++ コンパイラはあまり良くないバイナリを生成できますか? ここで、出力の堅牢性とパフォーマンスについて考えることができます。使用する「最高の」C++コンパイラなどはありますか? そうでない場合、有名なコンパイラー (g++、インテル C++ コンパイラー、Visual C++ など) の長所と短所 (既知のバグと問題) は何ですか?

コンパイラが誤った出力を生成し、ミッション クリティカルなソフトウェアの障害を引き起こした事例は文書化されていますか?

4

9 に答える 9

18

G++ が最も人気があるようです。それは無料で、ポータブルで、非常に優れています。Windows ポート (MinGW) は、私が最後に使用したとき (おそらく 1 年前) の日付でした。

Intel C++ コンパイラは、最も高速なコードを生成するものと見なされています (ただし、AMD プロセッサでは不適切な SIMD コードを生成することが知られています)。GNU/Linux 上ではかなり制限された条件下で自由に使用できます。
私はしばらくそれを使用してきましたが、他の人がしない巧妙な警告を発するという事実が気に入りました.

VC++ は最高の C++ IDE と見なされることが多く、コンパイラも非常に優れていると聞いています。これは無料 (無料のビールのように) で、もちろん Windows でのみ利用できます。
Windows プログラミングに興味がある場合は、このコンパイラをお勧めします。これは、常に最新の状態であり、この目的のためのより高度な機能を提供するためです。

Windows では VC++、他の OS では G++ をお勧めします。無料版の I++ を自分で試して、お金を払う価値があるかどうかを確認してください。


コンパイラが誤った出力を生成し、ミッション クリティカルなソフトウェアの障害を引き起こした事例は文書化されていますか?

はい、おそらくですが、ほとんどの場合、おそらくプログラマーのせいだと思います。たとえば、浮動小数点演算がどのように機能するかを知らない人は、信頼性の低いコードを簡単に記述できます。優れたプログラマーは、C++ 標準によって動作が保証されているものとそうでないものを知っている必要があります。プログラマーは、コンパイラーの限界についても知っておく必要があります。たとえば、コンパイラーが標準をどれだけうまく実装しているか、どれほど積極的に最適化しているかなどです。

于 2009-07-11T23:18:38.727 に答える
3

まず、通常、使用しているプラ​​ットフォームによって、使用するコンパイラが決まります。

次に、堅牢性とパフォーマンスに関する質問です。堅牢性の意味がわかりません。しかし、コンパイルされたバイナリの正確さを意味する場合は、あなたが言及したコンパイラの安定したバージョンを使用している限り、「堅牢性」の問題に遭遇することはないと言わざるを得ません。これらのコンパイラはすべて非常に成熟しており、無数の実際のプロジェクトで使用されています。そのため、堅牢性についてはまったく心配しません。

パフォーマンスに関しては、各コンパイラには異なる最適化手法があり、理論的には異なるパフォーマンスが得られる可能性があるため、これに答えるのは難しいです。私よりも詳しい人がいて、このことについて教えてくれることを願っています。

実際には、あなたが言及したコンパイラはすべて高品質で成熟したコンパイラであることを考えると、あなたが尋ねるべき質問は、どのコンパイラがより堅牢かということではなく、次のことです。

  • ターゲット プラットフォームをサポートするコンパイラはどれですか
  • 私の開発環境とツールでうまく動作するコンパイラはどれですか?
  • 私の開発チームとインテグレーターが最もよく知っているコンパイラはどれですか。

ただし、最適化手法の問題は未解決の問題であり、それほど重要な問題ではありません。一部の人がそれに光を当てることができることを願っています。

于 2009-07-11T23:04:27.383 に答える
3

コメントで「商用航空機システムの一部として」と述べているため、実際にその分野で認証を維持している企業、またはその他の安全性が重要な製品分野で提供されているコンパイラを調べる価値があるかもしれません。Green Hills Softwareもその 1 つです。ウインドリバーは別です。

于 2009-07-12T04:48:46.043 に答える
2

Bastien Léonard の回答に加えて、マルチプラットフォームの C++ コンパイラがもう 1 つあります — Comeauです。これは、最も標準に準拠した C++ コンパイラです。最新バージョンでは、C++0x コア言語がサポートされています。

于 2009-07-12T10:56:47.317 に答える
1

http://www.compilers.net/Dir/Free/Compilers/CCpp.htm

Microsoft には優れた無料のコンパイラがありますが、unix や mac で作業している場合は、ほとんど役に立ちません。

Borland には優れた無料のコンパイラもあります。

私はいくつかの無料のコンパイラを試しましたが、Dev-C++ に最も慣れています。パッケージ全体のサイズは比較的小さく、Windows と Linux のフレーバーがあります。私にとっては、C++ 言語の限界を試すのに最適です。高速にコンパイルされ、実験が容易になります。

Digital Mars C/C++ Compiler というソフトウェアをお勧めします 。http: //www.brothersoft.com/digital-mars- から入手できます。Win32、Win16、DOS32 用の無料の C/C++ コンパイラです。そしてDOS環境。

于 2009-07-12T11:12:46.940 に答える
1

使用しているプラ​​ットフォームは何ですか? たとえば、Visual C++ は Linux では役に立ちません。

実際、あなたが言及した3つは、これらの理由から私が選んだ3つです.

gcc/g++: 多くの Linux および UNIX システムでの長年の共同作業の経験によって洗練された、実証済みのオープン ソース。それほど強力ではない点は、スタンドアロンのコマンドライン ツールであることです。独自の IDE スタイルの環境を作成したり、見つけたりすることはできますが、いわばそのように「出荷」することはできません。

Visual C++: Microsoft によって十分にサポートされており、多数のコード サンプルとドキュメント (MSDN) があり、Windows API に自然に接続されます。あまり強くない点は、特に「視覚的」ではないということです。Visual Basic (たとえば) に慣れている場合は、Visual C++ がまったく同じように機能しないことがわかります。

Intel C++ コンパイラ: 残念ながら、私は Intel のコンパイラの経験はありませんが、並列処理をサポートし、高精度の数値ライブラリを備えていると信じています。

もう 1 つ言及する価値があるのは、Borland の C++Builder です。Delphi の VCL との互換性により、豊富なアドオン コントロールを備えた迅速なアプリケーション開発環境であるという利点がありますが、逆に C++Builder で開発されたコードは、他の C++ コンパイラに簡単に移植できません。

于 2009-07-11T23:04:46.010 に答える
1

ハイ パフォーマンス コンピューティングの意味での出力コードの高性能について話している場合は、Portland Group のコンパイラIBM の XL コンパイラにも興味があるかもしれません。

于 2009-07-12T04:50:21.407 に答える
1

最適化コンパイラのポイントは、元のプログラムと機能的に同等の最適化されたプログラムを生成することです。もちろん、機能的等価物は観察可能な効果と関係があります。状態は当然同じではありません。私の意見では、間違った翻訳を生成できるコンパイラは悪いものですが、さまざまな状況で特定の問題を緩和できると思います。主流のコンパイラの利点の 1 つは、バグがより迅速に修正されることです。

パフォーマンスに関しては、コンパイラは通常、プラットフォームに依存しない最適化 (ソース レベル/構文ツリー/中間表現) とプラットフォーム固有の最適化の 2 種類の最適化を行います。

プラットフォームに依存しない最良の最適化は、おそらく既存のコンパイラのさまざまなアカデミックな変更にあると思います(ただし、おそらく最適化はそれぞれ異なります)。これらの最適化は、最終的には認識され、最終的には主流になります。

プラットフォーム固有の最適化に関しては、これらのプラットフォームを作成している企業は多くの場合、最高の最適化を行っていると思います (たとえば、内部 Intel コンパイラー)。

于 2009-07-12T04:55:02.803 に答える
-8

Cygwin を使用して問題を発見しました。このようなコードはコンパイルされませんが、コンパイラ内でセグメンテーション エラーが発生します。同じコードが MinGW でも機能します。

[編集] コンパイラ レポートは次のとおりです。

lista.h: In constructor `Lista<Dado>::Lista() [with Dado = int]':
principal.cpp:15:   instantiated from here
lista.h:13: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://cygwin.com/problems.html> for instructions.

エラーを生成したソース コードが手元にないため、レポートを送信できません。

[/編集]

于 2009-07-11T22:59:30.573 に答える