模拟器还是仿真器?有什么区别?

598

虽然我大致了解模拟和仿真的含义,但我几乎总是混淆它们。如果我创建一个模拟现有硬件/软件的软件,应该称其为模拟器还是仿真器?

有人能说明编程方面的区别吗?

奖励问题:这两个术语在英语中的区别是什么? (抱歉,我的母语不是英语 :))


4
在移动应用开发中,iPhone 有一个模拟器,而Android 则有一个模拟器。更多信息请参见 - https://dev59.com/LW855IYBdhLWcg3wFALy - Vishnu Haridas
3
我发现维基百科对此的解释很有启发性:http://en.wikipedia.org/wiki/Emulator#Emulation_versus_simulation - AmigoNico
这也可以帮助解释以下内容:http://programmers.stackexchange.com/questions/134746/whats-the-difference-between-simulation-and-emulation?newreg=f4c51f8411974305a89637a60047d35e - Hakan Fıstık
24个回答

526

模拟是模拟目标的底层状态。 最终结果是,好的仿真模型将模拟它正在模拟的目标。

仿真可以观察仿真中的属性,并且如果您查看原始目标,则应该能够看到这些属性。 实际上,为了性能原因,可能会对仿真进行一些捷径--也就是说,仿真的某些内部方面实际上可能是模拟。

MAME是街机游戏模拟器; Hyperterm是(不太好的)终端模拟器。无需详细建模街机或终端即可获得所需的仿真行为。

Flight Simulator是一个模拟程序; SPICE是电子模拟器。 它们尽可能地对目标的每个细节进行建模,以表示目标在现实中的运行情况。

编辑:其他回答指出仿真的目标是能够替代其仿真对象。 这是一个重要的观点。 仿真的重点更多地集中在目标的内部状态建模上,而仿真并不一定导致模拟。 特别是,仿真可能比实时运行缓慢得多。 例如,SPICE不能替代实际的电子电路(即使假设有某种完美地将电路与SPICE仿真器接口的神奇设备)。 仿真不一定会导致模拟。


37
根据这个定义,因此在软件中模拟真实世界是不可能的吗?我认为我们无法准确地代表真实世界的基本状态 - 只能模仿可观察到的属性... 目前而言。 - Dolph
11
我不同意这个说法:“[模拟] 尽可能地模拟目标的每一个细节,以便更准确地代表目标在现实中的行为。” 模拟根据模拟的目的对目标系统进行适当详细程度的建模。例如,飞行模拟器可能不会模拟海中的鱼类,因为这对于模拟的目的是无用的。 - Hamdi
38
这里的答案与之相反:https://dev59.com/H3I95IYBdhLWcg3wvwoQ - smwikipedia
5
大多数人好像反过来使用这些词,例如:模拟一般发生在比仿真更高的层面上(尽管在给定的上下文中这两个词很少一起使用)。例如,可以看看安卓模拟器与苹果模拟器之间的区别。我建议将这个答案中的词语颠倒过来,以保持与大多数定义的一致性,并防止给未来的访问者带来困惑。 - aviator
7
我认为这个答案颠倒了两个术语。所有其他来源都将其解释为:模拟=复制行为;仿真=复制内部运作。这导致以下结论:它们都是非常主观的术语。 - metalim
显示剩余6条评论

414

如果一个飞行模拟器可以将你从A运送到B,那么它就是一台飞行仿真器。

仿真器可以替代原始系统进行真实使用。
虚拟PC模拟一个PC。

模拟器是用于研究和分析的模型。

仿真器总是必须接近实时操作。对于模拟器来说情况并非总是如此。地质学仿真可以达到每秒1000年或更多。


7
@Henk,您的“驾驶舱”示例非常棒,尽管在阅读Toybuilder的答案后我才理解它。谢谢 :) - Khaled Alshaya
1
Virtual PC并不是模拟,而是虚拟化。另一方面,QEmu确实是模拟。在这两种情况下,名称应该是一个提示。 - Jörg W Mittag
25
虚拟PC可以模拟一台电脑,可以说它是通过虚拟化来实现的,但这更多是实现细节。你可以认为硬件虚拟化是模拟的超集,因为它可以提供加速CPU支持、独占硬件设备访问等功能。 - Lee B
我认为这是最好的答案之一,除了将模拟器的目的限制在仅分析方面。模拟具有不同的目的,包括培训、实验、帮助理解、优化等。 - Hamdi
4
我可以翻译成中文:我该在哪里找到所说的飞行模拟器? - Jerry Dodge
显示剩余4条评论

218

模拟 = 用于分析和研究

仿真 = 用作替代品

模拟器是模拟某物的环境,而仿真器则是复制原始设备或系统的使用方式。

模拟器模仿的是它所模拟的东西的活动。对用户来说,例如飞行模拟器“看起来”像一次真正的飞行,尽管它不会将您从一个地方运送到另一个地方。

另一方面,仿真器实际上“执行”被仿真对象所执行的操作,并且在这样做时它也“似乎在执行相同的操作”。仿真器可能使用不同的协议来模拟被仿真对象,但结果/输出始终与原始对象相同。例如,EMU8086在计算机上模拟了8086微处理器,显然不是在8086上运行(=不同的协议),但它提供的输出与真实的8086相同。


11
我看过的最清晰的答案。对我来说,唯一可以改进的是省略多余的句子或将其融入到你出色的对比定义中 :-D - doughgle
完全同意。可以更正式地说,模拟器需要模拟实体的相同接口和行为,而仿真器则不需要。这与“用作替代品”的意思相同,但更具有形式上的可测试性。 - Halberdier

44

这是一种关注点的不同。模拟器1关注于重现系统行为,而不考虑系统内部的功能。仿真器2则专注于模拟系统组件。当您更关心系统的功能时,您将使用仿真器;当您更关心系统所做的事情时,则使用模拟器。

至于它们的通用英语含义,仿真是“努力在质量或动作上达到或超越另一个人”,而模拟是“对行为、外观或属性进行建模、复制、复制” 。差别不大。仿真来自于拉丁语“similis”(类似),与单词“similar”(类似)相关联,这可能暗示了更深层的一致性。而“模拟”则来自于拉丁语“æmulus”(竞争者),与“imitate”(模仿)和“image”(形象)相关联,这可能暗示了表面上的相似之处。

参考文献:

  1. 维基百科:模拟器
  2. 维基百科:仿真器
  3. Wiktionary:emulation
  4. Wiktionary:simulation
  5. Etymology Online:emulation
  6. Etymology Online:simulation

你的答案与其他人不同。根据你的看法,虚拟PC是模拟器还是仿真器? - Mikaël Mayer
@MikaëlMayer:许多答案与其他答案不同,只有一些相似。我认为我的答案与Toybuilder和cdiggens的答案等效(因为事物会被分类相同),并且与Jörg的答案兼容。它只与Pontus和Aeolai的答案相矛盾。 - outis
@MikaëlMayer Virtual PC是一个模拟器。它可以做任何真实PC所能做的事情。 - A user
1
@ Pri,请查看有关Virtual PC的这个帖子的答案。它既是,也取决于观点。例如,您仍然可以说它是一种模拟,因为它不能像真正的计算机那样发热。 - Mikaël Mayer
感谢您回来,@MikaëlMayer,但说实话,有时我们无法真正区分系统是模拟器还是仿真器。这引发了一系列的辩论。希望我是正确的!有些人根据使用、英文含义、功能和价格等方面来区分它们的差异。但当我将所有答案应用于我的案例研究时,这并不容易。 - A user
这是我认为最简洁和正确的答案。谢谢! - Fotios Basagiannis

24
我认为模拟器和仿真器不能相比较。它们都在模仿某些东西,但不属于同一种推理范畴,也没有在相同的上下文中使用。
简而言之:仿真器旨在复制原始物体的一些特征,并且甚至可以在真实环境中代替它。仿真器并非旨在复制原始物体的特性,仅仅是为了让人类看起来与原始物体相似。没有原始物体的特性,仿真器就无法在真实环境中替代它。
一个仿真器是一个设备,它足够接近地模仿某些东西,以便可以替代真正的东西。例如,您想让电路像ROM(只读存储器)电路一样工作,但也希望调整内容直到符合您的要求。您将使用ROM仿真器,这是一个黑匣子(可能基于CPU),具有与您想要仿真的ROM兼容的物理和电气接口。仿真器将插入设备以取代真正的ROM。主板在工作时不会看到任何区别,但您可以轻松更改仿真ROM内容。换句话说,在其主板上下文中,仿真器将像实际物体一样起作用(由于实际内部模型可能略慢),但设计人员可以看到仅在主板上下文之外的其他功能(如重新编写)。因此,仿真器的定义是:模仿原始物体,具有其所有功能特性,可以在某种程度上实际替代它,并且可能具有在正常上下文中不可见的其他功能。

模拟器是在另一种思维环境中使用的,例如飞行模拟器、汽车模拟器等。模拟将只关注实际事物的某些方面,通常涉及到人类如何感知和控制它。模拟器不会执行真正的功能,也不能替代它。飞机模拟器不会飞行或搭载人员,这完全不是它的目的。模拟器的目的并不是为了工作,而是为了以某种方式出现在飞行员眼前,以达到除了其正常用途之外的目的,例如允许地面培训(包括在异常情况下的所有发动机故障)。因此,模拟器定义应该是:某种可以在人类眼前部分地出现与原物相同的东西,但无法替代其实际使用。此外,飞行员将知道模拟器是模拟器。

我认为我们不会看到任何ROM模拟器,因为ROM不与人类进行交互,我们也不会看到任何飞机仿真器,因为飞机无法有一个能够在现实世界中执行相同功能的替代品。

在我看来,仿真器或模拟器内部的模型可以是任何东西,并且不必类似于原始模型。ROM仿真器模型可能是软件而不是硬件,微软飞行模拟器不能比现在更多地成为软件。

这两个术语的比较将与当前选定答案(来自Toybuilder)的区别相矛盾,后者将差异放在内部模型上,而我的建议是,假装物能否在实际世界中用于执行实际功能(在一定程度上)。

请注意,飞机模拟器还必须模拟地球、太阳、风等不属于飞机的东西,因此,飞机模拟器将不得不模仿飞机的某些方面,以及飞机的环境,因为它并非在实际环境中使用,而是在培训室中使用。

这与仅模拟原版的模拟器存在很大区别,它的目的是在不需要模拟原版的情况下在原始环境中使用。回到平面背景下...可能会有一个飞机模拟器吗?也许是一辆列车,将连接两个机场 - 实际上是两个飞机步骤 - 运载乘客,有空中小姐在机舱内,车内装饰看起来像真正的飞机客舱,并有队长说“女士们先生们,我们的飞行高度目前为10千米,目的地的温度是24°C”。它的好处很难看到,嗯...

总之,模拟器是一个真实的东西,旨在工作,模拟器是一种伪造,旨在欺骗用户。


1
“ROM模拟器”这个词组让我想起了虚拟视频游戏机。 - Joe Z.
1
可以将洗衣机称为洗涤模拟器吗?或者将ATM称为银行取款柜台模拟器吗? - lousycoder
@lousycoder:在这个背景下,模拟器在某种程度上是相近的(与模拟器相对),但我更愿意谈论自动化,原因有两点:1/ 用户能清楚地看到与原始设备的区别,2/ 设备取代了人类,而自动化正是如此。 - mins

14
要理解模拟器和仿真器之间的区别,需要记住模拟器试图模仿真实设备的行为。例如,在iOS模拟器的情况下,它模拟了一个实际的iPhone/iPad设备的真实行为。然而,模拟器本身使用安装在Mac上的各种库(例如QuickTime)来执行其渲染,以便效果看起来与实际的iPhone相同。此外,在模拟器上测试的应用程序被编译成x86代码,这是模拟器所理解的字节码。相反,实际的iPhone设备使用基于ARM的代码。
相比之下,仿真器模拟了真实设备的运作。在仿真器上测试的应用程序被编译成实际设备使用的字节码。仿真器通过将字节码转换为可以在运行仿真器的主机计算机上执行的形式来执行应用程序。
要理解模拟和仿真之间的微妙差别,可以想象你试图说服一个孩子玩刀具是危险的。要模拟这个情况,你假装用刀割伤了自己,并发出痛苦的声音。要仿真这个情况,你真的会割伤自己。

8
孩子们,不要在家尝试这个 :D - Gearoid Murphy

10

更通俗易懂地说:如果您的软件能够做到模拟系统可以做到的一切,那么它就是一个模拟器。如果它只是近似模拟系统(IT或其他)的结果,那么它就是一个仿真器。


9

模拟器是一个系统的模型,它可以接受模拟系统接受的任何有效输入,并产生相同的输出或结果。因此,只有当您的软件准确地重现了模拟系统的行为时,它才是一个模拟器。


谢谢。我认为这是对仿真的一个非常精确的定义。例如,Wine是一个模拟器,因为它不一定会给出在Windows中定义的相同精确输出? - Khaled Alshaya
6
小心试图把WINE硬塞到仿真器或模拟器的二选一框架中。WINE是一个兼容层,它使来自一个系统的二进制文件在另一个系统的二进制API层上运行。你可以把它称为适配器。我想把它理解为模拟器也不错,但实际上并没有比仿真器更接近。 - Lee B
WINE是一种仿真技术,在这个领域中应用广泛。它具有链接Windows二进制文件的外部表象,但如果你深入了解内部结构,你不会学到任何关于Windows的知识。 - Nick Bastin

9

几年前,我想出了一句非常简短的格言,我相信它很好地捕捉了两者之间的区别:

模拟器是一个有任务的仿真器。

我的意思是当你无法使用真正的设备时,你会使用仿真器;而当你无法使用真正的设备并且想要找出一些关于它的信息时,你会使用模拟器。


8

简单解释。

如果您想将运行Windows的PC转换为Mac,可以执行以下任一操作:

(1) 您可以在Windows上安装Mac主题。这样,您的PC就感觉像是Mac,但实际上您无法运行任何Mac程序。(模拟)

或者

(2) 您可以编程使PC运行得像Mac(我不确定是否可能:P)。现在,您甚至可以成功运行Mac程序,并期望与Mac相同的输出。(仿真)

在第一种情况下,您可以体验Mac,但不能期望与Mac相同的输出。
在第二种情况下,您可以期望与Mac相同的输出,但事实仍然是它只是一台PC。


4
这既简单又完全错误。第二个是接近仿真,但第一个既不是仿真也不是模拟。 - Nick Bastin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接