タグ付けされた質問 「compiler-construction」

タグcompiler-constructionは、コンパイラーのプログラミングに関する質問、またはコンパイラーの詳細な内部動作に関する質問に適用する必要があります。特定のコンパイラの*使用*またはコンパイルエラーに関する質問には使用しないでください。

16
CおよびC ++の静的変数はどこに保存されますか?
実行可能ファイルのどのセグメント(.BSS、.DATA、その他)に静的変数が格納されているため、名前の衝突が発生しませんか?例えば: foo.c: bar.c: static int foo = 1; static int foo = 10; void fooTest() { void barTest() { static int bar = 2; static int bar = 20; foo++; foo++; bar++; bar++; printf("%d,%d", foo, bar); printf("%d, %d", foo, bar); } } 両方のファイルをコンパイルして、fooTest()とbarTestを繰り返し呼び出すメインにリンクすると、printfステートメントは個別に増分します。fooおよびbar変数は翻訳単位に対してローカルであるため、理にかなっています。 しかし、ストレージはどこに割り当てられていますか? 明確にするために、ELF形式でファイルを出力するツールチェーンがあることを前提としています。したがって、これらの静的変数のために実行可能ファイルに予約されたスペースが必要になると思います。 議論のために、GCCツールチェーンを使用すると仮定します。


4
C#コンパイラはどのようにしてCOMタイプを検出しますか?
編集:私は結果をブログ投稿として書きました。 C#コンパイラは、COMタイプを魔法のように扱います。たとえば、このステートメントは正常に見えます... Word.Application app = new Word.Application(); ...それがApplicationインターフェースであることを理解するまで。インターフェイスのコンストラクターを呼び出しますか?ヨイクス!これは実際にはへの呼び出しとへの呼び出しに変換さType.GetTypeFromCLSID()れActivator.CreateInstanceます。 さらに、C#4では、refパラメーターに非ref引数を使用でき、コンパイラーはローカル変数を追加して参照渡しし、結果を破棄します。 // FileName parameter is *really* a ref parameter app.ActiveDocument.SaveAs(FileName: "test.doc"); (うん、たくさんの引数が足りません。オプションのパラメーターはいいのではないですか?:) 私はコンパイラの動作を調査しようとしています、そして私は最初の部分を偽造することに失敗しています。私は問題なく2番目の部分を行うことができます。 using System; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; [ComImport, GuidAttribute("00012345-0000-0000-0000-000000000011")] public interface Dummy { void Foo(ref int x); } class Test { static void Main() { Dummy dummy = null; dummy.Foo(10); …

11
.pyファイルを解析し、ASTを読み取って変更し、変更したソースコードを書き戻す
プログラムでpythonソースコードを編集したい。基本的に、.pyファイルを読み取ってASTを生成し、変更されたpythonソースコード(つまり、別の.pyファイル)を書き戻します。 astまたはなど、標準のPythonモジュールを使用してPythonソースコードを解析/コンパイルする方法がありますcompiler。ただし、ソースコードを変更して(この関数宣言を削除するなど)、変更したpythonソースコードを書き戻す方法をサポートしているものはないと思います。 更新:これを実行したい理由は、Python用のミューテーションテストライブラリを記述したいためです。ほとんどの場合、ステートメント/式を削除し、テストを再実行して、何が壊れるかを確認します。


3
C#コンパイラはどの言語で書かれていますか?
私は、ソースコードを見てhttp://referencesource.microsoft.com/、すべてのソースコードは、C#である表示されます。 新しいC#コンパイラプラットフォーム(Roslyn)のソースコードも確認しましたが、これもC#に含まれています。そんなことがあるものか?C#言語コンパイラはC#で記述されていますか?それとも私は明白な何かを見逃していますか?C#コンパイラがC#で記述されている場合、どのように機能しますか?

2
sjljとdwarfとsehの違いは何ですか?
プロジェクトのコンパイルに使用するコンパイラを決定するのに十分な情報が見つかりません。プロセスをシミュレートするさまざまなコンピューター上にいくつかのプログラムがあります。Linuxでは、GCCを使用しています。すべてが素晴らしいです。私はコードを最適化することができます、それは速くコンパイルし、それほど多くのメモリを使用しません。 私はMSVCおよびGCCコンパイラーで独自のベンチマークを行います。後で、(サブアーキテクチャごとに)わずかに高速なバイナリが生成されます。コンパイル時間はMSVCよりはるかに長いですが。 そこで、MinGWを使用することにしました。ただし、例外処理メソッドとそのMinGWでの実装に関する説明は見つかりません。異なるオペレーティングシステムとアーキテクチャに異なるディストリビューションを使用できます。 考慮事項: コンパイル時間とメモリは、私の使用にとって重要ではありません。重要なのはランタイムの最適化だけです。プログラムが十分に高速である必要があります。遅いコンパイラでも問題ありません。 OS:Microsoft Windows XP / 7/8 / Linux アーキテクチャ:Intel Core i7 / Core2 /およびXPを実行している非常に古いi686:P

8
if-return-returnまたはif-else-return?を使用する方が効率的ですか?
とのifステートメントがあるとしreturnます。効率の観点から、私は使用する必要があります if(A > B): return A+1 return A-1 または if(A > B): return A+1 else: return A-1 コンパイルされた言語(C)またはスクリプト化された言語(Python)を使用するとき、どちらを好むべきですか?


1
TargetedPatchingOptOut:「NGen画像の境界を越えてインライン化するために重要なパフォーマンス」?
リフレクターを使用していくつかのフレームワーククラスを調べたところ、多くのメソッドとプロパティに次の属性があることがわかりました [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] 上記のコメントをどこかで見たことがあり、フォローアップしたことはないと確信しています。 誰かがこれがC#およびその他のコンテキストで何を意味するか教えていただけませんか?


9
再帰関数をインライン化できますか?
inline int factorial(int n) { if(!n) return 1; else return n*factorial(n-1); } 私がこれを読んでいたとき、上記のコードがコンパイラによって正しく処理されない場合、「無限コンパイル」につながることがわかりました。 コンパイラーは関数をインライン化するかどうかをどのように決定しますか?

4
エラー:書き込み可能なアトミックプロパティは、合成されたセッター/ゲッターをユーザー定義のセッター/ゲッターとペアにすることはできません
私は最近、古いXcodeプロジェクト(以前は問題なくコンパイルされていました)をコンパイルしようとしましたが、この形式のエラーがたくさん表示されています。 error: writable atomic property 'someProperty' cannot pair a synthesized setter/getter with a user defined setter/getter これらのエラーの原因となるコードパターンは常に次のようになります。 // Interface: @property (retain) NSObject * someProperty; // Implementation: @synthesize someProperty; // to provide the getter - (void)setSomeProperty:(NSObject *)newValue { //.. } エラーが発生している理由がわかります。プロパティアクセサー(ゲッターとセッターの両方)を合成するようコンパイラーに指示し、その後すぐに手動でセッターをオーバーライドします。そのコードは常に少しにおいがしていました。 それで、これを行う適切な方法は何ですか?の@dynamic代わりに使用する場合は@synthesize、ゲッターも作成する必要があります。それが唯一の方法ですか?

22
Windows用のCコンパイラ?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。事実、参考文献、専門知識によって回答が裏付けられることを期待していますが、この質問は、討論、議論、投票、または拡張ディスカッションを求める可能性があります。この質問が改善され、場合によっては再開できると思われる場合は、ヘルプセンターにアクセスしてください。 7年前休業。 Cコンパイラとしてgccを使用してLinuxで問題なく作業していますが、Windowsソリューションが必要です。何か案は?BloodshedのDev-C ++を見てきましたが、もっと多くのオプションを探していました。

13
コンパイル時に1 + 2 + 3 +…+ 1000を計算するようにC#、C ++、またはJavaコンパイラを駆動する方法は?
最近のインタビューで、私は本当に奇妙な質問をされました。インタビュアーは、コンパイラー機能だけを使用して1 + 2 + 3 + ... + 1000をどのように計算できるかと尋ねました。つまり、プログラムを作成して実行することはできませんが、コンパイル中にこの合計を計算し、コンパイルが完了したときに結果を出力するようにコンパイラーを駆動できるプログラムを作成する必要があります。ヒントとして、私はコンパイラーのジェネリックとプリプロセッサー機能を使用できると私に言った。C ++、C#、またはJavaコンパイラを使用できます。何か案は??? この質問は、ここでループを行わずに合計を計算することとは関係ありません。また、合計はコンパイル時に計算する必要があることに注意してください。C ++コンパイラ指令を使用して結果だけを出力することはできません。 投稿された回答の詳細を読んで、C ++テンプレートを使用してコンパイル中に問題を解決することをメタプログラミングと呼びます。これは、C ++言語の標準化の過程でErwin Unruh博士によって偶然発見された手法です。このトピックの詳細については、メタプログラミングのWikiページをご覧ください。Javaアノテーションを使用してJavaでプログラムを作成することは可能であるようです。あなたは見てとることができmaressの下に答えを。 C ++でのメタプログラミングに関する素晴らしい本がこれです。興味があれば見てみる価値があります。 有用なC ++メタプログラミングライブラリは、BoostのMPL this linkです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.