web-dev-qa-db-ja.com

なぜclangはもっと使われないのですか?

私は以前にC/C++でかなりの量のプログラミングを行ったことがありますが、最近では、私が行うプログラミングのごく一部しか占めていません(スクリプト言語は、私が行う多くの作業にはるかに適しています)。私はここ数日、いくつかのCプログラミングプロジェクトに取り組みましたが、構文の詳細を忘れ続けていることに驚いていました。さらに悪いことに、cc/gccには通常、これらの問題に関する不可解なエラーメッセージまたは情報のないエラーメッセージが表示されていました(申し訳ありませんが、具体的な例を思い出せません)。

私は少し前にclangコンパイラについて学び、それを試すことにしました。エラーメッセージははるかに明確で、構文の問題を特定して修正するのに役立ちました。私の質問は、なぜこのツールがそれ以上に使用/言及されていないのですか?それは通常の容疑者(cc/gcc)と比較して非常に新しいのですか、それとも彼らがサポートする機能をサポートしていないのですか、それとも入手が難しいだけですか?最後の1つは、iMacの開発ツールとともにインストールされ、1つのコマンド(Sudo apt-get install clang)Ubuntuボックスにインストールします。

40
Daniel Standage

私の質問は、なぜこのツールがそれ以上に使用/言及されていないのですか?

それはおそらく歴史のせいであり、私たち人間が一般的にどのように振る舞うのかということです。

従来、gccは、少なくともすべての無料の* nixクローンでCプログラムをコンパイルするために実際に使用できる唯一の実際の(無料の)コンパイラでした。これは、Linux、* BSD、おそらくOSXなどの実質的にすべての基本システムとカーネルがコンパイルされているものです。

欠陥はあちこちにありますが、基本的にこれは次のことを意味します:gccは機能します。そして、それが壊れていない場合は、それを修正しないでください。このことから、あなたは今、巨大なユーザーベースを持っています、gccの助けを得るのは簡単です、gccを使った人、gcc自体に取り組んでいる人などがたくさんいます。

一般に、巨大なコミュニティを慣れ親しんだものから他の何かに切り替えたい場合、その「他の何か」は*大幅に「良く」なければなりません。「より良い」だけでは十分な理由がないことがよくあります。社会の多くの分野でのこの例。

clangは新しいものであり、タスクに応じている場合、バグがある場合、コードの生成速度が遅い場合など、疑わしい人もいます。疑わしいのは人間の性質のようです。新しいことは怖いです。多くの人はclangについてさえ知らず、多くの人はgccに満足しているので気にしません。

ただし、youがむしろclangを使用したい場合は、それを選択してください。エラーメッセージは、gccよりも確かに「優れて」理解しやすいものです。

40
nos

Clangフロントエンドは比較的新しいものです。たとえば、2010年10月の 2.8リリース は、C++ 98/03サポートの完了を示します。

成熟度が増すにつれて、採用も増えると思われます。たとえば、FreeBSD OS(および他のBSD OS)をclangでビルドし、GCC/G ++への依存を排除​​する作業が進行中です。

AppleはLLVM/clangの組み合わせを推進しています。彼らは古いGCCツールチェーンブランチ(4.2に基づく)のサポートをやめ、OSX/iOS開発のためにclangツールのみに依存するようになる可能性があります。

Clangは、Cのような言語用のカスタムコンパイラー(OpenCL用のシェーダー言語コンパイラーなど)でも採用が増えています。

10
grrussel

LLVMはしばらく前から存在していましたが、少なくとも私の首では、ごく最近になってようやく目立つようになりました。これはおそらく、Appleが最近大きくプッシュしているためです。独自のツールチェーンでgccをClangに置き換えます。

また、C++のサポートが本番環境に移行したのはごく最近のことだと思います。 編集:まだそうではないようです。 (以下のコメントを参照してください。)

もう1つの要因は、LLVMの大部分が単一のベンダーによって支えられていることである可能性があります。これに対して、Apple以外の開発者は本質的に不信感を抱いています。

7
Marcelo Cantos

私の質問は、なぜこのツールがそれ以上に使用/言及されていないのですか?いつもの容疑者に比べてとても新しいのでしょうか…

これがまさにその理由です。それはまだ新しく、コア機能はまだ活発に開発されています。既存のプロジェクトはコンパイラ固有の機能を利用している可能性があること、または利用しているライブラリを使用している可能性があることを忘れないでください。開発者は、いずれにせよ、予期しないバグや未知のパフォーマンス/サイズなどを持つ可能性のある実験的なツールの作業ツールを変更することを嫌います。新しいツールが日々ますます良くなっている場合でも、トレードオフがあります。

6
Fred Nurk

学生プログラマーとして、私はそれが主に有用で理解しやすいエラーメッセージのために完全な天の恵みだと思います。私は主にCでのプログラミングに使用していますが、Clangも使用してC++に分岐し始めています。

なぜこれ以上言及されないのかというと、GCCは長い間確立されてきたので、ほとんどのユーザーにとってはコンパイラーだと思います。私にとってのGCCは、学生として私をかなり失望させる非常に不可解なエラーメッセージを除いて、正常に機能します。

全体として、学生と開発者の両方が使用するClangを強くお勧めします。現在はAppleとXcodeの公式コンパイラであるため、その使用と名前認識はすぐに受け入れられると思います。FreeBSDもメインコンパイラとして採用しているようですが、 Appleによる採用よりも人気への影響。

補遺: Clangとの競合により、GCC4.8および4.9のエラーメッセージの明瞭さが大幅に改善されました。 ; Clangはまだ少し明快だと思いますが、ギャップは大幅に狭まりました。

4
haziz

今日、clangはほとんどの places でgccを置き換えています。つまり、ほとんどの* NIXライクなオペレーティングシステムとLinuxディストリビューションです。いくつかの例は、デフォルトのコンパイラとしてclangを切り替えたFreeBSD、Minix、およびmac(少し明白な)clangです。私が彼らに見せたとき、私の友人の何人かも。

このIMHOは、おそらく古いバージョンで問題が発生したようです。しかし、clangバージョン3.0では、この問題は発生していません。前に述べたように、私はすべての新しいプロジェクトで実際にそれを使用しています。ほとんど私のデフォルトのコンパイラですが、clangエラー/警告との違いを確認するために_make C=gcc_を実行することもあります。そして、clangはこれまでに勝ちます。より良い説明で、最適化に多大な努力を払ってください。これには、コード生成で最高のパフォーマンスを発揮するためのコンパイラーの拡張機能(一部はgcc inerhid)の使用に関する提案が含まれています。

エラーメッセージを出力する簡単な関数を作成しました。しかし、標準出力にエラーメッセージを出力した後、プログラムを終了します。だから、私は簡単な変更を加え、関数の最後のステートメントとしてexit(1)を置きます。次のように:

_void error(const char *fmt, ...)
{
  va_list ap;
  va_start(ap, fmt);
  fprintf(stderr, "error: ");
  vfprintf(stderr, fmt, ap);
  va_end(ap);
  exit(1);
}
_

そして、clangショー

警告:関数 'error'は属性 'noreturn' [-Wmissing-noreturn] `で宣言できます

(gccは、_-Wall -Wextra -Wunreachable-code -O3_フラグがなくても生成しません)

私は「それはいいようだ。しかし、「nonreturn」属性とは何ですか?私はこれについて聞いたり読んだりすることはありません。私はグーグルにジャンプして_clang could be declared with attribute 'noreturn'_を検索します(ああ、ええ、私は_clang nonreturn attribute_、しかしそれを忘れてください)そして私は this この属性が何であるかと私が得ることができるパフォーマンスの可能な利益の良い説明とのリンクを見つけました。

そこで、この属性を関数プロトタイプに追加するために実行します(もちろん、gccまたはclangコンパイラーの場合、マクロはトリック検出を行います)。そうそう、私にとっては、(もちろん、コードを読めなくすることなく)パフォーマンスを少しでも向上させることができます。

そして、ここで終わらないでください、数年前、私は(ここのerror()関数のように)デフォルトの処理として定義されたスイッチである関数でreturnを作成します。しかし、それでも、gccは戻り値のない関数について不平を言っています(申し訳ありませんが、エラー/警告メッセージを正確に思い出せません)。切り替え後にステートメントはありません。大文字と小文字が一致しない場合、デフォルト値が実行され、以下のステートメントがあれば、実際には関係ありません。しかし、clangは私のように違った考え方をし、この宣言について警告を出し、より良いコードを作成するのに役立ちます。

そして、この種の非常に小さなことのために、私はクランが大好きです。 (注:英語が下手でごめんなさい。英語は私の母国語ではありませんが、それにもかかわらず私はここで私を表現しようとしています)

2
Jack