我正在寻找在游戏中构建虚拟机,并且想知道是否有人知道任何非常简单的虚拟机(我认为RISC / PIC接近我想要的)通常用于嵌入式项目,如控制机器人,电机,传感器等。我主要担心的是,如果我自己编写,我必须编写一个编译器/汇编器。我很高兴使用已经存在的工具或者最简单的工具只是一个可以编译它的C编译器:-p。
我真的不想在这里重新发明轮子,但我还需要在虚拟世界中运行数千个,因此它们必须尽可能简单快速。正如一个人已经提到的,我也不关心现实世界的问题,如时间和公共汽车以及所有有趣的东西。我认为他们的虚拟时钟将被限制为很慢的东西;并且最终我可能不得不考虑本机编译以使它们运行得更快但是现在我只是将原型放在一起以获得概念的一般证明。
作为输入,我正在计划安装在圆柱体(16个,可能是32个)周围的距离,光线,材料和触摸传感器,然后只需2个电机进行方向输出,以控制每侧的一种轮子。基本上处理不会太费劲,世界将变得足够简单,以便机器不必在简单的任务中投入大量处理能力。
就内存而言,我希望他们能够存储足够的数据,在没有干预的情况下保留几天,无需构建地图和收集统计数据。我不喜欢8bit会削减处理或内存,但16bit肯定会成为竞争者。 32位和64位只会推动它,并且它们不会有超过1mb的内存 - 可能更接近256-512k。 (比尔一说640k就足够了,为什么我不能!!)
答案 0 :(得分:6)
我为一位朋友写了Wren,他希望在嵌入式控制器上运行VM语言,内存大约为16K。 (但它在代码中允许每个进程最多64k。)它包含一个用于愚蠢的小编程语言的编译器。这一切,呃,非常基本,并没有多少用处,但它正是你在第一段中所描述的。
答案 1 :(得分:5)
FORTH“虚拟机”就像它们来的一样简单。 16位地址空间(通常),16位数据字,两个堆栈,内存。 Loeliger的“Threaded Interpretive Languages”告诉你如何在Z80上建立一个FORTH解释器。
答案 2 :(得分:2)
如果您想要在现实世界中植根,最常用的嵌入式RISC微控制器之一就是PIC系列。谷歌提供了几个仿真器,但我认为大多数仿真器都没有。
另一种可能性是QEMU,它已经模仿了几种ARM品种。当然,如果你对模拟现实世界的设备不感兴趣,那么更容易和更好的表现就是推出自己的设备。只有您需要的东西,而不是陷入状态标志,溢出位,有限的总线宽度,RAM时序等等。
答案 3 :(得分:1)
如果你想要简单,请考虑曼彻斯特马克一世。见this PDF的第15页。机器有7条指令。为它编写一个翻译大约需要一个小时。不幸的是,这些说明非常有限(这就是为什么机器的完整规格几乎可以放在一页上)。
Javier推行自己的方法非常务实。如果是这样,设计和创建一台小型机器是一项为期两天的任务。几年前我为一个项目构建了一个小型虚拟机,用一个简单的可视化调试器编写虚拟机花了两天时间。
另外 - 它必须是RISC吗?你可以选择68K,其中有open source emulators,68K是gcc的一个众所周知的目标。
答案 4 :(得分:1)
许多编写游戏程序和其他应用程序的人在应用程序中嵌入了一种语言,允许用户编写小程序。
据我所知,最受欢迎的embedded languages最受欢迎的第一顺序(虽然"更受欢迎"并不一定意味着"更好& #34;)似乎是:
您可能需要查看Gamedev StackExchange,特别是"How do you add a scripting language to a game?"等问题。
您可以在StackOverflow标记"embedded language"上查看一些问题; 如 "Selecting An Embedded Language", "What is a good embeddable language I can use for scripting inside my software?" "Alternatives to Lua as an embedded language?" "Which game scripting language is better to use: Lua or Python?", 等
这些语言的许多实现都使用某种方式 内部bytecode。 通常,相同高级编程语言的两种不同实现(如JavaScript)在内部使用两种完全不同的字节码语言(a)。 通常,几种高级编程语言编译为相同的底层字节码语言 - 例如,Python的Jython实现,JavaScript的Rhino实现,Tcl的Jacl实现,JScheme以及Scheme的其他几个实现,以及几个实现Pascal; all编译为相同的JVM字节码。
<强>详情
为什么要使用脚本语言而不是解释某些硬件机器语言?
为什么"Alternate Hard And Soft Layers"? 为了获得简单和更快的发展。
更快的发展
人们通常使用脚本语言而不是编译语言来提高工作效率。
使初始原型工作通常要快得多 - 解释器处理机器语言迫使你明确写出的一堆幕后东西:将变量的初始值设置为零,子程序 - prolog和子程序-epilog代码,malloc和realloc以及免费和相关的内存管理内容,当容器满了时增加容器的大小等。
一旦有了初始原型,添加新功能就会更快:脚本语言具有快速的编辑 - 执行 - 调试周期,因为它们可以避免编译&#34;编译&#34;编译语言的编辑 - 编译 - 执行 - 调试阶段。
<强>简单强>
我们希望嵌入式语言语言简单&#34;有两种方式:
如果用户想要编写一些代码来执行一些概念性的微不足道的任务,我们不想用复杂的语言来吓唬这个人,这种语言需要20磅的书籍和数月的学习时间写一个&#34;你好,$ USER&#34;没有缓冲区溢出。
由于我们正在实施该语言,因此我们希望能够轻松实现。也许一些简单的底层指令我们可以在一个周末淘汰一个简单的解释器,也许某种预先存在的编译器,我们可以重复使用最小的调整。
当人们构建CPU时,硬件限制总是限制指令集。 很多概念上都很简单&#34;操作 - 人们一直使用的东西 - 最终需要大量的机器语言指令才能实现。
嵌入式语言没有这些硬件限制,允许我们实施 更复杂的&#34;说明&#34;做(对人类而言)概念简单的事情。 这通常使系统在上述两种方式中更简单:
直接用语言编写的人(或编写语言编译器的人)最终会编写更少的代码,花更少的时间单步调试代码等等。
对于每个这样的高级操作,我们将复杂性从编译器转移到解释器内部的指令实现。编译器将一些更高级别的操作分解为中间语言中的短循环(并在运行时在解释器中重复执行该循环),而不是(您编写代码),编译器会发出一个中间语言的指令(和你一样)在解释器执行该中间&#34;指令&#34;)中编写相同的一系列操作。使用编译语言(&#34;内部&#34;复杂指令)实现所有CPU密集型内容,非常简单的解释器通常不够快。 (即,你可以避免花费大量时间建立JIT或试图以其他方式加快速度。)
由于这些原因和其他原因,许多游戏程序员使用&#34;脚本编写&#34;语言作为他们的嵌入式语言&#34;。
(我现在看到Javier已经推荐了#34;使用嵌入式脚本语言&#34;, 所以这已成为为什么的长期咆哮,这是解释硬件机器语言的一个很好的替代方案,并指出当一种特定的脚本语言看起来不合适时的替代方案。 / p>