最近のコンピューターの理論上のレジスタの最小数は?


10

私は学部の研究でコンパイラのコースを受講し、おもちゃのJavaのような言語でソースプログラムをおもちゃのアセンブリ言語(インタプリタがありました)にコンパイルするコンパイラを書きました。プロジェクトでは、「実際の」ネイティブ実行可能ファイルに密接に関連するターゲットマシンについて、次のようないくつかの仮定を行いました。

  • 専用スタックポインタ( "SP")レジスタによって追跡されるランタイムスタック
  • 専用ヒープポインター( "HP")レジスターによって追跡される動的オブジェクト割り当て用のヒープ
  • 専用のプログラムカウンタレジスタ(「PC」)
  • ターゲットマシンには16個のレジスタがあります
  • データの操作(ジャンプなどとは対照的)はレジスタ間操作です

レジスター割り当てを最適化として使用することについてユニットにたどり着いたとき、それは私に不思議に思いました:そのようなマシンのレジスターの理論上の最小数はいくつですか?コンパイラーで5つのレジスター(SP、HP、PC、および2進演算のストレージとして使用するための2つ)を使用したことを前提にしています。レジスター割り当てのような最適化は確かにより多くのレジスターを利用することができますが、スタックやヒープのような構造を維持しながら、より少ないレジスターでうまくいく方法はありますか?レジスタアドレス指定(レジスタ間操作)では少なくとも2つのレジスタが必要だと思いますが、3つ以上必要ですか?


「ヒープポインタ」は奇妙なアイデアのようです。スタックとは逆に、ヒープはLIFOではなく、プッシュ/ポップセマンティクスに縮小されません。むしろ、動的メモリ割り当てをmalloc / freeルーチンの呼び出しとして見る必要があります。
Yves Daoust

回答:


14

メモリアドレスによる直接メモリアクセスを許可する場合は、代わりにメモリロケーションを使用できるため、「レジスタ」は必要ありません。たとえば、場所0のメモリはプログラムカウンター、場所1にはスタックポインターなどがありますが、これは不正行為です。

不正行為を防ぐために、固定メモリ位置をレジスタとして使用できるため、直接メモリアクセスがないと仮定します。次に、スタックマシンに関するWikipediaの記事で説明されているように、プログラムカウンターとスタックポインターの2つのレジスターを使います。スタックはスタックポインターを介してのみアクセスでき、プログラムはプログラムカウンターを介してのみアクセスできます。

別の可能性は、カウンターマシンを使用することです。2カウンターマシンは完全なチューリングです。つまり、チューリングマシンが実行できるものはすべて計算できます。これもまた、カウンターマシンに関するウィキペディアの記事でうまく説明されています


返信してくれてありがとう!ただし、スタックマシンに関する記事では、マシンは直接メモリアクセスが可能(最上位のスタックエレメントで操作を実行し、結果を元に戻すことができる)であると述べています。カウンターマシンはあの記事を読んだ。私も同様に2-CMのTCの証明を読みましたが、どちらも実質的にすべてのRAMを2つのレジスタに格納する必要があり、これは私をだますのにさらに似ています。
BlueBomber 2013年

まあ、ある時点でそれはもう不正行為ではありません。スタック操作は、メモリ内の固定位置への直接アクセスを許可しない限り、不正行為ではありません。たとえば、スタックの最上位の3つの要素を回転できるようにしても問題ありません。とにかくあなたの質問は少し奇妙なので、何が不正行為で何が不正行為ではないのかを理解するのは無駄です。
Andrej Bauer

返信ありがとうございます。トピックが理論上の限界に関連しているときはいつでも、不正行為はさらに受け入れられません!ただし、それが有益ではないという意味ではありません。だまされないのは、まあ、だまされないところだと思います。最初の回答は有益でしたが、問題は、私たちのモデルがすべてのチューリングマシン、カウンターマシン、スタックマシンのモデルと重複していること、そして私たちの仮定(有限の有限数のレジスターと直接のメモリアクセスがないことを含む)が与えられると、レジスタが2つだけですか?
BlueBomber 2013年

1
プロセッサー、レジスター、メモリー・アクセスなどの実際の概念を突き止めるのは難しいので、この質問は奇妙だと思いますが、何かを証明できるようにするには、それらを突き止める必要があります。したがって、最終結果は、証明するものは何でも簡単に証明できることになりますが、それは、質問をどのように形式化するかに大きく依存します(「プロセッサー」、「レジスター」、「メモリー」などの理論的な概念は何ですか)。
Andrej Bauer

1
コンパイラの教科書では、少なくとも「証明する」という数学的な意味では、多くのことを証明することはできません。証明を可能にする何かに到達するには、ハードウェアの形式化でさらに一歩進める必要があります。とにかく、私たちは髪の毛を分割しており、私はすでにあなたに私の最善の答えを与えました。
Andrej Bauer

1

1970年代にGeneral Instrumentsによって導入され、現在も使用されているPICアーキテクチャには、次のレジスタがあります。

W register (not addressible)
01    Timer/Counter
02    Program Counter
03    Status
04    File-Select Register
05-07 One register for each I/O port
08-1F General-purpose registers/"memory"

一般的な命令は、レジスタを読み取り、読み取った値とWを使用して計算を実行し、計算結果をWまたは読み取られたレジスタに格納します。利用可能な計算の1つは、「Wを無視して読み取られた値」を生成します。もう1つは、「読み取った値を無視してWを取る」です。「XXを読み取り、次にWを取得し、読み取られた値を無視して結果をWに格納する」に対応するビットパターンは、NOPとさまざまな特別な命令に使用されます。

アドレス計算を可能にするために、プロセッサの実行ユニットは00のアドレスをエンコードする命令を監視し、ファイル選択レジスタの内容をアドレスに置き換えます。

Wレジスタを介してすべての値を供給する必要があることはボトルネックになる可能性がありますが、PICアーキテクチャは、同じ長さの命令ワードを使用する他のアーキテクチャよりも大きなワーキングセットとして持っています。PIC16C54(現在も製造されており、1970年代のPICとよく似ています)では、命令は12ビット長です。他の多くの16Cxxまたは16Fxxパーツでは、命令は14ビット長で、128バイトのアドレス空間に直接アクセスできます。プログラムのワーキングセットが命令セットのワーキングセットとよく一致する場合、「total + = value」のようなステートメント(「total」と「value」はtype unsigned charである)は、次のようにコンパイルされます。

movf  value,w
addwf total,f

ARMのようなものでは、変数のベースアドレスがプリロードされたレジスタがあっても、コードは次のようになります。

ldr    r0,[r7+value]
ldr    r1,[r7+total]
add    r1,r1,r0
str    r1,[r7+total]

多くの場合、コンパイラーはすべての操作でロードとストアを実行することを回避できますが、PICのようなものでは、より大きなワーキングセットの利点が、常にWを通過しなければならないという制限を上回ることがあります。

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