튜링 머신이 시뮬레이션 할 수있는 작은 C 형 언어


11

나는 튜링 머신이 충분히 일반적인 컴퓨팅 모델임을 학생들에게 '설득'시키는 데 도움이되는 작은 언어를 찾고 있습니다. 즉, 익숙한 언어와 비슷하지만 튜링 머신에서 시뮬레이션하기 쉬운 언어입니다.

Papadimitriou는이 작업에 RAM 기계를 사용하지만 이상한 기계 (튜링 기계)를 다른 이상한 물체 (기본적으로 어셈블리 언어)와 비교하는 것이 많은 학생들에게 너무 설득력이 없을 것 같습니다.

모든 제안은 가장 환영받을 것입니다 (특히 권장 문헌이있는 경우)


7
컴퓨터가 원래 어셈블리 언어로 프로그래밍 된 이유는 다음과 같습니다. 컴파일러 나 인터프리터를 작성하는 것은 쉽지 않습니다 . 그리고 튜링 머신을위한 컴파일러 나 인터프리터를 작성하는 것은 아마도 더 어려울 것입니다.
피터 쇼어

PS와 다소 동의하지 않으면 TM 컴파일러는 팩토링 인스턴스를 SAT 또는 다른 학부 과정으로 변환하는 것보다 그리 어렵지 않습니다. 웹에서 최고의 튜링 머신 시뮬레이터를 참조하십시오 . 다음은 샘플 소스 코드를 사용하여 루비로 작성된 튜링 머신 컴파일러 의 예입니다 (고급 언어 용). 슬프게도 더 세련된 것들이없는 것 같습니다. 훌륭한 오픈 소스 프로젝트가 될 것입니다.
vzn

2
@OmarShehab, 편집은 질문을 첫 페이지로 펌핑합니다. 수정으로 인해 질문이 크게 개선되지 않으면 이전 질문을 편집하지 마십시오. 또한 첫 페이지에없는 많은 질문을 편집하는 것은 첫 번째 페이지에서 새로운 질문을 푸시하므로 좋지 않습니다. 감사.
Kaveh

@kaveh는 이해했다.
Omar Shehab

답변:


15
  • smnutm

    이것이 가장 간단한 접근 방법인지는 의심하지만 계산법 (다른 이유로 커버하고 싶을 수도 있음)에서 가장 기본적인 이론에 어떻게 의존 하는지를 좋아합니다.

    Andrej Bauer가 몇 달 전에 Mathoverflow에 대해 비슷한 질문에 답변 한 것으로 보입니다 .

  • C와 같은 언어로 설정하면 의미가 다소 복잡하기 때문에 경로가 훨씬 거칠어집니다.

    1. Turing 머신이 동시에 스택과 힙을 시뮬레이션 할 수 있음을 보여주십시오.
    2. 스택으로 변수를 구현하는 방법을 보여주고
    3. 스택으로 프로 시저 호출을 구현할 수 있음을 보여줍니다.

    이것은 정직하게 컴파일러 클래스의 내용 중 많은 부분입니다.


7

저학년 저의 Comp 이론은 단일 테이프 Turing 기계가 다중 테이프 Turing 기계를 구현할 수 있음을 증명함으로써 시작되었습니다. 이 프로그램은 변수 선언을 처리합니다. 프로그램에 6 개의 변수 선언이있는 경우 7 개의 테이프 튜링 머신 (각 변수에 대한 테이프 및 "등록"테이프)에서 쉽게 구현하여 산술 및 동등성 검사와 같은 작업을 수행 할 수 있습니다. 테이프). 그런 다음 기본 FOR 및 WHILE 루프를 구현하는 방법을 보여 주었고, 그 시점에서 기본 Turing-complete C와 유사한 언어를 사용했습니다. 어쨌든 만족 스러웠습니다.


6

Turing 머신이 일반적인 계산 모델이라는 것을 스스로 확신시키는 방법에 대해 지금 생각하고 있습니다. 나는 Sipser와 같은 일부 표준 교과서에서 Church-Turing 논문의 표준 처리가 완벽하지 않다는 것에 동의합니다. 다음은 Turing 머신에서 더 잘 알려진 프로그래밍 언어로 어떻게 전환 할 수 있는지에 대한 스케치입니다.

블록 구조의 프로그래밍과 언어 고려 ifwhile함께 문 비 재귀 라는 정의 기능 및 서브 루틴 부울 확률 변수 일반적인 부울 표현을 단일 바운드 부울 배열 tape[n]정수 배열 포인터를 n증가 또는 감소 될 수 n++또는 n--. 포인터 n는 처음에는 0이고 배열 tape은 처음에는 모두 0입니다. 따라서이 컴퓨터 언어는 C와 비슷하거나 Python과 유사 할 수 있지만 데이터 형식에는 매우 제한적입니다. 사실, 그것들은 너무 제한되어 있으므로 n부울 식에 포인터를 사용할 수있는 방법조차 없습니다 . 그것을 가정tape오른쪽에만 무한대 n입니다. 음수 이면 포인터 언더 플로 "시스템 오류"를 선언 할 수 있습니다 . 또한, 우리 언어에는 exit부울 답변을 출력하기위한 하나의 인수가 있는 문장이 있습니다.

그런 다음 첫 번째 요점은이 프로그래밍 언어가 튜링 머신에 적합한 사양 언어라는 것입니다. 테이프 배열을 제외하고는 코드에 선언 된 모든 변수의 상태, 현재 실행 라인 및 서브 루틴 스택의 상태 만 한정되어 있음을 쉽게 알 수 있습니다. 후자는 재귀 함수가 허용되지 않기 때문에 유한 한 양의 상태 만 있습니다. 이 유형의 코드에서 "실제"튜링 머신을 생성하는 "컴파일러"를 상상할 수 있지만 그 세부 사항은 중요하지 않습니다. 요점은 우리는 꽤 좋은 구문을 가지고 있지만 매우 원시적 인 데이터 유형을 가진 프로그래밍 언어를 가지고 있다는 것입니다.

구성의 나머지 부분은 유한 한 라이브러리 함수 목록과 사전 컴파일 단계를 사용하여이를보다 실용적인 프로그래밍 언어로 변환하는 것입니다. 다음과 같이 진행할 수 있습니다.

  1. 프리 컴파일러를 사용하면 부울 데이터 유형을 ASCII와 같이 더 크지 만 유한 한 기호 알파벳으로 확장 할 수 있습니다. 우리는 tape이 더 큰 알파벳으로 값을받는 다고 가정 할 수 있습니다 . 포인터의 언더 플로를 방지하기 위해 테이프의 시작 부분에 마커를두고 테이프의 끝 부분에 움직일 수있는 마커를 두어 TM이 테이프에서 무한대로 스케이팅되는 것을 방지 할 수 있습니다. 심볼 사이의 임의의 이진 연산과 부울 for ifwhile명령문으로의 변환을 구현할 수 있습니다 . (실제로 if사용할 수 while없는 경우에도 구현할 수 있습니다.)

  2. kkiik

  3. 우리는 하나의 테이프를 기호 값 "메모리"로 지정하고 다른 테이프는 부호없는 정수 값 "레지스터"또는 "변수"로 지정합니다. 정수는 종료 표시와 함께 리틀 엔디안 바이너리에 저장합니다. 먼저 레지스터의 사본과 레지스터의 이진 감소를 구현합니다. 이를 메모리 포인터의 증가 및 감소와 결합하여 심볼 메모리의 랜덤 액세스 탐색을 구현할 수 있습니다. 정수의 이진 가산 및 곱셈을 계산하는 함수를 작성할 수도 있습니다. 비트 단위 연산으로 이진 덧셈 함수를 작성하는 것은 어렵지 않고 왼쪽 시프트로 2를 곱하는 함수입니다. (또는 리틀 엔디안이기 때문에 실제로 올바른 시프트입니다.) 이러한 프리미티브를 사용하면 긴 곱셈 알고리즘을 사용하여 두 개의 레지스터를 곱하는 함수를 작성할 수 있습니다.

  4. 공식을 사용하여 메모리 테이프를 1 차원 기호 배열 symbol[n]에서 2 차원 기호 배열 로 재구성 할 수 있습니다 . 이제 메모리의 각 행을 사용하여 부호없는 정수를 종료 기호로 이진수로 표현하여 1 차원 랜덤 액세스 정수 값 메모리를 얻을 수 있습니다. 메모리에서 정수 레지스터로 읽고 레지스터에서 메모리로 쓰는 것을 구현할 수 있습니다. 부호있는 부동 소수점 산술, 기호 문자열 등의 기능을 사용하여 많은 기능을 구현할 수 있습니다.symbol[x,y]n = (x+y)*(x+y) + ymemory[x]

  5. 하나의 기본 기능 만 사전 컴파일러, 즉 재귀 함수를 엄격하게 요구합니다. 이것은 해석 된 언어를 구현하는 데 널리 사용되는 기술로 수행 할 수 있습니다. 각각의 상위 수준의 재귀 함수에 이름 문자열을 할당하고 하위 수준 코드를 while일반적인 매개 변수 (호출 지점, 호출 된 함수 및 인수 목록)를 사용하여 호출 스택을 유지하는 하나의 큰 루프 로 구성합니다 .

이 시점에서이 구성에는 고급 프로그래밍 언어의 기능이 충분하므로 CS 이론보다는 프로그래밍 언어 및 컴파일러의 주제보다 더 많은 기능이 추가됩니다. 이 개발 된 언어로 Turing-machine 시뮬레이터를 작성하는 것도 이미 쉽습니다. 언어에 대한 자체 컴파일러를 작성하는 것은 쉽지 않지만 확실하게 표준입니다. 물론이 C와 같은 언어 나 Python과 같은 언어로 된 코드에서 외부 TM을 만들려면 외부 컴파일러가 필요하지만 모든 컴퓨터 언어로 수행 할 수 있습니다.

이 스케치 된 구현은 재귀 함수 클래스에 대한 논리학 자의 Church-Turing 논문뿐만 아니라 결정 론적 계산에 적용되는 확장 된 (다항식) Church-Turing 논문을 지원합니다. 다시 말해, 다항식 오버 헤드가 있습니다. 실제로, 우리가 RAM 머신 또는 (나의 개인적으로 좋아하는) 트리 테이프 TM를 받았다면, 이것은 RAM 메모리를 사용한 직렬 계산을 위해 다항 오버 헤드로 줄일 수 있습니다.


5

LLVM 컴파일러를 사용하면 새로운 아키텍처를 간단하게 "플러그인"할 수 있습니다. 그들은 이것을 새로운 백엔드 라고 부르며 , 그것을 수행하는 방법에 대한 자세한 지침과 예제 를 제공 합니다. RAM 튜링 머신을 대상으로하지 않으려면 랜덤 액세스 메모리와 관련하여 약간의 후프를 뛰어 넘어야한다고 생각하지만 LLVM이 생성하는 많은 프로젝트를 보았으므로 분명히 가능합니다. VHDL 또는 기타 매우 다른 기계 언어.

이것은 튜링 머신을위한 코드를 생성하는 최첨단 최적화 컴파일러 (LLVM이 GCC보다 더 많은 방식으로 향상됨)를 갖는 흥미로운 효과를 가질 것입니다.


1

나는 cs 이론에 있지 않지만 유용 할 수있는 somethint를 가지고 있습니다. 다른 접근 방식을 취했습니다. C의 작은 하위 세트로 직접 프로그래밍 할 수있는 간단한 프로세서를 설계했습니다. 어셈블리 코드는없고 C와 같은 코드 만 있습니다. 내가 사용한 것과 동일한 도구를 사용하고이 프로세서를 수정하여 Turing 머신 시뮬레이터를 설계 할 수 있습니다. 이 프로세서를 설계, 시뮬레이션 및 테스트하는 데 4 일이 걸렸습니다. 내가 사용한 도구를 사용하여 실제 VHDL 합성 코드를 생성 할 수도있었습니다. 진정한 작업 프로세서입니다.

프로그램은 다음과 같습니다. C-Like 조립 프로그램의 예

다음은 이러한 도구를 사용하는 프로세서 사진입니다. 프로세서 회로

도구 "Novakod Studio"는 고급 언어 하드웨어 설명 언어를 사용합니다. 예를 들어, 프로그램 카운터의 코드는 다음과 같습니다. psC-병렬 및 동기 C 코드 샘플 충분히 이해가 되시면 저에게 연락해야 할 공개 정보는 다음과 같습니다. https://repertoire.uqac.ca/Fiche.aspx?id=JjstNzsH0&link=1

루크


메모리 주소 지정은 고정 된 비트 수를 사용하여 주소를 찾습니까?
vzn

예, 그러나 메모리 크기를 변경하는 것은 간단합니다 (int DataMemory [SIZE].이 언어는 가변 길이 정수 (int : 10)를 지원하지만 FPGA를 대상으로하기 때문에 배열은 정적이고 차원이 일정합니다.
Luc Morin

1

사용자 GMB가 나타내는 아이디어를 여기에서 가져 오는 방법은 다음 같습니다 (테이프가 하나 인 기계를 사용하면 N 테이프를 단일 테이프에 인터레이스하고 한 번에 N 위치를 점프하여 해당 테이프 중 하나를 읽음으로써 N 테이프로 튜링 머신을 시뮬레이션 할 수 있습니다. N 테이프가있는 기계는 ...) 을 구현하고 간단한 RAM 기계를 구현하는 Turing 기계 프로그램을 작성할 수 있습니다 . RAM 시스템은 실제로 사용 가능한 LLVM 또는 GCC 백엔드가있는 단순한 실제 CPU 일 수 있습니다. 그런 다음 GCC / LLVM을 사용하여 해당 CPU에 대한 C 프로그램과 RAM 머신을 시뮬레이트하는 Turing 머신 프로그램을 교차 컴파일하고 시뮬레이션 된 RAM 머신이 GCC / LLVM 출력을 실행하도록하여 RAM 머신 시뮬레이션을 실행합니다. 튜링 머신 구현은 작은 C 파일에 맞는 매우 간단한 C 코드 일 수 있습니다.

RAM 시스템과 관련하여 32 비트 CPU가 8 비트 마이크로 컨트롤러로 시뮬레이션되고 시뮬레이트 된 32 비트 CPU가 Linux를 부팅하는 데모 프로젝트가 있습니다. 지옥만큼 느리지 만 저자 인 Dmitry Grinberg 에 따르면 효과가있었습니다. 아마도 Zylin CPU (GitHub 사용자 zylin)유사한 RAM 머신에 적합한 선택 일 수 있습니다. 다른 RAМ 기계 후보는 Niklaus Wirth 의 ProjectOberon 닷컴 일 수 있습니다 .

(내 텍스트의 "점"과 "com"은 2015_10_21에 cstheory.stackexchange에 내 계정을 등록했기 때문에 발생하며 웹 응용 프로그램은 사실에도 불구하고 초보자 사용자에게 두 개 이상의 링크를 허용하지 않습니다. 내가 다른 어리석은 스택 교환 계정에서 자동으로 볼 수는 있지만 트롤은 아닙니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.