튜링 머신을 구현할 수있는 것을 구현하는 방법에는 여러 가지가 있습니다.
프로세서를 살펴보면 가장 적합한 프로세서는 아마도 레지스터 머신 모델 일 것 입니다 . 이 중 가장 단순한 (기호로) 다중 테이프 두 개의 기호 ( 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 행으로 이동
테이프의 데이터에 대한 다른 제약 조건이 있지만 Minsky 레지스터 시스템 은 완전히 완료됩니다 (개별 레지스터가 아닌 상태를 저장하는 Gödel 번호 여야 함)
그게 다야. 더 이상 없습니다.
그렇다면 왜 이러한 초박형 프로세서가 대신 사용되지 않습니까? 컴파일러를 작성하는 것은 정말 고통스럽고 프로세서가 할 수있는 다른 많은 일을 포기합니다. 비트 단위 and
를 사용하는 add
것이 좋으며 레지스터를 늘리고 루핑하여 모든 것을하려고 하는 것이 아닙니다. 8 가지 명령어가있는 Brainfuck 이라는 선호하는 프로그래밍 언어의 기초입니다 .
>
데이터 포인터를 증가
<
데이터 포인터를 줄입니다
+
데이터 포인터에서 데이터를 증가
-
데이터 포인터에서 데이터 감소
.
데이터 포인터에서 데이터를 출력
,
입력을 읽고 데이터 포인터에 데이터를 저장
[
포인터의 데이터가 0 인 경우 명령 포인터를 앞으로 이동하는 대신 일치하는 ]
명령 다음에 명령으로 이동하십시오.
]
포인터의 데이터가 0이 아닌 경우 명령 포인터를 앞으로 이동하는 대신 일치하는 ]
명령 후에 명령으로 다시 이동하십시오.
Brainfuck의 컴파일러 를 찾을 수는 있지만 간단한 일을하는 것은 재미가 없습니다. 언어의 목적인 좌절을 즐기지 않는 한.
관련 독서 :