タグ付けされた質問 「clang」

5
Objective-C開発用のClang警告フラグ
CおよびObjective-Cプログラマーとして、私はコンパイラ警告フラグに少し偏執的です。 私は通常、使用しているコンパイラの警告フラグの完全なリストを見つけて、それをオンにしない本当に正当な理由がない限り、それらのほとんどをオンにします。 私は個人的に、これにより実際にコーディングスキルが向上し、コードの移植性が向上し、いくつかの問題を防ぐことができると考えています。 私の意見では、あなたが経験豊富なプログラマーであっても、毎日の良い学習ツールでもあります。 この質問の主観的な部分については、このトピックについて他の開発者(主にC、Objective-C、C ++)を聞くことに興味があります。 あなたは実際に、物足りなさの警告などのようなものに関心がありますか?はい、またはいいえの場合、なぜですか? Objective-Cについては、最近、GCCではなく、LLVMツールチェーン(Clangを使用)に完全に切り替えました。 私の製品コードでは、通常、この警告フラグを設定します(明示的に、それらの一部が-Wallでカバーされている場合でも): -壁 -Wbad-function-cast -Wcast-align -W変換 -ステートメント後の宣言 -Wdeprecated-implementations -ウェクストラ -Wfloat-equal -Wformat = 2 -Wformat-nonliteral -Wfour-char-constants -Wimplicit-atomic-properties -ミッシングブレース -ミッシング宣言 -欠落フィールド初期化子 -欠落フォーマット属性 -ミッシングノーリターン -ミッシングプロトタイプ -ネストされた外部 -改行-eof -Wold-style-definition -Woverlength-strings -かっこ -ポインターポインター -冗長宣言 -戻り型 -Wsequence-point -Wshadow -Wshorten-64-to-32 -Wsign-compare -署名変換 -Wstrict-prototypes -Wstrict-selector-match -Wswitch -Wswitch-default -Wswitch-enum -Wundeclared-selector -初期化されていない -不明なプラグマ …

4
GCC vs clang / LLVM —それぞれの長所と短所[非公開]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 6年前に閉鎖されました。 GCC対clang / LLVMの長所と短所は何ですか?
20 compiler  clang  gcc  llvm 

1
LLVMにツリーのようなIRではなく、アセンブリのようなIRがあるのはなぜですか?または:プロジェクトがclangのASTではなくLLVM IRをターゲットとするのはなぜですか?
なぜLLVMの中間表現(LLVM IR)はツリーのようではなくアセンブリのようですか? あるいは、言語の実装がclangのASTではなくLLVM IRをターゲットにしているのはなぜですか? そのように思える場合、私は一度に2つの異なる質問をしようとはしていません。私にとっては、クライアントとライブラリの両方のプログラマーが、LLVMのAPIは明らかに優れたソフトウェア設計であり、「なぜ?」 私が尋ねる理由は、IRがASTに似ていればLLVMがフロントエンドにより多くの機能を提供できるように見えることです。clangのASTベースのツールはどのフロントエンドにも使用できるからです。あるいは、LLVM IRを対象とする言語は、clangのASTを対象とする場合、より多くの機能を取得できます。 ClangにはASTを作成および操作するためのクラスと関数があり、LLVMプロジェクトに強く結び付けられている唯一のフロントエンドプロジェクトです。なぜclangのAST機能はLLVMの外部にあるのでしょうか。 私の頭上では、Rust(rustc)、D(ldc)、Haskell(GHC)はすべてLLVMをバックエンドとして使用できますが、Clang ASTは使用しません(私が知る限り、間違っている)。これらのコンパイラのすべての内部詳細はわかりませんが、少なくともRustとDは確かにclangのASTにコンパイルできるようです。Haskellも可能かもしれませんが、それについてはあまり確信が持てません。 これは歴史的な理由によるものですか(LLVMはもともと「低レベルの仮想マシン」であり、clangは後で登場します)?これは、他のフロントエンドがLLVMに供給するものを可能な限り制御したいからでしょうか?clangのASTが「非Cライク」言語に不適切である根本的な理由はありますか? 私はこの質問をマインドリーディングの練習にするつもりはありません。コンパイラー設計に興味はあるが、まだ流notではない私たちにとって役立つものにしたいだけです。LLVMおよびclangプロジェクトは公開で開発されているため、これらのプロジェクトの開発に精通している人が答えられるか、答えがコンパイルオタクにとって十分に明白であり、彼らが答えるのに十分自信があると感じることを望んでいます。 明らかではあるが不十分な回答を先取りするには: はい、アセンブリのようなIRを有するIR工芸誰により詳細に制御できます(おそらくX langは打ち鳴らすより良いコードベースとASTの形式を持っている)が、それが唯一の答えだ場合、その疑問は、なぜLLVMはない」となっのみ assembly-を持っています高レベルのツリーのようなIRと低レベルのアセンブリのようなIRではなくIRが好きですか?」 はい、プログラミング言語をASTに解析するのはそれほど難しくありません(少なくとも他のコンパイル手順と比較して)。それでも、なぜ個別のASTを使用するのですか?他に何もなければ、同じASTを使用すると、ASTで動作するツールを使用できます(ASTプリンターのような単純なものでも)。 はい、よりモジュール化することは良いことであることに強く同意しますが、それが唯一の理由である場合、他の言語実装がclangのASTではなくLLVM IRをターゲットとする傾向があるのはなぜですか? これらのプリエンプションは誤っているか、詳細を見落としている可能性があります。詳細がある場合、または私の仮定が間違っている場合は、お気軽にこれらの回答を行ってください。 より明確に答えられる質問に答えたい人のために:アセンブリのようなIR対ツリーのようなIRの長所と短所は何ですか?

3
C ++:C ++機能ではなくコンパイラAPIを使用したメタプログラミング
これはSOの質問として始まりましたが、それはかなり型破りであり、Webサイト上の実際の説明に基づくと、質問には多くの概念的な重みがあるため、programmers.seに適している可能性があることに気付きました。 私はclang LibToolingを学習してきましたが、これは非常に強力なツールであり、コードの「ぎこちない」全体をフレンドリーな方法で、つまりセマンティックな方法で、推測することなく公開できます。clangがコードをコンパイルできる場合、clangはそのコード内のすべての単一文字のセマンティクスについて確実です。 ここで、少し前に戻ります。 C ++テンプレートのメタプログラミングに従事する場合(特に、恐ろしいマクロではあるが、テンプレートを超えて賢い領域に冒険する場合)には、多くの実用的な問題が発生します。正直なところ、私も含めて多くのプログラマーにとって、テンプレートの通常の使用法の多くは、やや恐ろしいものです。 良い例は、コンパイル時の文字列だと思います。これは、1年以上前の質問ですが、現時点でのC ++では、これが単なる人間にとって容易ではないことは明らかです。これらのオプションを見るだけでは吐き気を誘発するのに十分ではありませんが、それでも、私が自分のソフトウェアで使用している空想のアプリケーションに適合する魔法の、最大限に効率的なマシンコードを生成できるかどうか自信がありません。 正直言って、皆さん、文字列はかなりシンプルで基本的なものです。私たちの中には、特定の文字列が単純な方法でコーディングする場合よりも大幅に「組み込まれた」マシンコードを生成する便利な方法を求めているだけです。私たちのC ++コードで。 clangとLibToolingを入力します。これにより、ソースコードの抽象構文ツリー(AST)が公開され、シンプルなカスタムC ++アプリケーションRewriterが、ASTのすべての豊富なセマンティックオブジェクト指向モデルと一緒に、生のソースコードを(確実に)正しく正確に操作できるようになります。それは多くのものを扱います。マクロ展開について知っているので、それらのチェーンをたどることができます。はい、私はソースからソースへのコード変換または変換について話しています。 ここでの私の基本的な論点は、clangにより、C ++ソフトウェアの理想的なカスタムプリプロセッサステージとして機能する実行可能ファイルを作成できるようになり、これらのメタプログラミングステージをC ++で実装できるということです。このステージは、有効なC ++コードである入力を受け取り、より有効なC ++コードを出力として生成する必要があるという事実に制約されます。さらに、ビルドシステムが適用するその他の制約。 結局のところ、clangはコンパイラのフロントエンドであり、APIを使って独創的であるため、入力は少なくとも有効なC ++コードに非常に近い必要があります。使用する新しい構文を定義できるようにする準備があるかどうかはわかりませんが、これを正しく解析してclangプロジェクトに追加する方法を開発する必要があることは明らかです。これ以上期待することは、clangプロジェクトに範囲外の何かを含めることです。 問題ない。一部の何もしないマクロ関数がこのタスクを処理できると思います。 私が説明していることを確認する別の方法は、言語自体で利用できるより限定されたツールを使用して実装する代わりに、ソースコードのAST(clangとそのAPIのおかげ)を操作することにより、ランタイムC ++を使用してメタプログラミング構成を実装することです。これには、明らかなコンパイルパフォーマンスの利点もあります(テンプレートが多いヘッダーでは、使用頻度に比例してコンパイルが遅くなります。コンパイルされたものの多くは、慎重に照合され、リンカーによって破棄されます)。 ただし、これには、ビルドプロセスに追加の手順を1つまたは2つ追加するコストと、ツールの一部として(確かに)多少冗長なソフトウェア(ただし、少なくとも単純なランタイムC ++)を記述する必要があります。 。 それは全体像ではありません。コア言語の機能では非常に困難または不可能であるコードを生成することで、はるかに大きな機能空間を確保できると確信しています。C ++ではテンプレート、マクロ、またはその両方のクレイジーな組み合わせを記述できますが、clangツールでは、セマンティックコンテンツへのフルアクセスを持ちながら、実行時に C ++で実現できる方法でクラスと関数を変更できます。テンプレートとマクロ、その他すべてに加えて。 それで、なぜ誰もがまだこれをしていないのかと思っています。clangのこの機能は非常に新しく、clangのASTの巨大なクラス階層に誰も精通していないのでしょうか?それはそれではありえない。 おそらく、私はこれの難しさを少し過小評価しているだけですが、clangツールを使用して「コンパイル時の文字列操作」を行うことは、犯罪的にほぼ単純です。冗長ですが、非常に単純です。必要なのは、実際の実際のstd::string操作にマップする一連のno-opマクロ関数だけです。clangプラグインは、関連するすべてのno-opマクロ呼び出しをフェッチしてこれを実装し、文字列を使用して操作を実行します。このツールは、ビルドプロセスの一部として挿入されます。ビルド中に、これらのno-opマクロ関数呼び出しは自動的にその結果に評価され、プログラム内の単純な古いコンパイル時文字列として挿入されます。その後、プログラムは通常どおりコンパイルできます。実際、結果として得られるこのプログラムは、結果としてはるかに移植性が高くなり、C ++ 11をサポートする豪華な新しいコンパイラーを必要としません。

3
Clang / LLVMはプライムタイムの準備ができていますか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、専門知識によって裏付けられると期待していますが、この質問は、議論、議論、投票、または拡張ディスカッションを求める可能性があります。この質問を改善でき、再開できると思われる場合は、ヘルプセンターにアクセスしてください。 6年前休業。 Clangはgccの代わりに使用できますか?その上であなたの経験は何ですか?まだどのような欠点がありますか? コンパイルのパフォーマンスはgccよりも非常に優れていますが、実行時に生成されるコードのパフォーマンスについてはどうでしょうか。 LinuxまたはWindowsで実行するためのフロントエンド(IDE)として優れたツールはありますか? 編集:私はCコンパイラを意味します。C ++はまだあまり良くありません。

2
gccでビルドするプロジェクトの個人コード分析にClangを使用するのは賢明ですか?
を使用してビルドしているいくつかのCプロジェクトに取り組み始めましたgcc。この選択はいくつかの理由で行われたと思います: アームの非常に早い段階でクロスコンパイルする必要がありました(私はそう思います)。 パフォーマンスは、何よりも重要なスペックです。 gcc 以前も今も簡単な最初の選択です。 私はその選択に異議を唱える理由はなく、とにかくそうする立場にはありません。 単一のプロジェクトのコードベースは比較的小さいです。すべてのプロジェクトは比較的クリーンなMakefile(現在更新中)でビルドされ、gcc -Wall -Wextraほとんど文句を言わず、最小限のテストが行​​われます。自動化された静的分析やコードのフォーマットは行われておらず、コードは構文的に一貫性がありませんが、非常に読みやすく、考え抜かれています。 コードのすべての行を一度に再フォーマットしたくないので、この回答の周りのどこかで説明されているように(特にコンテキストが実際にはそれほど悪くないため)行うつもりです:リファクタリングし、主に、トピックを扱うときはできるだけ再フォーマットしますただし、コードスタイルを意識しないでトピックを取り上げます。残念ながら、私はコードスタイルやコミットの追加チェックを課す立場にはありませんが、ファイルを変更するときは既存のコード規則を尊重する必要があるという同僚の感覚があるように感じます(ただし、現在の状態はわかっていますが)コードの魔法のようなことが起こりませんでした)、そして良いコードを書きたいという欲求。 これは、このような心構えでCでプログラミングするのが初めてであり、さまざまなコード分析ツールと書式設定ツールに非常に惹かれていclangます。 したがって、私の質問の要点は次のとおりです。それclangを使用clangしてビルドしているときに、ヒントに従ってフォーマットおよび分析ツールを使用すると問題が発生する可能性がありますgccか?たとえば、一部の警告は、内部表現gccが使用しないか、バイトコードclangが生成しgccないものから発生する可能性があります。 警告ヒントが意味をなすように、gccコンパイルパラメータ(主にターゲットアーキテクチャと最適化レベル)を自動的に渡す良い方法はありclangますか? 私が精通していることgccとそのエラー報告を追加します。私は、より適切な言葉でわかりやすい警告だけでなく、より多くの(関連する)警告とエラーを取得することに関心があります。したがって、1 日の終わりclangに構築するために、その内部表現に基づいて生成できる追加のヒントを信頼できない場合、私はこれを行うことにあまりgcc興味がありません。 私は多くのコンテキストを含めたので、どんな発言をしても、私が持ち出せなかった根本的な質問に気軽に答えてください。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.