레지스터 기반 vs 스택 기반 VM

2021. 12. 16. 17:25 JAVA/JVM

자바 가상머신은 가상머신이 필요로하는 기능 명세서를 구현한 것 중에 하나이다. 
따라서 가상머신의 구현체는 명세서를 어떻게 구현하냐에 따라 여러 종류가 있을 수 있다.

가상머신은 일반적으로 어떤 것들을 구현해야할까? 물리적인 CPU에 의해 처리되는 동작들을 흉내낼 수 있어야 한다. 즉, 아래와 같은 컨셉들을 가지고 있어야 한다. 

[가상머신이라면 구현해야할 컨셉]
-  소스 코드를 VM이 실행가능한 바이트 코드로 변환한다. 
- 명령어와 피연산자를 포함하는 데이터구조를 가지고 있어야 한다.
- 함수를 실행하기 위한 콜 스택
- IP(Instruction Pointer) : 다음 실행할 곳을 지정하는 포인터
- 가상 CPU : 다음 명령어를 패치 & 명령어를 해석 & 명령을 실행

위와 같은 명세를 만족하는 가상머신을 구현할 수 있는 방법은 두 가지가 있다.

[가상머신을 구현하는 두 가지 방법]
- Stack 기반
- Register 기반

스택 기반, 레지스터 기반의 차이
- 피연산자를 저장하고 다시 가져오는 메카니즘이 다르다.

 

Stack 기반 가상머신

- Java VM, .Net CLR
- 대다수의 가상머신이 스택기반
- 피연산자와 연산 후 결과를 스택에 저장한다.
- 예를들어, 아래와 같이 덧셈을 할 경우, 스택구조라서 PUSH & POP 이 필요하여 4단계의 명령이 필요하다.
- 장점 : 다음 피연산자의 메모리 위치를 기억할 필요가 없다. SP가 다음 피연산자의 위치를 나타낸다. 즉 스택에서 POP 만 하면 다음 피연산자가 나오기 때문에 피연산자의 메모리를 기억할 필요가 없다. 

 

Register 기반 가상머신

- Lua VM, Dalvik VM
- 피연산자가 CPU의 레지스터에 저장된다. 
- PUSH & POP 연산자가 없다. 
- 명령어가 피연산자의 위치인 레지스터의 주소를 기억해야 한다. 
- 장점 :
1) 아래와 같이 POP & PUSH 과정이 없기 때문에 같은 덧셈이라도 하나의 명령으로 충분하다. 때문에 더 빠르다. 
2) 스택기반에서는 할 수 없는 명령어 최적화를 적용할 수 있다. 예를들어, 어떤 연산이 나중에 또 필요할 때, 레지스터에 저장하여 다시 계산하지 않고도 연산결과를 활용할 수 있다. 
- 단점 :
1) 스택기반보다 명령어의 길이기 길다. 피연산자의 주소를 명시해줘야 하므로 평균적으로 길 수 밖에 없다.