《Emulator and Virtual Machine》
原文出处:http://www.tuicool.com/m/articles/2EFJVf
模拟器是什么
Emulator,中文一般译为模拟器。但实际上这个翻译是错误的,准确的翻译是仿真器。仿真器与模拟器的区别在于:前者是用软件实现硬件的行为,而后者仅仅是使某一软件的运行和输出在不同平台上没有太大区别。举个例子,如果在某个街机上有一个游戏软件需要在PC平台运行,仿真需要做的是在PC平台上实现一个软件能正确的完成街机硬件的功能,从而使游戏软件可以不进行任何修改的在这个PC平台上实现的软件上运行;而模拟需要做的是修改该游戏的源代码,从而使得游戏可以在PC上编译运行,只要该戏的画面和输出与街机上没有太大区别就可以,也就是所谓的移植。
仿真器与虚拟机的区别
简单的说,仿真器和虚拟机(Virtual Machine)几乎没有区别,至少实现方式是类同的。两者都是将被仿真平台(比如某一街机)上的机器码转译成目标平台(比如PC)上的机器码。当然一般情况下不需要做到精确仿真,甚至更夸张的晶体管级别的仿真,只需要做到指令级别的CPU仿真以及保证时序正确就可以,当然也包括图像和声音处理。一些高级的主机并不需要精确的时序,但需要正确的实现该高级主机的BIOS调用,OS API,GPU指令(如果有的话),甚至驱动等等。
仿真器或虚拟机的实现方法
实现方法主要就是将被仿真平台的CPU指令转译成目标平台的CPU指令。最简单的就是Interpreter(解释器),主要方法就是边转译边执行指令。速度更快的实现方式为Dynamic Compilation(动态编译),主要方法是先转译再执行指令。动态编译也有许多类似的名称,如Dynamic Recompilation(动态重编译,简写为Dynarec),Dynamic Binary Translation(动态二进制转译),Just-In-Time Compilation(即时编译)等等。
另一种追求速度的实现方式是高级仿真(high-level emulation,简写为HLE)。其实现方式是利用平台的相似性,如被仿真平台和PC都使用OpenGL作为图形API,或者被仿真平台的图形API实现和OpenGL API很类似,那么就可以简单的利用OpenGL API来替换被仿真平台的图形API。这种方式会较大的提高运行速度,但也降低了精确度。