IT TIP

레지스터 대 스택

itqueen 2021. 1. 6. 20:33
반응형

레지스터 대 스택


레지스터 기반 가상 머신을 사용하는 것과 스택 기반 가상 머신을 사용하는 것의 장단점은 정확히 무엇입니까?

나에게는 레지스터 기반 기계가 프로그래밍하기가 더 간단하고 효율적인 것처럼 보입니다. 그렇다면 JVM, CLR 및 Python VM이 모두 스택 기반 인 이유는 무엇입니까?


이것은 이미 Parrot VM의 FAQ 및 관련 문서에서 특정 수준으로 답변되었습니다. A Parrot 개요 해당 문서의 관련 텍스트는 다음과 같습니다.

Parrot VM에는 스택 아키텍처가 아닌 레지스터 아키텍처가 있습니다. 또한 Perl 및 Python 등의 중간 수준 작업보다 Java와 더 유사한 매우 낮은 수준의 작업도 제공합니다.

이 결정의 이유는 주로 기본 하드웨어를 어느 정도 닮음으로써 Parrot 바이트 코드를 효율적인 기본 기계 언어로 컴파일 할 수 있기 때문입니다.

더욱이 고수준 언어의 많은 프로그램은 중첩 된 함수와 메서드 호출로 구성되며 때로는 중간 결과를 보유하는 어휘 변수가 있습니다. 비 JIT 설정에서 스택 기반 VM은 팝핑 한 다음 동일한 피연산자를 여러 번 푸시하는 반면 레지스터 기반 VM은 적절한 양의 레지스터를 할당하고 이에 대해 작동하므로 작업량을 크게 줄일 수 있습니다. 및 CPU 시간.

다음을 읽어 볼 수도 있습니다. 인터프리터 설계를위한 레지스터 대 스택 인용문 :

의심의 여지가 없으며 스택 머신 용 코드를 생성하는 것이 더 쉽습니다. 대부분의 신입생 컴파일러 학생들은 그렇게 할 수 있습니다. 레지스터 머신을위한 코드 생성은 누적 기가있는 스택 머신으로 취급하지 않는 한 약간 더 어렵습니다. (성능 관점에서 보면 이상적이지는 않지만 가능하지만) 타겟팅의 단순성은 그다지 큰 문제가 아닙니다. 부분적으로는 실제로 직접 타겟팅하는 사람이 거의 없기 때문입니다. 어서, 누군가가 관심을 가질만한 것을 위해 실제로 컴파일러를 작성하려는 사람이 얼마나 많은지 알고 있습니까? 숫자는 적습니다. 또 다른 문제는 컴파일러 지식을 가진 많은 사람들이 이미 레지스터 머신을 대상으로하는 것에 익숙하다는 것입니다. 그것이 일반적으로 사용되는 모든 하드웨어 CPU가 그렇기 때문입니다.


하드웨어로 구현 된 레지스터 기반 시스템은 더 느린 RAM에 대한 액세스 수가 적기 때문에 더 효율적입니다. 그러나 소프트웨어에서는 레지스터 기반 아키텍처조차도 RAM에 "레지스터"가있을 가능성이 높습니다. 스택 기반 머신은이 경우에 똑같이 효율적일 것입니다.

또한 스택 기반 VM을 사용하면 컴파일러를 훨씬 쉽게 작성할 수 있습니다. 레지스터 할당 전략을 다룰 필요가 없습니다. 기본적으로 작업 할 레지스터 수에는 제한이 없습니다.

업데이트 : 해석 된 VM을 가정 하여이 답변을 작성했습니다. JIT 컴파일 된 VM에는 적용되지 않을 수 있습니다. JIT 컴파일 된 VM이 레지스터 아키텍처를 사용하면 더 효율적일 수 있음을 나타내는 이 문서살펴 보았습니다 .


전통적으로 가상 머신 구현자는 'VM 구현의 단순성'으로 인해 컴파일러 백엔드를 쉽게 작성할 수 있기 때문에 레지스터 기반보다 스택 기반 아키텍처를 선호했습니다. 대부분의 VM은 원래 단일 언어와 코드 밀도 및 스택 아키텍처 용 실행 파일을 호스팅하도록 설계되었습니다. 레지스터 아키텍처의 경우 실행 파일보다 항상 작습니다. 단순성과 코드 밀도는 성능 비용입니다.

연구에 따르면 등록 기반 아키텍처는 스택 기반 아키텍처보다 실행되는 VM 명령이 평균 47 % 적게 필요하며 레지스터 코드는 해당 스택 코드보다 25 % 더 크지 만 코드가 커짐에 따라 더 많은 VM 명령을 가져 오는 비용이 증가합니다. 크기에는 무시할 수있는 VM 명령어 당 1.07 %의 추가 실제 머신로드 만 포함됩니다. 레지스터 기반 VM의 전반적인 성능은 표준 벤치 마크를 실행하는 데 평균 32.3 % 더 적은 시간이 소요된다는 것입니다.


스택 기반 VM을 구축하는 한 가지 이유는 실제 VM opcode가 더 작고 간단 할 수 있기 때문입니다 (피연산자를 인코딩 / 디코딩 할 필요가 없음). 이렇게하면 생성 된 코드가 더 작아지고 VM 코드도 더 간단 해집니다.


얼마나 많은 레지스터가 필요합니까?

아마 그보다 적어도 하나는 더 필요할 것입니다.


"등록 기반"가상 머신이 "프로그래밍하기 더 간단"하거나 "더 효율적"이라는 것은 분명하지 않습니다. 아마도 가상 레지스터가 JIT 컴파일 단계에서 바로 가기를 제공 할 것이라고 생각하고 계십니까? 실제 프로세서는 VM보다 더 많거나 적은 레지스터를 가질 수 있고 이러한 레지스터는 다른 방식으로 사용될 수 있기 때문에 이것은 확실히 사실이 아닙니다. (예 : 감소 할 값은 x86 프로세서의 ECX 레지스터에 배치하는 것이 가장 좋습니다.) 실제 머신에 VM보다 많은 레지스터가있는 경우 리소스를 낭비하고있는 것입니다. 기반 "프로그래밍.


스택 기반 VM은 더 간단하고 코드는 훨씬 더 간결합니다. 실제 사례로 한 친구가 Cosmac에서 홈브류 Forth VM으로 데이터 로깅 시스템을 구축했습니다 (약 30 년 전). Forth VM은 2k ROM과 256 바이트 RAM이있는 시스템에서 30 바이트 의 코드 였습니다 .


스택 기반 VM은 코드를 생성하기가 더 쉽습니다.

등록 기반 VM은 빠른 구현을 더 쉽게 만들 수 있으며 고도로 최적화 된 코드를 더 쉽게 생성 할 수 있습니다.

첫 번째 시도를 위해 스택 기반 VM으로 시작하는 것이 좋습니다.

참조 URL : https://stackoverflow.com/questions/164143/registers-vs-stacks

반응형