문제

정확히는 장점과 단점을 사용하는 등 기반 가상 기계를 사용하여 대 stack-based virtual machine?

나를 위해,그것은 것 같으로도 등록을 기반으로 기계는 더 많은 것이 바로 앞으로 프로그램을 더 효율적입니다.그래서 그것은 왜 JVM,CLR,그리고 Python VM 는 모든 stack-based?

도움이 되었습니까?

해결책

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

앵무새 VM에는 스택 아키텍처가 아닌 레지스터 아키텍처가 있습니다. 또한 Perl과 Python 등의 중간 수준의 OP보다 Java와 더 유사한 수준의 작업이 매우 낮습니다.

이 결정에 대한 추론은 주로 기본 하드웨어를 어느 정도 닮아서 앵무새 바이트 코드를 효율적인 기본 기계 언어로 컴파일 할 수 있다는 것입니다.

또한, 고급 언어로 된 많은 프로그램은 중첩 된 기능 및 메소드 호출로 구성되며 때로는 중간 결과를 유지하기위한 어휘 변수로 구성됩니다. 비 JIT 설정에서 스택 기반 VM이 튀어 나오고 동일한 피연산자를 여러 번 밀어내는 반면, 레지스터 기반 VM은 단순히 적절한 양의 레지스터를 할당하고 작동하여 작동량을 크게 줄일 수 있습니다. 그리고 CPU 시간.

당신은 또한 이것을 읽고 싶을 수도 있습니다 : 통역사 디자인을위한 등록 대 스택 조금 인용 :

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

다른 팁

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

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

업데이트: 해석 된 VM을 가정 하여이 대답을 썼습니다. JIT 컴파일 VM의 경우에는 적용되지 않을 수 있습니다. 나는 가로 질러 달렸다 이 종이 이는 JIT 컴파일 VM이 레지스터 아키텍처를 사용하여 더 효율적 일 수 있음을 나타냅니다.

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

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

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

몇 개의 레지스터가 필요합니까?

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

"레지스터 기반"가상 머신이 "프로그램에보다 직접적으로"또는 "보다 효율적"이라는 것은 분명하지 않습니다. 아마도 당신은 가상 레지스터가 JIT 컴파일 단계에서 바로 가기를 제공 할 것이라고 생각하고 있습니까? 실제 프로세서는 VM보다 레지스터가 더 많거나 적을 수 있으며 해당 레지스터는 다른 방식으로 사용될 수 있기 때문에 그렇지 않습니다. (예 : 감소 할 값은 X86 프로세서의 ECX 레지스터에 가장 잘 배치됩니다.) 실제 기계에 VM보다 더 많은 레지스터가있는 경우 리소스를 낭비하고 더 적게 낭비하고 "레지스터를 사용하지 않습니다. 기반 "프로그래밍.

스택 기반 VM은 더 간단하고 코드는 훨씬 더 작습니다. 실제 예를 들어, 친구는 (약 30 년 전) Cosmac에 Homebrew Form VM이있는 데이터 로깅 시스템을 구축했습니다. Forth VM은 30이었습니다 바이트 ROM의 2K 및 256 바이트의 RAM이있는 기계의 코드.

스 기반으로 Vm 을 쉽게 코드를 생성한다.

등록 따라서 Vm 을 쉽게 만들 빠르고 구현하고,쉽게 생성하는 고도로 최적화된 코드.

을 위한 첫 번째 시도,난로 시작하는 것이 좋습니다 스택에 기반하는 모든 컴퓨터에서 요구됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top