チューリングマシンを実装できるものを実装する方法は多数あります。
プロセッサを見ているとき、最も適切なのはおそらくレジスタマシンモデルです。これらの中で最も単純なのは(シンボルの観点から)、マルチテープ2シンボル(mark
およびblank
)です。あなたは難解な、となく、かなり何かのために行く場合inc(r)
、dec(r)
及びjz(r,z)
(レジスタがあれば、ジャンプr
命令にゼロであるz
か)clr(r)
(クリアr
)、 、inc
(je(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のコンパイラを見つけることができますが、簡単なことをするのは本当に楽しいことではありません。あなたがフラストレーションを味わわない限り、それは言語の目的です。
関連資料: