チューリング完全なプロセッサを構築するために必要な命令の絶対最小セットは何ですか


19

プロセッサが命令を処理する方法についての一般的な考えはありますが、ほとんどの場合、高級言語で作業することに時間を費やしています。鉄の近くで働いている人が貴重な洞察を提供できるかもしれません。

プログラミング言語が基本的にプロセッサの命令セットの非常に高度な抽象化であると仮定すると、チューリング完全なマシンを作成するために必要な命令の最も基本的なセットは何ですか?

注:ハードウェアアーキテクチャの多様性については何も知りませんが、簡単にするために、ALU(必要な場合)と命令スタックを備えた典型的なプロセッサであると仮定します。*


コンピューターサイエンスSEは、同様の質問をするのに適した場所かもしれません。
オスカースコグ

ISAの命令の数が減少すると、命令の数の意味も低下します。ISAは、「最適な」RISCよりも命令が少ないと奇妙になります。命令が1つだけのISAは奇妙になります。//数値が増加し、ISAがCISCになると、さらに奇妙になります。//「奇妙な」は、もちろん多かれ少なかれ主観的です。
オスカーSkog社

回答:


35

チューリング計算が可能なマシンを構築するために必要な命令は1つだけです。1つの命令のみを持っていると呼ばれるチューリング完全には、マシンのこのクラスの一つの命令セットコンピュータまたはもやや冗談めかし究極のRISC


4
可能な限り最高の答えを打つための+1、ゼロ指示液が発見されない限り、(何も情報がありませんので、実際に、1つの命令コンピュータは時々 、ゼロ命令コンピュータと呼ばれている命令自体で見つかっ)
Cortのアモン-復活モニカ

4
はい。ただし、その1つの命令は、マシンのチューリングを完全にするものではありません。魔法は、命令がアドレス指定できるさまざまな特殊レジスターすべてにあります。あなたの答えは、OPは「コンピューター」を「フォン・ノイマン・アーキテクチャー」と同等であると指摘していると思いますが、実際には「コンピューター」カテゴリはそれよりもはるかに広いです。
ソロモンスロー

2
@jameslarge魔法は必ずしも特殊なレジスターにあるとは限りません。BitBitJump、SBNZ、SUBLEQ、およびSUBNEGは、レジスタをまったく必要とせず、それぞれ1つの命令だけで、ダムメモリを必要としません。
-8bittree

2
@ 8bittree、フン!奇妙だがチューリング完全なアーキテクチャを設計することは競争力のあるスポーツであることを忘れていたと思う。Jörgの答えを読んだとき、私は学部時代(1980年頃)に74LSシリーズチップから「1つの命令コンピューター」を構築し、それをプログラムしてDecSystem 10をエミュレートすることを計画していた友人を思い出しました。ウィキペディアのページで、彼のデザインが今日「トランスポートトリガードアーキテクチャ」と呼ばれることを知っています。彼が従ったかどうかはわかりません。
ソロモンスロー

2
@jameslarge:Intel MMUもチューリング完全です(特に、トラップメカニズム)。それは確かに非常に奇妙ですが、設計されているのとは逆であり、純粋な事故です。
ヨルグWミットタグ

15

チューリングマシンを実装できるものを実装する方法は多数あります。

プロセッサを見ているとき、最も適切なのはおそらくレジスタマシンモデルです。これらの中で最も単純なのは(シンボルの観点から)、マルチテープ2シンボル(markおよびblank)です。あなたは難解な、となく、かなり何かのために行く場合inc(r)dec(r)及びjz(r,z)(レジスタがあれば、ジャンプr命令にゼロであるzか)clr(r)(クリアr)、 、incje(i,j,z)ジャンプi、jは、命令zに等しい登録した場合)。

私は次のレジスターマシンの言及を見てきました:

  • inc(i、m)-レジスタiをインクリメントし、行mに移動します
  • jzdec(i、m1、m2)-レジスタiが0の場合は行mに進み、そうでない場合はiをデクリメントして行m2に行く

これも完全にチューリングです- テープ内のデータには他の制約がありますが、ミンスキーのレジスターマシンです(個々のレジスターではなく、状態を格納するゲーデル番号でなければなりません)

それでおしまい。これ以上何もない。


では、なぜこれらの超高リスクプロセッサが代わりに使用されないのでしょうか?彼らのためにコンパイラを書くのは本当に苦痛であり、プロセッサができる他の多くのことをあきらめます。bitwiseを持つことは本当に素晴らしいことであり、レジスタのインクリメントとループですべてをやろうandとするのaddではなく。これが、8つの命令を持つBrainfuckというタイトルのお気に入りのプログラミング言語の基礎です。

  • > データポインタをインクリメントします
  • < データポインタをデクリメントする
  • + データポインターでデータをインクリメントします
  • - データポインターでデータをデクリメントする
  • . データポインターでデータを出力する
  • , 入力を読み取り、データポインターにデータを保存する
  • [ポインターのデータがゼロの場合、命令ポインターを1つ前方に移動する代わりに、一致する]コマンドの後のコマンドに前方にジャンプします
  • ]ポインターのデータがゼロ以外の場合、命令ポインターを前方に移動する代わりに、一致する]コマンドの後のコマンドにジャンプして戻します

Brainfuckのコンパイラ見つけることができますが、簡単なことをするのは本当に楽しいことではありません。あなたがフラストレーションを味わわない限り、それは言語の目的です。

関連資料:


5

Post machineは、チューリング完全なデバイスの最も単純な形式であると思われます。ビットアドレス指定可能なメモリ、現在のデータの場所を指すアドレスレジスタ、および5つの命令が必要です。

  • 現在の場所にビットを設定します。
  • 現在の場所でビットをリセットします。
  • 次のアドレスに移動します(インクリメントデータアドレスレジスタ)。
  • 前のアドレスに移動します(デクリメントデータアドレスレジスタ)。
  • 現在のデータの場所にあるビットを確認してください。

ハードウェアの面でもっと単純なものを発明することは簡単ではないと思いますが、さらに削減されたものがおそらく存在します。


5

実装

この答えは、単一の命令セットCPU、コンパイラ、およびアセンブラの興味深い実装に焦点を当てます。

movfuscator

https://github.com/xoreaxeaxeax/movfuscator

movx86命令のみを使用してCコードをコンパイルし、単一の命令で十分であることを非常に具体的な方法で示します。

チューリングの完全性は論文で証明されているようです:https : //www.cl.cam.ac.uk/~sd601/papers/mov.pdf

サブレック

https://esolangs.org/wiki/Subleq

こちらもご覧ください

/programming/3711443/minimal-instruction-set-to-solve-any-problem-with-a-computer-program/38523869#38523869


3

チューリング完全なプロセッサを構築するために必要な命令の絶対最小セットは何ですか?

JörgW Mittag氏は「1つ」と言いましたが、ゼロはどうでしょうか。

「プロセッサ」には「命令」が必要だと思うのはなぜですか?

チューリングマシンはチューリング完全なプロセッサであり、「命令」そのものとしては動作しません。それは持っているルールを、しかし、ルールはランダム・アクセス・メモリからフェッチされた命令ではありません。

アランチューリングは、彼の名を冠したマシンを考えたときに、「計算」の可能な限り単純なモデルを探していました。

実際のチューリングマシンよりも単純なチューリング相当のマシンを設計するのは難しいでしょう。

FWIW、あなたが考えているタイプのプロセッサ---メモリから命令をフェッチし、それらをデコードし、実行し、同じメモリシステムに保存されたデータで動作するもの-フォンノイマンアーキテクチャとして知られています

https://en.wikipedia.org/wiki/Von_Neumann_architecture

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