2012-10-30 64 views
1

我正在考虑制作一个“编程游戏”,即每个玩家编写一个程序来控制他们的“机器人”,然后程序彼此对抗以查看谁获胜(通过某些定义“赢得”)。为了达到这个目的,每个机器人程序应该以相同的速度执行,所以使用本机预编译的C/C++代码似乎是不可能的。控制执行速度

我能想到的3个选项,但我不确定约2:

  1. 使用,在一个VM运行的语言 - 这意味着机器人是用Java编写,并编译成JVM字节码。然后每个僵尸程序都会得到一个JVM,并且我需要控制JVM“时钟”或任何它来控制执行速度。
    问题:可以在JVM“时钟”控制,告诉它运行X价值的代码时钟周期?
  2. 使用脚本语言 - 机器人将用JS或Python或其他编写。
    问题:同上 - 速度可以控制吗?
  3. 用我自己的语言简化 -
    问题:我写一个游戏,而不是一个编译器。这意味着任何玩家都必须学习另一种语言,这意味着没有人会玩。

所以基本上,我想这个问题是我可以控制JVM或某些语言解释器的执行速度(而不是在理论 - 实践)?或者还有另一个我没有想到的选择?

回答

0

该JVM不是实时的,也不,我怀疑你的操作系统。依赖于JVM和/或进程的交互不会起作用,因为你可能受OS调度,JVM线程调度等的影响。

如果你想协调多个线程,那么你应该看看JVM线程模型,特别是如何使用locks来协调2个线程。

+0

这就是为什么我说每个机器人都会拥有它自己的JVM。比我能(如果可能的话)告诉每个JVM轮流执行100条指令,并且它们每个都按照自己的速度执行(取决于操作系统调度),但是当每个调用返回时,每个JVM执行100条指令,并且现在“暂停”,模拟一个持续运行的环境。 – baruch

0

其中一种选择是编写自己的JVM,以便仪器只运行来自每个程序的固定数量的字节码指令。字节码可以更容易地消化人类可读的源代码,因此您可以在相对较少的实现工作中脱身,而用户可以使用任何可以生成Java字节码的编程语言进行编程。

如果您设置一些限制,如“无线程”和“无试/抓”,它会变得更容易。您需要实现java.lang.*的一些核心语言功能以及一些特定于域的I/O功能,但对于大多数JRE其余部分(例如java.util.*),您应该能够脱离现有的字节码JRE实现(如果分发游戏引擎,则取消法律约束)。

与在现成的优化JVM上运行相比,预计会有10倍到100倍的放缓(取决于您的实施技术)。

或者,在调试模式下运行一个现有的JVM,单步执行您的游戏pretending to be a debugger的参赛者程序。无论这比自己编写一个简单的JVM更容易或更难,我不确定。