控制执行速度

时间:2012-10-30 12:29:39

标签: jvm interpreter bytecode

我正在考虑制作一个“编程游戏”,即每个玩家编写一个程序来控制他们的“机器人”,然后这些程序会互相攻击以查看谁获胜(通过某些“胜利”的定义) )。

为了公平起见,每个bot程序应该以相同的速度执行,因此使用本机预编译的C / C ++代码似乎是不可能的。

我可以想到3个选项,但我不确定2:

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

  4. 所以基本上,我想问题是我可以控制JVM或某些语言解释器的执行速度(理论上不是 - 在实践中)吗?还是有其他选择我没想到?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

如果你制定一些限制,比如“没有线程”和“没有尝试/捕获”,这会变得更容易。您需要实现java.lang.*中的一些核心语言功能以及一些特定于域的I / O功能,但对于大多数JRE的其余部分(例如java.util.*),您应该能够从现有的JRE实现中执行字节码(如果你分发游戏引擎,则为模数法律约束)。

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

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