1

我正在考虑制作一个“编程游戏”,即每个玩家编写一个程序来控制他们的“机器人”,然后让这些程序相互竞争,看看谁赢了(根据“赢”的某种定义)。

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

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

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

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

4

2 回答 2

0

JVM 不是实时的,我怀疑你的操作系统也不是。依赖 JVM 和/或进程交互是行不通的,因为您受制于操作系统调度、JVM 线程调度等。

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

于 2012-10-30T12:34:08.220 回答
0

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

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

与在现成的优化 JVM 上运行相比,预计速度会降低 10 倍到 100 倍(取决于您的实现技术)。

或者,在调试模式下运行现有的 JVM,单步执行参赛程序,让您的游戏假装是调试器。我不确定这是否比自己编写一个简单的 JVM 更容易或更难。

于 2012-10-30T13:16:37.407 回答