2.1.7 가상 머신
컴파일러가 바이트코드를 만들었다고 작업이 다 끝난 게 아니다. 바이트코드로 말하는 칩은 이 세상에 없기 때문에 기계어로 번역을 해야 한다. 여기서도 두 가지 옵션(option, 선택 사항)이 있다. 첫째, 바이트코드를 해당 머신의 네이티브 코드로 바꿔주는 미니 컴파일러(mini-compiler)를 각 타깃 아키텍처마다 만드는 것이다. 지원할 칩마다 같은 작업을 되풀이해야 하나, 이 마지막 단계는 아주 단순하며 나머지 컴파일러 파이프라인은 모든 머신에서 재사용할 수 있다. 즉, 바이트코드를 중간 표현처럼 사용하는 셈이다.
기본 원리는 이렇다. 아키텍처에 특정한 작업을 파이프라인의 하류 방향으로 더 밀어낼수록 그 이전 단계를 다양한 아키텍처에서 더 많이 공유할 수 있다.
물론, 약간 불안한 측면도 있다. 레지스터 할당(register allocation), 명령어 선택(instruction selection) 등의 최적화는 보통 특정 칩의 강점과 기능을 알고 있는 경우에 가장 잘 동작한다. 컴파일러의 어느 부분을 공유할지, 어느 부분은 타깃마다 다른 방향으로 가야 할지 결정하는 것이 바로 기술이다.