1

私は、「プログラミング ゲーム」を作成することを考えています。つまり、各プレイヤーが自分の「ボット」を制御するプログラムを作成し、プログラムを相互に戦わせて、誰が勝つかを確認します (「勝利」の定義による)。

これを公平にするために、各ボット プログラムは同じ速度で実行する必要があるため、事前にコンパイルされたネイティブの C/C++ コードを使用することは問題外に思えます。

3つのオプションを考えることができますが、2つについては確信が持てません:

  1. VM で実行される言語を使用する- これは、ボットが Java で記述され、JVM バイトコードにコンパイルされることを意味します。次に、すべてのボットが JVM を取得し、JVM の「クロック」または実行速度を制御するために必要なものを制御する必要があります。
    問題: JVM の「クロック」を制御して、Xクロック サイクル分のコードを実行するように指示できますか?
  2. スクリプト言語を使用する- ボットは JS や Python などで記述します。
    問題:上記と同じ - 速度を制御できますか?
  3. 独自の簡略化された言語を使用する-
    問題:私はコンパイラではなくゲームを書いています。プレイする人は、さらに別の言語を学ばなければならないことを意味します。つまり、誰もプレイしなくなります。

基本的に、問題は、JVMまたは一部の言語インタープリターの実行速度を制御できるかどうかです(理論上ではなく、実際には)?または、私が考えていなかった別のオプションはありますか?

4

2 に答える 2

0

JVMはリアルタイムではなく、OSでもないのではないかと思います。OSスケジューリング、JVMスレッドスケジューリングなどに翻弄されるため、JVMやプロセスの相互作用に依存することはできません。

複数のスレッドを調整する場合は、JVMスレッドモデル、特にロックを使用して2つのスレッドを調整する方法を確認する必要があります。

于 2012-10-30T12:34:08.220 に答える
0

1 つのオプションは、各プログラムから一定数のバイトコード命令のみを実行するように計測する独自の JVM を作成することです。バイトコードは人間が読めるソース コードを消化するのがはるかに簡単であるため、比較的少ない実装作業で済みますが、ユーザーは Java バイトコードを生成できる任意のプログラミング言語でプログラミングできます。

「スレッドなし」や「try/catch なし」などの制限を設けると、より簡単になります。いくつかのコア言語機能といくつかのドメイン固有の I/O 機能を実装する必要がありますがjava.lang.*、JRE の残りのほとんど (たとえばjava.util.*) については、既存の JRE 実装からバイトコードを実行することで回避できるはずです。 (ゲーム エンジンを配布する場合は法的な制約をモジュロします)。

市販の最適化された JVM で実行する場合と比較して、10 倍から 100 倍の速度低下が予想されます (実装テクノロジによって異なります)。

または、既存の JVM をデバッグ モードで実行し、ゲームがデバッガーのふりをして、競技者のプログラムをシングル ステップで実行します。これが必要最小限の JVM を自分で作成するよりも簡単か難しいかはわかりません。

于 2012-10-30T13:16:37.407 に答える