둘째, 런타임에 가상의 아키텍처를 지원하는 가상의 칩을 에뮬레이트하는(emulate, 흉내 내는) 프로그램, 즉 가상 머신(VM, Virtual Machine)을 만드는 것이다. VM에서 바이트코드를 실행하는 것은 미리 네이티브 코드로 번역하는 것보다 당연히 느리다. 명령어를 하나하나 실행할 때마다 런타임에서 시뮬레이션을 해야 하기 때문이다. 하지만 그 대신 단순성과 이식성이라는 커다란 장점이 있다. 예를 들어, C로 VM을 구현하면 C 컴파일러가 있는 모든 플랫폼에서 해당 언어를 실행할 수 있다. 이 책의 두 번째 인터프리터는 바로 이런 방식으로 작동된다.
'가상 머신'이라는 용어가 다른 종류의 추상화를 나타내는 경우도 있다. 시스템 가상 머신(system virtual machine)은 전체 하드웨어 플랫폼과 운영 체제를 소프트웨어로 에뮬레이트한다. 리눅스 머신에서 윈도우 게임을 즐길 수 있는 것과 동일한 원리다. 클라우드 공급자가 사용자마다 물리적인 컴퓨터를 따로 할당하지 않아도, 사용자에게 자신만의 '서버(server)'를 제어하는 사용자 경험(user experience)을 제공하는 것도 그렇다.
좀 더 구체적으로 말하면, 이 책에서 언급할 VM은 언어 가상 머신(language virtual machine) 또는 프로세스 가상 머신(process virtual machine)이다.