맨위로가기

랜덤 접근 기계

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

랜덤 접근 기계(RAM)는 카운터 머신 모델을 기반으로 하며, 간접 주소 지정과 하나 이상의 보조 레지스터를 추가하여 계산 능력을 향상시킨 추상적인 계산 모델이다. RAM은 유한 상태 기계의 지시에 따라, 레지스터의 주소를 직접 또는 포인터 레지스터를 통해 간접적으로 파생하며, 각 레지스터는 자연수를 저장한다. RAM은 무제한 메모리를 가지며, 명령어 집합에는 증가, 감소, 복사, 조건부 점프, 정지 등이 포함된다. 간접 주소 지정을 통해 RAM은 튜링 완전성을 가지며, 원시 재귀 함수 뿐만 아니라 μ-재귀 함수까지 계산할 수 있다.

더 읽어볼만한 페이지

  • 계산 모형 - 양자 컴퓨터
    양자 컴퓨터는 양자역학적 현상을 이용하여 정보를 처리하는 컴퓨터로, 큐비트를 통해 0과 1을 동시에 표현하여 특정 연산에서 기존 컴퓨터보다 빠른 속도를 보이며 암호 해독, 신약 개발 등 다양한 분야에 혁신을 가져올 것으로 기대된다.
  • 계산 모형 - 양자 회로
    양자 회로는 양자 컴퓨팅에서 양자 논리 게이트들을 연결한 회로로, 큐비트의 양자역학적 특성을 활용하여 계산을 수행하며 양자 계산의 핵심 요소로서 연구가 활발히 진행되고 있다.
랜덤 접근 기계
기본 정보
유형추상 기계
클래스상태 기계의 클래스
메모리 접근랜덤 접근 메모리
결정론적결정론적
관련 모델
관련 모델튜링 기계

2. 모델 소개

랜덤 접근 머신(RAM)은 가장 단순한 모델인 카운터 머신에서 발전된 형태이다. 카운터 머신과 달리 다음과 같은 두 가지 특징이 추가되었다.


  • 간접 주소 지정: 명령어에서 레지스터 주소를 직접 지정하는 대신, 다른 레지스터의 내용을 주소로 사용한다.
  • 보조 레지스터: 주로 누산기라고 불리는 하나 이상의 보조 레지스터를 추가하여 연산을 편리하게 한다.


이러한 특징으로 인해 RAM은 좀 더 일반적인 축적기 기반 컴퓨터 모델에 가까워졌다.[1]

2. 1. 정식 정의

랜덤 접근 기계(RAM)는 간접 주소 지정을 지원하는 다중 레지스터 카운터 머신과 동일한 추상적인 계산 기계 모델이다. 유한 상태 기계의 테이블 지시에 따라, 기계는 대상 레지스터의 주소를 (i) 지시 자체에서 직접 또는 (ii) 지시에서 지정된 "포인터" 레지스터의 내용(예: 숫자, 레이블)에서 간접적으로 구한다.

레지스터는 주소(자연수에 해당하는 고유하고 구별 가능한 지정/위치)와 내용(단일 자연수)을 모두 가진 위치로 정의된다.

  • [r]은 "주소 r을 가진 레지스터의 내용"을 의미한다. 여기서 "r"은 자연수, 문자(예: "A") 또는 이름이 될 수 있는 변수이다.
  • →는 "복사/저장" 또는 "대체"를 의미하지만, 원본은 유지된다.
  • 예시: [3] + 1 → 3;은 "주소 '3'을 가진 원본 레지스터의 내용에 1을 더하여 주소 '3'을 가진 대상 레지스터에 넣는다"는 의미이다. (원본과 대상은 동일한 위치). 만약 [3]=37이면, 37+1=38이 레지스터 3에 들어간다.
  • 예시: [3] → 5;는 "주소 '3'을 가진 원본 레지스터의 내용을 주소 '5'를 가진 대상 레지스터에 넣는다"는 의미이다. 만약 [3]=38이면, 이 숫자는 레지스터 5에 들어간다. 레지스터 3의 내용은 변경되지 않으므로, [3]은 계속 38이며 이제 [5]와 같다.

  • 직접 명령어는 명령어 자체에서 내용이 명령어의 대상이 될 원본 또는 대상 레지스터의 주소를 지정하는 명령어이다.
  • 간접 명령어는 "포인터 레지스터"를 지정하는 명령어이며, 그 내용은 "대상" 레지스터의 주소이다. 대상 레지스터는 원본 또는 대상이 될 수 있다. (다양한 COPY 명령어가 이에 대한 예시를 제공한다). 레지스터는 간접적으로 자신을 주소 지정할 수 있다.
  • 표준/관례가 없으므로 지시어의 매개변수로 "직접/간접"을 "d/i"로 축약하여 지정한다.
  • 예시: COPY (d, A, i, N )는 d 명령어 자체에서 원본 레지스터의 주소(레지스터 "A")를 직접 가져오지만, i 포인터 레지스터 N에서 대상 주소를 간접적으로 가져온다. 만약 [N]=3이면, 레지스터 3이 대상이고 명령어는 [A] → 3을 수행한다.

  • 원본 레지스터의 내용은 명령어에 의해 사용된다. 원본 레지스터의 주소는 (i) 명령어 자체 또는 (ii) 명령어에서 지정된 포인터 레지스터에 의해 간접적으로 지정될 수 있다.

  • 포인터 레지스터의 내용은 "대상" 레지스터의 주소이다.

  • 포인터 레지스터의 내용은 대상 레지스터를 가리킨다. "대상"은 원본 또는 대상 레지스터일 수 있다.

  • 대상 레지스터는 명령어가 결과를 저장하는 위치이다. 원본 레지스터의 주소는 (i) 명령어 자체 또는 (ii) 명령어에서 지정된 포인터 레지스터에 의해 간접적으로 지정될 수 있다. 원본 및 대상 레지스터는 동일할 수 있다.

2. 2. 카운터 머신 모델

카운터 머신은 레지스터를 땅속 구멍으로, 레지스터 안의 숫자를 조약돌 개수로 시각화할 수 있다.[1] 또는, 다중 테이프 튜링 기계로 시각화할 수도 있다. 카운터 머신의 기본 명령어 집합은 일반적으로 증가(INC), 감소(DEC), 0이면 점프(JZ), 정지(H) 등으로 구성된다.

Melzak (1961)은 카운터 머신을 쉽게 시각화할 수 있도록 제시했다.[1] 그의 "레지스터"는 땅에 있는 구멍이며, 이 구멍에는 조약돌이 들어있다. 각 명령어에 따라 "컴퓨터"(사람 또는 기계)는 이러한 구멍에 조약돌을 추가(INC 증분)하거나 제거(DEC 감소)한다. 필요에 따라 추가 조약돌은 무한 공급원에서 나오고, 과잉 조약돌은 다시 무한 공급원으로 돌아간다. 구멍이 조약돌을 수용하기에 너무 작으면 "컴퓨터"는 구멍을 더 크게 판다.

Minsky (1961)와 Hopcroft-Ullman 1979 (p. 171)은 "레지스터"만큼 많은 왼쪽 끝 테이프를 가진 다중 테이프 튜링 기계의 시각화를 제공한다. 각 테이프의 길이는 오른쪽으로 무제한이며, 각 사각형은 왼쪽 끝을 제외하고 비어 있으며, 왼쪽 끝은 표시되어 있다. 테이프 사각형 수로 측정한 테이프 "헤드"의 왼쪽 끝으로부터의 ''거리''는 "레지스터"의 자연수를 나타낸다. 테이프 헤드는 사각형의 수를 감소시키기 위해 왼쪽으로 이동하고, 증가시키기 위해 오른쪽으로 이동한다. 테이프에 표시를 인쇄하거나 지울 필요가 없다. 유일한 조건부 명령은 "표시된 경우 점프 명령"을 사용하여 헤드가 왼쪽 끝에 있는지 확인하는 것이다.

다음 명령어 "니모닉" 예로 "CLR (r)"은 임의적이다. 표준은 존재하지 않는다.

레지스터 기계는 유한 상태 머신 외부의 메모리로서, 무제한 개수의 이산적이고 고유하게 레이블이 지정된 위치의 모음을 가지며, "레지스터"라고 불리며 ''무제한'' 용량을 가진다. 이러한 레지스터는 자연수(0과 양의 정수)만 저장한다. 유한 상태 머신의 TABLE에 있는 순차적 명령어 목록에 따라 몇 가지 유형의 기본 연산이 이러한 "레지스터"의 내용에 대해 작동한다. 하나 또는 두 개의 레지스터의 내용을 테스트하고 유한 상태 머신을 기본 명령어 시퀀스에서 "분기/점프"하는 ''IF-THEN-ELSE'' 형식의 ''조건식''을 사용할 수 있다.

'''기본 모델 1''': Minsky (1961)의 시각화와 Lambek (1961)에 가장 가까운 모델:

명령어니모닉레지스터(들) "r"에 대한 동작유한 상태 머신의 명령어 레지스터, IR에 대한 동작
INCINC ( r )[r] + 1 → r[IR] + 1 → IR
DECDEC ( r )[r] - 1 → r[IR] + 1 → IR
0이면 점프JZ ( r, z )IF [r] = 0 THEN z → IR ELSE [IR] + 1 → IR
정지H[IR] → IR



'''기본 모델 2''': "후속자" 모델 (페아노 공리의 후속자 함수에서 이름을 따옴):

명령어니모닉레지스터(들) "r"에 대한 동작유한 상태 머신의 명령어 레지스터, IR에 대한 동작
CLRCLR ( r )0 → r[IR] + 1 → IR
INCINC ( r )[r] + 1 → r[IR] + 1 → IR
같으면 점프JE (r1, r2, z)IF [r1] = [r2] THEN z → IR ELSE [IR] + 1 → IR
정지H[IR] → IR



'''기본 모델 3''': Elgot-Robinson (1964)이 유계 및 비유계 RASP를 조사하는 데 사용했으며 CLEAR 대신 COPY가 있는 "후속자" 모델:

명령어니모닉레지스터(들) "r"에 대한 동작유한 상태 머신의 명령어 레지스터, IR에 대한 동작
COPYCOPY (r1, r2)[r1] → r2[IR] + 1 → IR
INCINC ( r )[r] + 1 → r[IR] + 1 → IR
같으면 점프JE (r1, r2, z)IF [r1] = [r2] THEN z → IR ELSE [IR] + 1 → IR
정지H[IR] → IR


3. 비공식적 설명

RA-기계(RAM의 다른 표현)는 다음으로 구성된다.


  • '''레지스터''' : 무한한 수의 메모리 위치로, 각 레지스터는 주소를 가지며, 이는 자연수 또는 0이다. 각 레지스터는 임의 크기의 자연수 하나 또는 0을 저장할 수 있다.
  • '''명령표''' : 실행 명령어를 포함하는 표이다. 정확한 명령 집합은 저자에 따라 다르다. 일반적인 명령어에는 증가, 감소, 0으로 초기화, 복사, 조건부 점프, 정지가 포함된다. 다른 명령어는 명령 집합의 명령어 조합으로 생성할 수 있으므로 불필요하다.
  • '''명령 레지스터'''(IR) : 명령표에서 실행 중인 명령어를 가리키는 특수 레지스터이다.


비슷한 개념에 대한 설명은, 유머를 포함하여, 난해한 프로그래밍 언어인 브레인퍽을 참조하라.[1]

4. 간접 연산

"간접 연산"은 일상생활에서 드물지 않게 찾아볼 수 있다. 보물찾기를 예로 들어보자.


  • '''보물 찾기'''


Tom & Becky's cave in pirate chest|톰과 베키의 해적 상자가 있는 동굴영어 위치로 가면 "보물"을 안내하는 지도를 찾을 수 있다.

# Tom & Becky's cave...|톰과 베키의 동굴...영어 위치로 가서 나무 상자를 찾을 때까지 판다.

# 상자 안에는 보물이 있는 위치에 대한 지도가 있다: under Thatcher's front porch|대처의 현관 앞영어

# under Thatcher's front porch|대처의 현관 앞영어 위치로 가서 콘크리트를 부수고 "보물"을 발견한다: 녹슨 문 손잡이 자루.

간접 참조는 Tom & Becky's cave...|톰과 베키의 동굴...영어의 해적 상자로 식별된 위치를 지정하며, 다른 모든 위치(자기 자신 포함)에 대한 ''포인터'' 역할을 한다. 그 내용(보물 지도)은 실제 행동이 일어나는 ''대상'' 위치 under Thatcher's front porch|대처의 현관 앞영어의 "주소"를 제공한다.

4. 1. 간접 주소 지정의 필요성

카운터 머신 모델은 다음과 같은 두 가지 주요 문제점을 가진다. 이러한 문제점은 간접 주소 지정을 통해 해결할 수 있다.[1]

  • 유한 상태 머신의 명령어 용량 제약: 유한 상태 머신은 상태와 명령어 크기가 제한되어 있어, 임의로 큰 상수를 레지스터로 직접 이동시키기 어렵다. 큰 상수가 필요한 경우 레지스터에서 시작하거나 유한한 수의 명령어를 사용해야 하지만, 유한 상태 머신에서 사용 가능한 명령어 수보다 더 큰 상수가 항상 존재한다.[1]
  • 유한 상태 머신의 레지스터 접근 제약: 카운터 머신의 유한 상태 머신은 레지스터를 이름/번호로 직접 호출해야 한다. 레지스터 수가 유한 상태 머신의 처리 능력을 초과하면, 경계 밖의 레지스터는 접근할 수 없게 된다. 예를 들어, 유한 상태 머신이 65,536개의 레지스터에만 접근할 수 있다면, 65,537번째 레지스터에는 접근할 수 없다.[1]


이러한 문제점을 해결하기 위해 간접 주소 지정 방식이 필요하다. 간접 주소 지정은 포인터 레지스터를 사용하여, 대상 레지스터 주소를 명령어 자체에서 직접 추출하는 대신 포인터 레지스터의 내용을 통해 간접적으로 추출한다. 포인터 레지스터를 사용하면, 유한 상태 머신은 제한된 수의 명령어로 무한한 수의 레지스터에 접근할 수 있다.[1]

쿡과 렉코우(Cook and Reckhow)는 고정된 프로그램이 입력 변화에 따라 무한한 수의 레지스터에 접근하려면 간접 명령어가 필요하다고 간결하게 설명한다.[1]

결론적으로, 무제한 간접 주소 지정을 통해 머신/모델을 설계하면, 잠재적으로 모든 레지스터를 지정(호출)할 수 있는 무제한 "주소" 레지스터를 제공할 수 있다. 이를 위해 일반적으로 무한 레지스터는 잠재적으로 무한 루프로 지워지고 증가(또는 감소)할 수 있는 능력이 필요하다. 포인터 레지스터는 "간접 주소 지정" 상황에서 상태 머신 테이블의 주소-피연산자 대신 자신의 내용을 대상 레지스터(자신 포함)의 주소로 제공한다.[1]

4. 2. 간접 주소 지정의 예시

일상생활에서 "간접 연산"의 개념은 드문 일이 아니다. 다음은 그 예시이다.

  • '''보물 찾기'''


Tom & Becky's cave in pirate chest|톰과 베키의 해적 상자가 있는 동굴영어 위치에 가면 "보물"을 안내하는 지도를 찾을 수 있다.

# Tom & Becky's cave...|톰과 베키의 동굴...영어 위치로 가서 나무 상자를 찾을 때까지 판다.

# 상자 안에는 보물이 있는 위치에 대한 지도가 있다: under Thatcher's front porch|대처의 현관 앞영어

# under Thatcher's front porch|대처의 현관 앞영어 위치로 가서 콘크리트를 부수고 "보물"을 발견한다: 녹슨 문 손잡이 자루.

간접 참조는 Tom & Becky's cave...|톰과 베키의 동굴...영어의 해적 상자로 식별된 위치를 지정하며, 다른 모든 위치(자기 자신 포함)에 대한 ''포인터'' 역할을 한다. 그 내용(보물 지도)은 실제 행동이 일어나는 ''대상'' 위치 under Thatcher's front porch|대처의 현관 앞영어의 "주소"를 제공한다.

4. 3. 간접 COPY 명령어

간접 주소 지정을 활용하는 가장 유용한 명령어 중 하나는 COPY 명령어이다. 이 명령어는 원본 레지스터의 내용을 대상 레지스터로 복사하는 기능을 수행한다. 이때 원본 레지스터와 대상 레지스터의 주소를 지정하는 방식에 따라 다양한 형태의 COPY 명령어가 존재할 수 있다.

  • 직접-직접 (Direct-Direct): 명령어 자체에 원본 레지스터와 대상 레지스터의 주소가 모두 명시된다.
  • 예시: `CPY (d, rs, d, rd)` - `rs` 레지스터의 내용을 `rd` 레지스터로 직접 복사한다.
  • 간접-직접 (Indirect-Direct): 원본 레지스터 주소는 간접적으로 지정되고, 대상 레지스터 주소는 직접 지정된다. 즉, 포인터 레지스터를 통해 원본 레지스터의 주소를 얻어온다.
  • 예시: `CPY (i, rsp, d, rd)` - `rsp` 레지스터(포인터)가 가리키는 주소에 있는 레지스터의 내용을 `rd` 레지스터로 복사한다.
  • 직접-간접 (Direct-Indirect): 원본 레지스터 주소는 직접 지정되고, 대상 레지스터 주소는 간접적으로 지정된다.
  • 예시: `CPY (d, rs, i, rdp)` - `rs` 레지스터의 내용을 `rdp` 레지스터(포인터)가 가리키는 주소의 레지스터로 복사한다.
  • 간접-간접 (Indirect-Indirect): 원본 레지스터와 대상 레지스터의 주소가 모두 간접적으로 지정된다. 즉, 두 개의 포인터 레지스터를 통해 각각 원본 레지스터와 대상 레지스터의 주소를 얻어온다.
  • 예시: `CPY (i, rsp, i, rdp)` - `rsp` 레지스터(포인터)가 가리키는 주소에 있는 레지스터의 내용을 `rdp` 레지스터(포인터)가 가리키는 주소의 레지스터로 복사한다.


이와 같이 간접 주소 지정을 활용하면 명령어의 유연성을 높일 수 있다. 예를 들어, 간접-직접 COPY 명령어를 사용하면 특정 포인터 레지스터가 가리키는 레지스터의 값을 다른 레지스터로 쉽게 복사할 수 있다. 이는 데이터 처리 과정에서 유용하게 활용될 수 있다.

5. 누산기(Accumulator)

누산기(Accumulator)는 일련의 산술 연산 동안 숫자를 누적하는 "산술 기관" 역할을 하는 레지스터이다.[1] 골드스타인과 폰 노이만은 누산기를 "숫자를 받아 기존 숫자에 더할 수 있고, 내용을 지울 수 있으며, 내용을 저장할 수 있는 병렬 저장 기관"으로 정의했다.[1] 이는 데스크톱 곱셈기, 표준 IBM 카운터, 릴레이 기계, 에니악 등 다양한 컴퓨터에서 공통적으로 사용되는 구성 요소이다.[1]

누산기는 산술 연산 결과를 누적하는 특별한 레지스터이다. 누산기 기반 RAM 모델은 (i) 누산기의 내용과 (ii) 지정된 레지스터의 내용을 사용하여 모든 2변수 산술 및 상수 연산(예: ADD (A, r), SUB (A, r))을 수행한다. 1변수 연산(예: INC (A), DEC (A) 및 CLR (A))은 누산기만 필요로 한다. 두 명령어 유형 모두 결과를 누산기에 저장한다.

예시는 다음과 같다.


  • INCA = [A] +1 → A
  • ADDA (rs) = [A] + [rs] → A
  • MULA (rs) = [A] * [rs] → A


누산기에 "A"와 같은 특정 이름을 사용하면 명령어에 누산기를 암시할 수 있다. 예를 들어, INC (A)는 INCA로 표현할 수 있다.

하지만 누산기는 산술 "연산"당 더 많은 명령어, 특히 '읽기-수정-쓰기' 명령어와 관련하여 대가를 치른다. 예를 들어, "레지스터 r2가 가리키는 레지스터의 내용을 간접적으로 증가"시키는 연산은 다음과 같은 과정을 거친다.

레이블명령어Ar2r378,426설명
...378,42617
INCi ( r2 ):CPY ( i, r2, d, A )17378,42617r2의 내용이 "17"이 들어 있는 r378,426을 가리킴: 이것을 A에 복사
INC ( A )18378,42617A의 내용 증가
CPY ( d, A, i, r2 )18378,42618r2가 r378,426을 가리킴: A의 내용을 r378,426에 복사



CPY 명령어를 누산기 없이 작성하면 명령어는 모호해지거나 빈 매개변수를 가져야 한다.


  • CPY ( d, r2, d, A ) = CPY (d, r2, , )
  • CPY ( d, A, d, r2 ) = CPY ( , , d, r2)


이러한 문제를 해결하기 위해 역사적으로는 두 CPY 명령어에 서로 다른 이름을 부여했다. 커누스의 가상 MIX 컴퓨터에서는 LOAD와 STORE라는 두 가지 이름을 사용하며, "i/d" 매개변수를 추가한다.

  • LDA ( d/i, rs ) =def CPY ( d/i, rs, d, A )
  • STA ( d/i, rd ) =def CPY ( d, A, d/i, rd )


원한다면 니모닉을 줄여 쓸 수 있다. 왜냐하면 적어도 하나의 소스 레지스터와 대상 레지스터는 항상 누산기 A이기 때문이다. (예: LDA (i/d, rs), STA (i/d, rd), CLRA, INCA, DECA, ADDA (rs), SUBA (rs), MULA (rs), DIVA (rs) 등)

6. 간접 주소 레지스터(N)

만약 우리 모델이 '무제한 누산기'를 가지고 있다면, 다른 모든 레지스터들을 '제한'할 수 있을까? 간접 주소를 파생할 무제한 레지스터를 적어도 하나 제공하기 전까지는 불가능하다.

최소한의 접근 방식은 그 자체를 사용하는 것이다(쇠네이게가 이렇게 한다).

또 다른 접근 방식(쇠네이게도 이렇게 한다)은 특정 레지스터를 "간접 주소 레지스터"로 선언하고 이 레지스터와 관련된 간접 참조로 제한하는 것이다(쇠네이게의 RAM0 모델은 직접 명령어뿐만 아니라 간접 명령어에도 A 및 N 레지스터를 사용한다). 다시 말하지만, 우리의 새로운 레지스터는 "iNdex", "iNdirect" 또는 "address Number"에서 유래된 "N"과 같은 기존 명칭이 없다.

최대 유연성을 위해 누산기 A에 대해 해왔던 것처럼 N을 증가, 감소, 지우기, 테스트, 직접 복사 등을 수행하는 또 다른 레지스터로 간주할 것이다. 마찬가지로 명령어를 방향 및 간접 참조를 제공하는 단일 매개변수로 축소할 수 있다. 예를 들어 다음과 같다.


  • LDAN (i/d) = CPY (i/d, N, d, A); 간접 참조 레지스터를 통해 누산기 로드
  • STAN (i/d) = CPY (d, A, i/d, N). 간접 참조 레지스터를 통해 누산기 저장


이것이 왜 그렇게 흥미로운 접근 방식일까? 적어도 두 가지 이유가 있다.

'''(1) 매개변수가 없는 명령어 집합:'''

쇠네이게는 그의 RAM0 명령어 집합을 만들기 위해 이 방식을 사용한다. 아래 섹션을 참조하십시오.

'''(2) RAM을 포스트-튜링 머신으로 축소:'''

최소주의자로 가장하여, 누산기 A와 간접 참조 레지스터 N을 제외한 모든 레지스터, 예를 들어 '''r''' = { r0, r1, r2, ... }을 (매우) 제한된 용량의 비둘기 구멍의 무제한 문자열로 줄인다. 이들은 (매우) 제한된 숫자, 예를 들어 {0, 1} 값을 가진 단일 비트만 저장한다. 마찬가지로 누산기를 단일 비트로 축소한다. 우리는 산술 연산을 레지스터 {A, N}으로 제한하고, 간접 연산을 사용하여 레지스터의 내용을 누산기로 가져오고, 누산기에서 레지스터로 0 또는 1을 쓴다.

:{ LDA (i, N), STA (i, N), CLR (A/N), INC (A/N), DEC(N), JZ (A/N, Iz), JZ (Iz), H }

우리는 더 나아가 "ERASE"와 "PRINT"라는 두 개의 "상수" 레지스터를 사용하여 A를 완전히 제거한다: [ERASE]=0, [PRINT]=1.

:{ CPY (d, ERASE, i, N), CPY (d, PRINT, i, N), CLR (N), INC (N), DEC (N), JZ (i, N, Iz), JZ (Iz), H }

COPY 명령어를 이름을 바꾸고 INC (N) = RIGHT, DEC (N) = LEFT라고 부르면 포스트-튜링 머신과 동일한 명령어와 추가 CLRN이 있다.

:{ ERASE, PRINT, CLRN, RIGHT, LEFT, JZ (i, N, Iz), JZ (Iz), H }

7. 간접 주소 지정을 통한 튜링 완전성

Random-access machine영어 (RAM)은 간접 주소 지정 기능을 추가하여 다중 레지스터 카운터 머신과 동일한 추상적인 계산 모델이다. 간접 주소 지정을 가진 RAM은 포스트-튜링 기계와 동등하며, 튜링 완전성을 가진다. 이를 증명하기 위해 포스트-튜링 기계의 명령어를 RAM 명령어로 변환할 수 있다.

세 개의 예약된 레지스터 "E", "P", "N"과 오른쪽으로 무제한인 레지스터 1, 2, ..., n을 가진 모델 설계를 사용한다. 레지스터 1, 2, ..., n은 "테이프의 사각형"으로 간주된다. 레지스터 "N"은 현재 "헤드"가 관찰하고 있는 "스캔된 사각형"을 가리킨다. "N"을 감소시키거나 증가시키면 헤드는 사각형을 따라 "왼쪽" 또는 "오른쪽"으로 이동하는 것처럼 보인다. 간접 CPY를 사용하여 "E"=0 또는 "P"=1의 내용을 N이 가리키는 "스캔된 사각형"으로 이동한다.

테이프가 왼쪽으로 끝난다는 사실은 LEFT 명령어가 "N"의 내용이 0인지 테스트해야 하는 문제를 야기한다.

RAM을 위한 명령어 집합 1(확장): { INC (N), DEC (N), CLR (N), CPY (d, rs,i, N), JZ ( i, r, z ), HALT }

다음 표는 RAM에 해당하는 명령어를 기준으로 포스트-튜링 명령어를 정의한다.

니모닉레이블:레지스터에 대한 작업유한 상태 기계 명령어 레지스터 IR에 대한 작업
R오른쪽:[N] +1 → N[IR] +1 → IR
P인쇄:[P]=1 → N[IR] +1 → IR
E지우기:[E]=0 → N[IR] +1 → IR
L왼쪽:IF N =0 THEN "end" → IR ELSE [IR]+1 → IR
[N] -1 → N
J0 ( 중단 )jump_if_blank:IF N =0 THEN "end" → IR ELSE [IR]+1 → IR
J1 ( 중단 )jump_if_mark:IF N =0 THEN "end" → IR ELSE [IR]+1 → IR
H중단:[IR] +1 → IR


8. 간접 주소 지정의 한계: 원시 재귀 함수

간접 주소 지정(Indirect addressing)의 제한된 형태(경우별 정의)로는 원시 재귀 함수만 계산할 수 있다. 완전한 재귀 함수(부분 재귀 함수)를 계산하려면 무제한 간접 주소 지정(μ 연산자)이 필요하다.

카운터 머신 모델은 제한된 형태의 간접 참조를 통해 원시 재귀 함수의 하위 클래스를 계산할 수 있다. 이는 "경우별 정의"라는 원시 재귀 연산자를 사용한다. "경우별 정의"는 기계가 포인터 레지스터의 내용을 결정하기 위해, 경우 연산자가 명시적으로 선언한 숫자/이름과 일치하는지 확인하는 방식이다. 따라서 경우별 정의는 하한 주소에서 시작하여 상한 주소로 진행하면서 일치를 시도한다.

"경계가 있는" 간접 참조는 부분 재귀 함수를 계산할 수 없게 한다. 이를 위해서는 무경계 간접 참조, 즉 μ 연산자가 필요하다.

튜링 완전하려면 카운터 머신은 단일 레지스터의 괴델 넘버 방법을 사용하거나, 필요하다면 무한정으로 레지스터 문자열의 끝을 탐색할 수 있는 능력을 갖추어야 한다.

9. 다양한 RAM 모델 예시

다양한 RAM 모델의 예시로는 쿡과 레크호우(Cook and Reckhow) 모델, 쇤하게(Schönhage, 1980) 모델 등이 있다. 쿡과 레크호우 모델은 레지스터 간 연산(read-modify-write)을 기반으로 하며, 쇤하게 모델은 RAM0와 RAM1 두 가지 모델을 제시한다.

9. 1. Cook and Reckhow (1973) 모델

쿡과 레크호우(Cook and Reckhow) 모델은 레지스터 간 연산(read-modify-write)을 기반으로 하는 랜덤 접근 기계(RAM) 모델이다. 이 모델은 다음과 같은 명령어들을 사용한다.

명령어설명예시
`LOAD ( C, rd )`상수 C를 레지스터 rd에 저장한다.`LOAD ( 0, 5 )`는 레지스터 5를 0으로 초기화한다.
`ADD ( rs1, rs2, rd )`레지스터 rs1과 rs2의 내용을 더하여 레지스터 rd에 저장한다. rs1, rs2, rd는 같거나 다를 수 있다.`ADD ( A, A, A )`는 레지스터 A의 내용을 두 배로 만든다.
`SUB ( rs1, rs2, rd )`레지스터 rs1의 내용에서 rs2의 내용을 빼서 레지스터 rd에 저장한다. rs1, rs2, rd는 같거나 다를 수 있다.`SUB ( 3, 3, 3 )`은 레지스터 3을 0으로 초기화한다.
`COPY ( i, rp, d, rd )`포인터 레지스터 rp가 가리키는 레지스터의 내용을 레지스터 rd에 간접적으로 복사한다.
`COPY ( d, rs, i, rp )`레지스터 rs의 내용을 포인터 레지스터 rp가 가리키는 레지스터에 복사한다.
`JNZ ( r, Iz )`레지스터 r의 내용이 양수이면 명령어 Iz로 점프하고, 그렇지 않으면 다음 명령어를 순차적으로 실행한다. (쿡과 레크호우는 "Xj > 0인 경우 m번째 줄로 제어 전송"이라고 표현했다.)
`READ ( rd )`"입력"을 레지스터 rd로 복사한다.
`PRINT ( rs )`레지스터 rs의 내용을 "출력"으로 복사한다.


9. 2. Schönhage (1980) 모델

Schönhage영어 (1980) 모델은 RAM의 두 가지 다른 모델을 제시했다.

  • '''RAM0''': 매우 원시적인 모델로, 다음 6개의 단일 문자 명령어를 사용한다.


RAM0 명령어
명령어설명
Z[r] ← 0 (레지스터 r의 내용을 0으로 설정)
S[r] ← [r] + 1 (레지스터 r의 내용을 1 증가)
T rs,rd[rs] → rd (레지스터 rs의 내용을 레지스터 rd로 복사)
J r,z만약 [r] = 0이면 z로 점프, 그렇지 않으면 다음 명령어로 진행
I rs,rd간접: rs → rd (레지스터 rs가 가리키는 레지스터의 내용을 레지스터 rd로 복사)
P rd,rs간접: [rs] → [rd] (레지스터 rs의 내용을 레지스터 rd가 가리키는 레지스터로 복사)


  • '''RAM1''': RAM0을 확장하여 더 일반적인 형태의 RAM을 구성한다.


RAM1 명령어
명령어설명
LDAA누산기에 상수(constant)를 로드(load)
LDA누산기에 [r]을 로드
LDAI누산기에 r을 로드 (간접)
STAA누산기의 내용을 r에 저장
STA누산기의 내용을 [r]에 저장
STAI누산기의 내용을 r에 저장 (간접)
JEA z누산기의 내용이 0이면 z로 점프
INCA누산기의 내용을 1 증가




본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com