현대 컴퓨터의 이론상 최소 레지스터 수는?


10

나는 학부 연구에서 컴파일러에 대해 강의했다. 거기서 우리는 장난감 자바와 같은 언어로 소스 프로그램을 장난감 조립 언어 (통역사가있는)로 컴파일하는 컴파일러를 작성했다. 이 프로젝트에서 우리는 다음을 포함하여 "실제"네이티브 실행 파일과 밀접하게 관련된 대상 시스템에 대한 몇 가지 가정을했습니다.

  • 전용 스택 포인터 ( "SP") 레지스터에 의해 추적되는 런타임 스택
  • 전용 힙 포인터 ( "HP") 레지스터에 의해 추적되는 동적 객체 할당을위한 힙
  • 전용 프로그램 카운터 레지스터 ( "PC")
  • 대상 머신에는 16 개의 레지스터가 있습니다.
  • 데이터에 대한 작업 (예 : 점프와 반대)은 레지스터 간 작업입니다.

레지스터 할당을 최적화로 사용하는 단위에 도달했을 때, 나는 그런 기계에 대한 이론적 인 최소 레지스터 수는 얼마입니까? 컴파일러에서 5 개의 레지스터 (SP, HP, PC, 2 진 연산을위한 스토리지로 사용하기 위해 2 개)를 사용했다고 가정 할 수 있습니다. 레지스터 할당과 같은 최적화는 확실히 더 많은 레지스터를 사용할 수 있지만 스택 및 힙과 같은 구조를 유지하면서 적은 수로 더 많은 방법을 사용할 수 있습니까? 레지스터 주소 지정 (register-to-register 작업) 으로 적어도 두 개의 레지스터가 필요하지만 두 개 이상의 레지스터가 필요하다고 가정합니다.


"힙 포인터"는 이상한 생각 인 것 같습니다. 스택과 달리 힙은 LIFO가 아니며 푸시 / 팝 시맨틱으로 줄지 않습니다. 오히려 malloc / free 루틴에 대한 호출로 동적 메모리 할당을보아야합니다.
Yves Daoust

답변:


14

메모리 주소로 직접 메모리 액세스를 허용하면 메모리 위치를 대신 사용할 수 있으므로 "레지스터"가 필요하지 않습니다. 예를 들어, 위치 0의 메모리는 프로그램 카운터가 될 수 있으며, 위치 1에는 스택 포인터가 있습니다. 그러나 그것은 속임수입니다.

따라서 부정 행위를 방지하기 위해 고정 메모리 위치를 레지스터로 사용할 수 있으므로 직접 메모리 액세스가 없다고 가정합니다. 그런 다음 스택 머신 의 Wikipedia 기사에서 설명한 것처럼 프로그램 카운터와 스택 포인터라는 두 개의 레지스터를 사용하여 벗어날 수 있습니다 . 스택은 스택 포인터를 통해서만 액세스 할 수 있으며 프로그램은 프로그램 카운터를 통해서만 액세스 할 수 있습니다.

또 다른 가능성은 카운터 머신을 사용하는 것입니다. 2 카운터 기계는 Turing 완료입니다. 즉, Turing 기계가 할 수있는 모든 것을 계산할 수 있습니다. 이것은 카운터 머신 에 대한 Wikipedia 기사에서 잘 설명됩니다 .


회신 주셔서 감사합니다! 그러나 스택 머신에 관한 기사는 머신이 직접 메모리 액세스 (맨 위 스택 요소에 대한 작업을 수행하고 결과를 다시 푸시 할 수 있음)를 언급하므로 여전히 속임수입니까? 카운터 머신은 그 기사를 읽었습니다. 또한 2-CM의 TC에 대한 유사한 증거를 읽었지만 두 RAM에 모든 RAM을 효과적으로 저장하는 것과 관련이 있습니다.
BlueBomber

글쎄, 언젠가는 더 이상 속이지 않습니다. 메모리의 고정 위치에 직접 액세스 할 수없는 한 스택 작업은 부정 행위가 아닙니다. 예를 들어, 스택의 최상위 3 개 요소를 회전시킬 수 있습니다. 귀하의 질문은 어쨌든 조금 이상하기 때문에 부정 행위가 무엇인지에 대해 집착하는 것은 비용을 지불하지 않습니다.
Andrej Bauer

답장을 보내 주셔서 다시 한 번 감사드립니다. 주제가 이론적 범위와 관련이있을 때마다 부정 행위는 용납되지 않습니다! 그렇다고해서 그것이 유익하지 않다는 것은 아닙니다. 부정 행위가 아닌 시점은 부정 행위가 없을 때입니다. 귀하의 초기 답변이 유익하다는 것을 알았지 만 문제는 모델이 모든 Turing Machine, Counter Machine 및 Stack Machine 모델과 겹치며 우리의 가정 (유한 한 유한 레지스터를 포함하고 직접 메모리 액세스가 없음)을 가정 한 것입니다. 두 개의 레지스터 만?
BlueBomber

1
프로세서, 레지스터, 메모리 액세스 등과 같은 실제 개념을 고정하기가 어렵 기 때문에 질문이 이상하다는 것을 알았습니다. 그러나 무언가를 증명하려면 고정 된 개념이 필요합니다. 따라서 최종 결과는 증명하는 것이 무엇이든 쉽게 증명할 수 있지만 질문을 공식화하는 방법 ( "프로세서", "등록", "메모리"등의 이론적 개념은 무엇인지)에 따라 크게 좌우됩니다.
Andrej Bauer

1
컴파일러 교과서는 적어도 "증명"이라는 단어의 수학적 의미로는 많은 것을 증명할 수 없습니다. 하드웨어를 공식화 할 때 한 단계 더 나아가 야 증거 를 얻을 수있는 무언가에 도달 할 수 있습니다. 어쨌든, 우리는 머리카락을 나누고 있으며, 나는 이미 당신에게 최선의 대답을 주었다.
Andrej Bauer

1

1970 년대에 General Instruments에 의해 도입되어 오늘날에도 여전히 사용되고있는 PIC 아키텍처에는 다음과 같은 레지스터가 있습니다.

W register (not addressible)
01    Timer/Counter
02    Program Counter
03    Status
04    File-Select Register
05-07 One register for each I/O port
08-1F General-purpose registers/"memory"

일반적인 명령어는 레지스터를 읽고 값 읽기 및 W를 사용하여 계산을 수행 한 다음 계산 결과를 W 또는 읽은 레지스터에 저장합니다. 사용 가능한 계산 중 하나는 "W를 무시하고 읽은 값"을 산출합니다. 또 다른 하나는 "가져온 가치를 무시하고 W를 취하는 것"입니다. "XX를 읽고, W를 읽고, 읽은 값을 무시하고 결과를 W에 저장합니다"에 해당하는 비트 패턴은 NOP 및 다양한 특수 명령에 사용됩니다.

주소 계산을 허용하기 위해 프로세서의 실행 장치는 주소 00을 인코딩하는 명령을 감시하고 파일 선택 레지스터의 내용을 주소로 대체합니다.

W 레지스터를 통해 모든 값을 공급해야하는 병목 현상이 발생할 수 있지만 PIC 아키텍처는 동일한 길이의 명령어를 사용하는 다른 아키텍처보다 더 큰 작업 세트를 갖습니다. PIC16C54 (오늘날 제작되었지만 1970 년대 PIC와 매우 유사)에서 명령어의 길이는 12 비트입니다. 다른 많은 16Cxx 또는 16Fxx 부분에서 명령의 길이는 14 비트이며 128 바이트 주소 공간에 직접 액세스 할 수 있습니다. 프로그램의 작업 세트가 명령 세트의 작업 세트와 잘 맞으면 "total"과 "value"의 유형 unsigned char인 "total + = value"와 같은 명령문은 다음과 같이 컴파일됩니다.

movf  value,w
addwf total,f

ARM과 같은 경우에는 변수의 기본 주소로 사전로드 된 레지스터가 있어도 코드는 다음과 같습니다.

ldr    r0,[r7+value]
ldr    r1,[r7+total]
add    r1,r1,r0
str    r1,[r7+total]

대부분의 경우 컴파일러는 모든 작업에서로드 및 저장을 피할 수 있지만 PIC와 같은 작업에서는 더 큰 작업 세트의 이점이 항상 W를 통과해야하는 한계를 능가 할 수 있습니다.

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