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

コンパイラは、あるプログラミング言語で記述されたソースコードを別のコンピュータ言語に変換するコンピュータプログラムです。

11
コンパイラーがコードを壊したかどうか、そしてそれがコンパイラーだったらどうすればよいかを知るにはどうすればよいですか?
あるレベルの最適化でコンパイルすると、C ++コードが機能しない場合があります。それは、コードを壊す最適化を行っているコンパイラかもしれませんし、コンパイラが感じることなら何でもできるようにする未定義の振る舞いを含むコードかもしれません。 より高い最適化レベルでのみコンパイルされたときに壊れるコードの一部があるとします。コードまたはコンパイラーであるかどうか、またコンパイラーである場合はどうすればよいですか?

8
コンパイラは開発以外で使用されていますか?
私の理解では、コンパイラは開発者がコードを実行可能(マシンコード)ファイルにコンパイルするためのものです。コンパイラは、クライアントのマシンまたはエンドユーザーシステムには拡張されません。 代わりに、開発者はコンパイラを使用してコードをマシンコードに変換し、アプリケーションとして使用するために他のマシンに転送します。 コンパイラには、このプロセス以外の機能がありますか?その場合、いつ使用されますか?
14 compiler 

4
cに構造体をパックする標準的な方法または標準的な代替手段はありますか?
CIでのプログラミングでは、GCC __attribute__((__packed__))属性を使用して構造体をパックすることが非常に重要であることがわかったので、揮発性メモリの構造化されたチャンクをバイトの配列に簡単に変換して、バスを介して送信したり、ストレージに保存したり、レジスタのブロックに適用したりできます。パックされた構造体は、バイトの配列として扱われる場合、パディングを含まないことを保証します。これは無駄であり、セキュリティリスクの可能性があり、ハードウェアとのインターフェースの場合に互換性がありません。 すべてのCコンパイラで動作する構造体をパックするための標準はありませんか?そうでない場合、私はこれがシステムプログラミングにとって重要な機能であると考える際に外れ値ですか?C言語の初期のユーザーは、構造体をパックする必要性を見つけられなかったか、何らかの代替手段がありましたか?

2
「ダングリングエルス問題」とスキャナーレス解析は何の関係がありますか?
Dangling Else問題に関するWikipediaの記事のこの文は理解できません。 [Dangling Elseの問題]は、コンパイラの構築、特にスキャナーレス解析でしばしば発生する問題です。 誰かがスキャナーレス解析技術がこの問題を悪化させる可能性があることを私に説明できますか?問題は文法にあるようです-曖昧だからです-解析手法の選択ではありません。私は何が欠けていますか?

3
コンパイラーがヘッダーファイルを2回インポートすることを避けられないのはなぜですか?
C ++の新機能!だから私はこれを読んでいた:http : //www.learncpp.com/cpp-tutorial/110-a-first-look-at-the-preprocessor/ ヘッダーガード ヘッダーファイルには他のヘッダーファイルを含めることができるため、ヘッダーファイルが複数回インクルードされる状況になる可能性があります。 そこで、これを回避するためにプリプロセッサディレクティブを作成します。しかし、私はわからない-なぜコンパイラがちょうどできないのか... 同じものを2回インポートしないのですか? ヘッダーガードはオプションです(ただし、明らかに良い方法です)ので、何かを2回インポートしたいというシナリオがあると思います。そのようなシナリオはまったく考えられませんが。何か案は?
13 c++  compiler 

6
「Cでアセンブラーを記述します。」なぜ低レベル言語の機械語翻訳機を高レベル言語で書くのですか?
私のマイクロプロセッサクラスのインストラクターが私たちに課題を与えて言った: 「Cでアセンブラーを作成します。」-私の最愛の教授 だから、私には少し非論理的に思えた。 私が間違っていなければ、アセンブリ言語は、機械語コードから高レベル言語の旅への最初のステップです。つまり、Cはアセンブリよりも高レベルの言語です。では、Cでアセンブラーを書く意味は何ですか?C言語がないのに、彼らは過去何をしていたのですか?彼らはマシンコードでアセンブラーを書いていましたか? 低レベル言語用の機械語翻訳を高レベル言語で書くのは意味がありません。 たとえば、そのアーキテクチャ用のCコンパイラさえない、まったく新しいマイクロプロセッサアーキテクチャを作成したとします。Cで記述されたアセンブラは、新しいアーキテクチャをシミュレートできますか?私はそれが役に立たないかどうかを意味しますか? ところで、GNU AssemblerとNetwide AssemblerはCで書かれていることを知っています。また、なぜそれらがCで書かれているのだろうかと思っています。 最後に、これは私たちの教授が私たちに与えた単純なアセンブラのソースコードの例です。 // to compile, gcc assembler.c -o assembler // No error check is provided. // Variable names cannot start with 0-9. // hexadecimals are twos complement. // first address of the code section is zero, data section follows the code section. …


6
コンパイラがすべてをインライン化しないのはなぜですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 コンパイラはインライン関数呼び出しを行う場合があります。つまり、呼び出された関数のコードを呼び出し元の関数に移動します。これにより、コールスタックのオン/オフを切り替える必要がないため、処理が少し速くなります。 だから私の質問は、なぜコンパイラはすべてをインライン化しないのですか?実行可能ファイルが著しく高速になると思います。 私が考えることができる唯一の理由は、実行可能ファイルが非常に大きいことですが、最近では何百GBものメモリが必要なのでしょうか?パフォーマンスの向上はそれだけの価値はありませんか? コンパイラがすべての関数呼び出しをインライン化しない他の理由はありますか?

1
並行性について推論するためにどの中間表現を使用できますか?
私は、コンパイラーがプログラマーに代わって並行性に関してインテリジェントな選択を行えるようにするために必要なものをよりよく理解しようとしています。たとえば、この問題には多くの困難な側面があることを理解しています。 競合状態がないことを確認する 同時に実行されるコードに、コードのセマンティックな意味に影響を与える副作用がないことを保証する コードで利用可能な並列度を考慮して、スレッドのスピンアップによるオーバーヘッドが価値があるかどうかを判断する 私の理解では、最新のコンパイラで使用される2つの主要な中間表現は、手続き型言語とオブジェクト指向言語の静的な単一割り当てと、関数型言語のスタイルを渡す継続です。これらの中間形式を使用して、上記の問題のいずれかを推論することは難しいようです。理論的には自動並列化の可能性が最も高い言語(副作用のない保証付きのHaskellのような純粋な関数型言語)でさえ、この分野での進歩は限られています。 私の質問は、この問題に取り組むためにどのような中間表現が実際に使用されているのかということです。学術研究で使用されているが、このタスクに適しているとは知らない他の表現はありますか?この問題は、コンパイルが中間表現に到達する前に抽象構文ツリーを操作することにより、コンパイラーのフロントエンドで根本的に解決する必要があるものですか?

4
LinuxでIntel C / C ++コンパイラを使用して、Windowsでリンクされるオブジェクトファイルを作成することは可能ですか?
どうして? ソースにもよりますが、Intelコンパイラは、x86アーキテクチャ用の最速の実行可能ファイルを生成するコンパイラである可能性が最も高いです(5〜100%の実行時間の改善)。 IntelはLinux向けのコンパイラを非商用ライセンスで無料で提供しています(Intel-Non-Commercial Software Developmentのページのどこかで無料だと思います)。学生向けの無料の非商用ライセンスもありますが、3つの主要なオペレーティングシステムすべてにツールが提供されていますが、このライセンスは適用されません(評判の制限によりリンクが削除されました)。 ゴール 私(非学生として)は、非商用ライセンスの下でインテルコンパイラを使用して実行速度を向上させ、Windows(および場合によってはOSバツ) 詳細: このドキュメントから推測したことは、Intelコンパイラはプラットフォームの主要なコンパイラと互換性のあるオブジェクトファイルを作成するということです。 サブ質問: WindowsおよびLinux(現在のバージョン)のgcc、g ++、cl、mingw32、icc、icpc、iclのオブジェクトファイル形式は何ですか? mingw32クロスコンパイラツールチェーンの一部を使用して目標を達成できますか? 生成されたオブジェクトファイルのメタデータが主な問題だと思いますか? ad 2: mingw32-objcopyは、Linux(おそらくELF)上のIntelコンパイラ出力をMicrosoft互換のCOFFに変換できるようです(ただし、再配置可能なオブジェクトファイルの例外があります)。誰かがこれが実際に機能することを確認できますか(重要でないアプリケーションの場合)、お願いします。

5
Cの静的ライブラリは眉をひそめていますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 共有ライブラリを持つための2つの引数があります。 ディスク容量を削減するのに役立ちます。 共有ライブラリが更新されると、それに依存するすべてのバイナリが更新を取得します。 共有ライブラリには主に1つの欠点があります。 彼らは依存性地獄を導入することができます。 デスクトップコンピューターでは、第1の利点はもはや成り立ちません。最近では、ディスク容量の無駄遣いはあまり問題になりません。 静的バイナリを使用すると、パッケージマネージャーの質が向上します。つまり、依存関係の地獄は過去のものになります。プログラムを追加すると、単にバイナリが追加されます。最終的には、ファイルを処理するためのフォルダー。プログラムを削除すると、単にこのファイルが削除されます。依存関係?消えた。 2番目の利点はまだありますが、デスクトップコンピューター上の静的バイナリの利点はそれよりも重要だと思います。つまり、Goのような新しい言語でさえ、共有ライブラリの利点にもかかわらず、すべてのバイナリをコンパイルします。これは利便性のためです。 共有ライブラリの主な利点の1つはもはや大したことではないので、Cの静的ライブラリはまだ嫌われていますか?もしそうなら、なぜですか?
11 c  compiler 

2
(C)異なるコンパイラで作成されたオブジェクトファイルはバイナリ互換ですか?
C ++コンパイラは互いに互換性がないことを理解しています。ただし、特にCについては、このトピックに関する情報を見つけることができませんでした。私は、C標準にはコンパイラが適切に実装できる余地を残していることを知っています。たとえば、ほとんどの(すべて?)データ型のサイズとアライメントは、最小限の保証のために実装定義で保存されます。したがって、2つのコンパイラー(または同じコンパイラーの2つのバージョン)は、多くの詳細について意見が一致しません。 異なるコンパイラでコンパイルされた2つのオブジェクトファイルが実際に適切にリンクされるという保証はないという考え方で正しいですか?たとえば、ポインタのサイズは、一方のオブジェクトファイルでは32ビット、もう一方のファイルでは64ビットになります。しかし、そうだとすると、なぜCライブラリはプリコンパイルされた形で配布されるのでしょうか?私が使用したのと同じコンパイラー(例えばgcc)を使用する、またはバイナリー互換性を確保するために使用されている事実上の標準を使用するという期待はありますか?そして、C言語オブジェクトファイルとリンクするときに、外国語インターフェイスを備えた他の言語は、物事が適切に整列することをどのように保証しますか?
11 c  compiler 


2
Dynamic Language RuntimeとC#4.0の関係は何ですか?
現在の.NETプラットフォーム上に、おそらくSchemeインタープリターである動的言語コンパイラー/インタープリターを作成したいとしましょう。Dynamic Language Runtime(DLR)を使用するか、C#4.0を使用して言語の動的機能を実装する方が良いでしょうか?または、両方が必要ですか? 特にIronSchemeとIronPython に関して、この分野で他の作業が行われたことを知っています。これらの言語は両方ともDLRを使用します。IronPythonはDLRの最新バージョン(約1年前)を使用し、IronSchemeは初期バージョンのDLRの大幅に修正された初期のフォークを使用すると考えています。しかし、これらのコンパイラが作成されたとき、C#4.0は利用できませんでした。 C#4.0の動的な機能を使用したRob ConeryのMassiveでの作業を見てきました。とても印象的です。しかし、C#は動的言語コンパイラ/インタープリターの本格的な努力に耐えるでしょうか?C#にない機能がDLRにありますか、それともDLRは本質的にC#4.0に組み込まれましたか?C#4.0のみを使用した場合、DLRの重要な機能が失われますか?

2
言語開発フレームワークの使用はどれくらい簡単ですか?
これは、フレームワークの形式で言語設計で使用される概念を抽象化することを目的とする抽象化プロジェクトと呼ばれるプロジェクトに焦点を当てた一連の質問の一部です。 構造タイピングに関連する別のページは、ここで表示できます。フレームワークに関する質問と投稿する適切な場所に関連するメタトピックは、ここにあります。 言語開発フレームワークを使用するのはどれくらい簡単ですか? 大規模なコード生成フレームワークを作成しました。このフレームワークには、言語固有のコンパイラーに結果を送信する機能も含まれています。使いやすさのトピックは、そのようなフレームワークの例の1つです。CodeDOM、またはCode Document Object Modelです。 マイクロソフトによって書かれたフレームワークであり、一般的なコード構造を記述しますが、一般に多くのことを省き(式強制)、特定の構成体の表現では少し抽象的である傾向がありました。 CodeDOM は、使用されるタイプが汎用インターフェイスである場合、PrivateImplementationTypeonの発行を適切に処理しませんCodeMemberMethodでした。CodeDOMは、最初のコードジェネレーターを作成した最初の理由でした。 フレームワークを簡素化するために私がやろうとしていることの1つは、何かをするために必要な作業量を減らし、アクションとそれらのアクションを構成する特定のタイプに焦点を当てることです。 ここに、私が書いているフレームワークがどのように機能するかを並べて比較します。 //Truncated... /* * * From a project that generates a lexer, this is the * state->state transition character range selection logic. * */ var nextChar = nextMethod.Parameters.Add(new TypedName("currentChar", typeof(char).GetTypeReference())); //... char start = rangeElement.B.Value.Start; char end = rangeElement.B.Value.End; …

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