web-dev-qa-db-ja.com

コンパイラはCPUのモデルごとに作成する必要がありますか?

コンパイラーを作成するときに、さまざまなプロセッサーとその命令を考慮する必要がありますか?指示は標準化されていますか?または、これを支援するために利用できるツールとテクニックは何ですか?例えば。特定のプロセッサモデルに固有の機械語命令を無視します。

6
br3w5

いいえ、命令セットは、ARM、x86、PPC、MIPS、Itanium、Sparcなど(またはそれらのバリアント)に適した、または単にマッピング可能なアセンブリを生成できるように「標準化」されていません。

ネイティブコードコンパイラはかなり複雑な獣です。彼らが行うすべての作業がプロセッサ固有であるとは限りません。すべての字句解析は言語に依存しますが、チップには関係しません。一部の最適化パスもハードウェアに依存しませんが、すべてではない可能性があります。適切なコードサイズと生の速度のトレードオフはターゲットによって異なる場合があります。

ある時点で、ネイティブコードを作成している場合は、ターゲットとするチップの詳細を知る必要があります。正しく、合理的に効率的な命令ストリームを生成するには、それらの「癖」(たとえば、メモリコヒーレンシプロパティ)と完全な命令セットに注意する必要があります。

自分を1つの命令セット(x86_64など)に制限したとしても、異なるブランドのチップには、考慮する必要がある異なる拡張機能があります。同じブランドの異なるモデルにも、命令セットの違いがあります(新しい機能が追加され、場合によっては古い機能が削除されます)。 「最小公分母」を守ることはうまくいくかもしれませんが、多くのものを見逃します。

それは、市場に出回るすべての新しい命令セットまたは拡張機能について、コンパイラを完全に書き直すことを意味しますか?もちろん違います。これらは増分変更であり、「マシン記述ファイル」またはコンパイラーがターゲット命令セットをモデル化するために使用するものにのみ変更される場合があります。
しかし、新しいISA=を完全に導入することは簡単な作業ではなく、ターゲットの詳細な知識が必要です。

自分でコンパイラをビルドする場合は、 [〜#〜] llvm [〜#〜] を確認してください。コンパイルしようとしている言語が何であれ、少なくとも「エミットネイティブコード」の部分に使用する可能性があります。

LLVMプロジェクトは、モジュール式で再利用可能なコンパイラおよびツールチェーンテクノロジーのコレクションです。

20
Mat

コンパイラは通常、多くの部分で構成されています。実際のコードの生成はほんの一部であり、小さなものです。したがって、新しいプロセッサ用のコンパイラを作成するには、古いプロセッサに小さな変更を加えるだけで済みます。

また、プロセッサーにはファミリーがあります。 (例えば)Intelが新しいプロセッサをリリースするとき、それは古いプロセッサがすることすべてをします。つまり、既存のコンパイラーを引き続き使用できます。新しいプロセッサで動作するプログラムを作成します。彼らは提供される新しい指示を使用しませんが、彼らはまだ働きます。

たとえば、かなり古いコンパイラでは32ビットプログラムしか生成されません。プログラムはまだ新しい64ビットコンピューターで実行されますが、wellは実行されません。

あなたはおそらくwant新しいコンパイラを真に利用するための新しいコンパイラですが、-必要ではありません。

2
Stig Hemmer