跳至内容

模拟/它是如何工作的?

来自维基教科书,开放世界中的开放书籍

在计算机科学的核心,特别是计算和可计算性的研究中,是丘奇-图灵论题。该论题指出,任何被认为是可计算的函数都可以通过一种称为“图灵机”的理论装置进行计算。这个定理的自然推论是,任何通用编程语言都足以表达任何算法。基本上,任何可以被认为是可计算的(在模拟的情况下,涉及机器硬件运行的计算),都可以通过任何通用编程语言来计算。现代模拟器能够模拟大多数计算机的原因是,大多数现代计算机都基于冯·诺依曼体系结构。这种计算机体系结构最初由已故的约翰·冯·诺依曼在 1950 年代记录,它规定了现代计算机运行的基本方式(通过从内存中获取和执行指令,这些函数可以在执行过程中将数据写回计算机内存)。所有其他组件,如视频、声音、键盘和鼠标,都是对这种基本体系结构的扩展。在伪代码中,一个基本的模拟器循环写成

do
  fetch the next instruction from emulated memory
  execute the instruction
  check for interrupts
while WE ARE STILL EXECUTING INSTRUCTIONS

利用这些原理,模拟软件(模拟器)本质上将为在一台机器上执行而编写的二进制数据转换为适合在另一台机器上执行的等效二进制形式。这种转换通常是通过获取原始二进制指令并将其转换为一或多个适合在另一台机器上执行的等效指令来完成的。由于 1:1 指令转换率通常不可能,模拟器等效于原始程序的规模通常要大得多。

通常,模拟机器所需的某一设备的精确等效项是不可能的。例如,NES 或 PlayStation 的控制器通常不存在于 PC 上。这就是使用任何可比的等效项的地方,最常见的是键盘或操纵杆。这种补偿是使模拟变得困难的部分原因,因为必须清楚地了解硬件的工作原理才能对其进行模拟。这对于音频和视频芯片等更具挑战性的硬件尤为重要。通常有两种方法可以模拟给定的软件:解释和重新编译。

在解释中,二进制数据被读取,并且在解码每条指令时,它都会被执行;每条指令在每次遇到时都会被执行。通常这种方法是最容易实现的,但它也是执行时间最慢的。许多较旧的控制台模拟器使用解释。


Clipboard

待办事项
添加伪代码示例并为希望编写解释器的用户提供更好的解释...


以下是一些使用解释的模拟器示例

重新编译

[编辑 | 编辑源代码]

重新编译,也称为二进制转换,涉及将模拟平台的二进制数据直接二进制转换为适合在目标平台上执行的二进制数据。这种方法通常为模拟软件提供显著的性能提升,并且它被大多数针对“下一代”控制台的模拟器使用。重新编译通常有两种形式

  • 动态重新编译
    • 在动态重新编译或动态二进制转换中,二进制数据仅在第一次传递时进行转换,并保存在缓存中,在缓存中存储已转换的二进制等效项,并在每次再次执行该部分时进行引用。基本思想是进行一次昂贵的指令转换和解码,然后经常引用缓存的转换代码。这种方法是最常用的,因为它可以处理所有形式的代码,包括自修改代码。一些例子
  • 静态重新编译
    • 在静态重新编译或静态二进制转换中,二进制数据在代码上进行单次传递时进行转换。要模拟的代码可以被扫描,并且可以通过应用各种算法来优化转换。然后,已转换的数据通常保存在文件或内存中,在程序执行时被程序引用。虽然这有时甚至可以提高动态重新编译的性能,但如果代码是自修改的,这种方法通常无法正确转换可执行文件,从而迫使回退到动态重新编译器或解释器来处理修改后的代码。
华夏公益教科书