0

この投稿では、3 つの異なる質問を蓄積しましたが、同様のコンテキストについてです。以下同じです。

  1. ソースから実行可能ファイルへの一連の手順
  2. コンパイラの 32/64 ビット バージョン
  3. コンパイラに対する c データ型のサイズの依存性

Q1: ソースから実行可能ファイルへの一連の手順

ソースファイルから実行可能ファイルを生成する手順は次のとおりだと思います

  • 書かれたソースファイルは、高/中レベル言語のいずれかで書かれ、コンパイラによって前処理されます。
  • GCC/G++を使用する場合、gcc -save-temps -cを使用して、それぞれアセンブリ (読み取り可能) とオブジェクト コード (人間が読み取れない) である.S ファイルと .Oファイルを生成します。
  • 最終段階では、このオブジェクト コードをリンクして不明なシンボルを解決し、マシン (または) 実行可能コードを作成します。

ここでの質問は、これらの仮定が正しいかどうかです。しばしば、オブジェクトとマシン コードという用語が同じ意味で使用されているのを目にします。2つの正確な違いは何ですか。

Q2: コンパイラの 32/64 ビット バージョン

Q1 の上記の手順のどこに、コンパイラの種類が影響しますか。変更されるのは、生成されたアセンブリ コードですか?

Q3: c データ型のサイズのコンパイラ依存性

C プログラミングに関しては、コンパイラの種類 (または) ハードウェアの種類に依存するデータ型のサイズです。これらの要因の依存性について詳しく説明してください。スタック オーバーフローで Q3 との議論がいくつか見られますが、これについてはまだ困惑しています。

4

1 に答える 1

2

Q1

だいたいその通りですが、組み立て段階は無いかもしれません。そして、「前処理済み」は、意味がたくさん詰まった素敵な小さな言葉です。

多くの場合、オブジェクト コードとマシン コードはほとんど同じです。オブジェクトコードには、マシンコードまたは解釈可能なコード、まだマシンコードではないコードが含まれる場合があります。多くの場合、オブジェクト コードは実行のための最終的なコードではなく、リンカーによるさらなる処理が必要です。マシンコードを含む実行可能ファイルは、多くの場合、リンカーによる処理と同様の処理を必要としますが、この部分は OS によって行われます。実行可能ファイルを再配置可能にすること、つまり、メモリ内の任意の場所にロードしてそこで実行できることが望ましいです。再配置には、実行可能ファイルがロードされた後、実行される前に、実行可能ファイル内のアドレスを修正することが含まれます。実行時の DLL へのリンクは、OS によって実行されるもう 1 つのリンカーのような機能です。

Q2

「前処理」は、型とそのサイズが現れ始める最初のステップです。コンパイラは、型チェック、型変換、およびコード/データ生成を実行する必要があります。これらすべてのステップ タイプは無視できません。0xFFFF はintですかunsigned int? コンパイラはポインタ用にどれくらいのメモリを予約する必要がありますか? 100 の配列にどのくらいのスペースを割り当てる必要がありdoublesますか? コンパイラはどのくらい正確に に昇格charsintsますか? コードの最適化についてはどうですか? これらすべての質問に答えるには、活字サイズを知る必要があります。間違いなく、結果のアセンブリまたはマシン コードはそれらに依存します。

Q3

理論的には、型のサイズはコンパイラによって異なります。実際には、ターゲット ハードウェアで直接サポートされていない型のシミュレーションの不要なオーバーヘッドを回避するために、ハードウェアでサポートされている型に直接対応する型を使用します。C は、その起源と性質においてほとんど移植可能なアセンブラであり、それはその多くの「奇妙さ」を説明するはずです (原始的すぎる、簡単に足を撃たれる、未定義の実装固有の動作が多数あるなど)。 )。

于 2012-09-26T10:34:51.757 に答える