web-dev-qa-db-ja.com

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

私はプロセッサが命令をどのように処理するかについての一般的な考えを持っていますが、私の時間はほとんど高級言語で作業しています。たぶん、アイアンの近くで作業する人は、いくつかの貴重な洞察を提供できます。

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

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

20
Evan Plaice

チューリング計算が可能なマシンを構築するには、one命令のみが必要であることがわかります。命令が1つだけあり、チューリング完全なこのクラスのマシンは、 One Instruction Set Computers と呼ばれるか、冗談めかして究極のRISC

36
Jörg W Mittag

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

プロセッサーを見ると、最も適切なものはおそらく マシンモデルの登録 です。これらの中で最も単純なもの(シンボルに関して)は、マルチテープの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に進みます

これも完了しています-これは Minskyレジスタマシン ですが、テープ内のデータには他の制約があります(個々のレジスタではなく状態を格納するゲーデル数である必要があります)

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


では、なぜこれらの超高機能プロセッサが代わりに使用されないのでしょうか?それらのためのコンパイラを書くのは本当に大変であり、あなたはプロセッサができる他の多くのことをあきらめます。レジスタの増分とループですべてを実行するのではなく、ビット単位のandaddを使用するのは本当にいいことです。これが、8つの命令を持つ Brainfuck というタイトルのお気に入りのプログラミング言語の基礎です。

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

コンパイラーtoBrainfuckを見つけることができますが、その中で単純なことをするのも楽しいものではありません。あなたが欲求不満を楽しんでいない限り、それは言語の目的です。

関連読書:

15
user40980

実装

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

movfuscator

https://github.com/xoreaxeaxeax/movfuscator

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

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

subleq

https://esolangs.org/wiki/Subleq

も参照してください

https://stackoverflow.com/questions/3711443/minimal-instruction-set-to-solve-any-problem-with-a-computer-program/38523869#38523869

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

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

ハードウェア的には、もっと単純なものを発明するのは簡単ではないと思います。

5
9000

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

ヨルグ・W・ミッタークは「1つ」と言ったが、ゼロはどうだろうか?

「プロセッサ」が「命令」を持っている必要があるとなぜ思いますか?

チューリングマシンはチューリングコンプリートプロセッサであり、「命令」自体では動作しません。 ルールがありますが、ルールはランダムアクセスメモリからフェッチされる命令ではありません。

アランチューリングが彼の代名詞のマシンを考えたとき、彼は「計算」とは何なのかという疑問に答えるために数学的手法を使用できるように、「計算」の可能な限り単純なモデルを探していました。

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

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

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

3
Solomon Slow