2

バイナリ コンパイラがソース コードを目的のプラットフォームのバイナリに変換することに気付きました。当然のことですが...しかし、コンパイラがそのように機能する場合、同じコンパイラをx86、ARM、MIPSなどの異なるシステムに使用するにはどうすればよいでしょうか?

バイナリのビルド方法を知るために、ハードウェア プラットフォームの機械語を「知っている」べきではありませんか? コンパイラ (gcc など) は、サポートされているすべてのプラットフォームの機械語を認識していますか?

そのシステムはどのようにして可能になり、どのようにしてコンパイラーを多くのプラットフォームに対して同時に最適化できるのでしょうか?

4

4 に答える 4

4

はい、サポートするすべてのプラットフォームの機械語を「知っている」必要があります。これは、マシンコードを生成するために必要です。ただし、コンパイルは複数のステップからなるプロセスです。通常、コンパイルの最初のステップはほとんどのアーキテクチャに共通です。

ウィキペディアから取得

コンパイラの構造

コンパイラは、高級言語のソースプログラムと基盤となるハードウェアをブリッジします。

コンパイラには

  1. プログラムの構文の正しさを判断し、

  2. 正確で効率的なオブジェクトコードを生成し、

  3. 実行時の組織、および

  4. アセンブラやリンカの規則に従って出力をフォーマットします。

コンパイラは、フロントエンド、ミドルエンド、バックエンドの3つの主要部分で構成されています。

フロントエンド

プログラムがプログラミング言語の構文とセマンティクスに関して正しく記述されているかどうかをチェックします。ここでは、合法および違法なプログラムが認められています。エラーがある場合は、有用な方法で報告されます。タイプチェックは、タイプ情報を収集することによっても実行されます。次に、フロントエンドは、ミドルエンドで処理するためのソースコードの中間表現またはIRを生成します。

ミドルエンド

最適化が行われる場所です。最適化のための典型的な変換は、役に立たないまたは到達不能コードの削除、定数値の検出と伝播、あまり頻繁に実行されない場所への計算の再配置(たとえば、ループ外)、またはコンテキストに基づく計算の特殊化です。ミドルエンドは、次のバックエンドに対して別のIRを生成します。ほとんどの最適化の取り組みは、この部分に焦点を合わせています。

バックエンド

IRをミドルエンドからアセンブリコードに変換する責任があります。ターゲット命令は、IR命令ごとに選択されます。レジスタ割り当ては、可能な場合、プログラム変数にプロセッサレジスタを割り当てます。バックエンドは、並列実行ユニットをビジー状態に保つ方法、遅延スロットを埋める方法などを理解することにより、ハードウェアを利用します。最適化のためのほとんどのアルゴリズムはNPにありますが、ヒューリスティック手法は十分に開発されています。

コンパイラの構造を説明するこの記事と、クロスコンパイラを扱うこの記事の詳細。

于 2013-03-16T20:28:49.260 に答える
2

http://llvm.org/プロジェクトは、この点に関するすべての質問に答えます:)一言で言えば、クロスHWコンパイラーは、コードの「中間表現」を出力します。これは、HWに依存せず、ネイティブツールを介してカスタマイズされます。鎖

于 2013-03-16T20:29:09.427 に答える
2

はい、それは可能です、それはクロスコンパイラと呼ばれています。コンパイラは通常、最初に現在のマシンでは理解できないオブジェクトコードを生成しますが、別のコンパイラを使用してデスティニーマシンに移行できます。次に、オブジェクトコードが再度「コンパイル」され、ターゲットマシンの外部ライブラリにリンクされます。

TL; DR:はい、コンパイラはターゲットコードを知っていますが、別のハードウェアでコンパイルできます。

添付のリンクを読んで情報を入手することをお勧めします。

于 2013-03-16T20:30:39.113 に答える
2

すべてのプラットフォームには独自のツールチェーンがあり、ツールチェーンにはgcc、gdb、ld、nmなどが含まれます。

今のところgccの具体例を見てみましょう。GCCソースコードには、アーキテクチャに依存する部分と独立した部分を含む多くの層があります。アーキテクチャに依存する部分には、スタック、関数呼び出し、浮動小数点演算などのアーキテクチャ固有のものを処理するためのプロシージャが含まれています。ARMなどの特定のアーキテクチャ用にgccソースコードをクロスコンパイルする必要があります。参考までに、その手順をここで確認できます:-http: //www.ailis.de/~k/archives/19-arm-cross-compiling-howto.html#toolchain

このアーキテクチャに依存する部分は、機械語操作の処理を担当します。

于 2013-03-16T20:30:42.747 に答える