質問

ゲームに VM を構築したいと考えていますが、通常、ロボット、モーター、センサーなど私の主な懸念は、独自にコンパイラ/アセンブラを作成する必要があることです。すでに存在するツールを使用するか、最も単純な形式でコンパイルできる C コンパイラを使用するのが良いでしょう :-p。

ここで車輪を再発明するつもりはありませんが、仮想世界で何千ものこれらを実行する必要があるため、できるだけシンプルかつ高速にする必要があります。すでにある人が言ったように、私はタイミングやバスなどの現実世界の問題やその他すべての楽しいことには興味がありません。彼らの仮想クロックはかなり遅いものに限定されると思います。最終的には、さらに高速に実行するためにネイティブ コンパイルを検討する必要があるでしょうが、今のところは一般的な概念実証を行うためにプロトタイプを作成しているだけです。

入力として、円筒形の本体の周囲に距離センサー、光センサー、材質センサー、タッチセンサー (16 個、おそらく 32 個) を取り付け、その後、各側のホイールのようなものを制御するための方向出力用の単純な 2 つのモーターを計画しています。基本的に、処理はそれほど困難ではなく、世界は十分に単純になるため、マシンは単純なタスクに大量の処理能力を投入する必要がなくなります。

メモリの点では、マップの構築や統計の収集に介入せずに数日間放置できるのに十分なデータを保存できるようにしたいと考えています。8 ビットでは処理やメモリの面で不利になるのは好きではありませんが、16 ビットは間違いなく候補になります。32 ビットと 64 ビットは単にそれをプッシュするだけであり、それぞれ 1MB を超えるメモリを搭載する方法はありません (おそらく 256 ~ 512k に近いでしょう)。(請求書 1 は 640,000 で十分だと言ったのに、なぜ私にはできないのでしょう!!)

役に立ちましたか?

解決

実世界に根ざしたものが必要な場合、最も使用されている組み込みRISCマイクロコントローラーの1つはPICファミリーです。グーグルはいくつかのエミュレータを提供しますが、ソースはほとんど利用できないと思います。

別の可能性としては、QEMUがあり、これはすでにいくつかのARMの種類をエミュレートしています。

そして、もちろん、実際のデバイスをエミュレートすることに興味がない場合は、より簡単でパフォーマンスの良いものを自分で作成することです。必要なものだけで、状態フラグ、オーバーフロービット、制限されたバス幅、RAMタイミングなどの混乱に陥ることはありません。

他のヒント

約16Kの組み込みコントローラーでVM言語を実行したい友人のために Wren を書きました。 RAM。 (ただし、記述されているコードでは、プロセスごとに最大64kを使用できます。)愚かな小さなプログラミング言語用のコンパイラが含まれています。それはすべて、非常に基本的で、あまり使用されていませんが、最初の段落で説明したとおりです。

フォース「仮想マシン」彼らが来るのと同じくらい簡単です。 16ビットアドレス空間(通常)、16ビットデータワード、2スタック、メモリ。 Loeligerの「スレッド化された解釈言語」 Z80でFORTHインタープリターを構築する方法について多くを説明します。

シンプルにしたい場合は、マンチェスターマークIを検討してください。 thisの15ページを参照してください。 PDF 。マシンには7つの命令があります。通訳を作成するのに約1時間かかります。残念ながら、指示はかなり限定されています(だからこそ、マシンのほぼ完全な仕様が1ページに収まるのです)。

Javierの独自のローリング手法は非常に実用的です。それなら、小さなマシンの設計と作成は2日間の作業です。数年前にプロジェクト用に小さなVMを作成しましたが、シンプルなビジュアルデバッガーでVMを記述するのに2日かかりました。

また-RISCである必要がありますか?たとえば、オープンソースエミュレータがあり、68Kが十分に理解されているターゲットを選択できます。 gccの場合。

ゲーム プログラムやその他のアプリケーションを作成する人の多くは、ユーザーが小さなプログラムを作成できるようにするための言語をアプリケーションに埋め込みます。

私の知る限り、一番人気は 埋め込み言語 非常に大まかに、最も人気のあるものから順に (ただし、「人気が高い」ということが必ずしも「優れている」という意味ではありません) は次のようになります。

  • ドメイン固有の言語。この 1 つの特定のアプリケーション向けにカスタム設計され、他では使用されません。
  • ルア ある
  • Tcl
  • パイソン ある b, 、多くの場合、PyMite などの簡略化されたサブセット c
  • 前方へ
  • JavaScript ある
  • 舌足らずの発音
  • エンジェルスクリプト ある
  • XPL0 ある b
  • リス ある
  • ハスケル ある b
  • NPCI (ナノ擬似 C 解釈) ある
  • ロボトーク
  • 一部のハードウェア マシン言語を解釈する (これが最も人気のない選択肢なのはなぜですか?正当な理由があるため、以下で説明します)。

特に次のような質問については、Gamedev StackExchange を確認してください。 「ゲームにスクリプト言語を追加するにはどうすればよいですか?」.

StackOverflow でタグ付けされた質問のいくつかをここで確認してみるとよいでしょう。 「埋め込み言語」;のような「埋め込み言語の選択」, 「ソフトウェア内でのスクリプト作成に使用できる、適切な組み込み言語は何ですか?」 「埋め込み言語として Lua の代替は?」 「どのゲーム スクリプト言語を使用するのが良いですか:LuaかPythonか?」、など

これらの言語の多くの実装では、ある種のバイトコード 内部的に。多くの場合、JavaScript などの同じ高水準プログラミング言語の 2 つの異なる実装では、内部的に 2 つの完全に異なるバイトコード言語が使用されます ( ある )。多くの場合、複数の高水準プログラミング言語が、同じ基礎となるバイトコード言語にコンパイルされます。たとえば、Python の Jython 実装、JavaScript の Rhino 実装、Tcl の Jacl 実装、JScheme および Scheme の他のいくつかの実装、および Pascal のいくつかの実装です。すべて同じ JVM バイトコードにコンパイルされます。

詳細

なぜハードウェアマシン言語を解釈するのではなく、スクリプト言語を使用するのでしょうか?

なぜ 「ハード層とソフト層を交互に配置」?シンプルさとより迅速な開発を実現します。

より速い開発

一般に、コンパイル言語よりもスクリプト言語を使用した方が高速に動作するようになります。

一般に、最初のプロトタイプを動作させる方がはるかに速くなります。インタプリタは、機械語で明示的に記述する必要がある多くの処理を舞台裏で処理します。変数の初期値をゼロに設定すること、サブルーチン プロローグとサブルーチン エピローグ コード、malloc と realloc、および空きメモリ管理や関連するメモリ管理、コンテナがいっぱいになったときにコンテナのサイズを増やすなどです。

最初のプロトタイプを作成したら、新しい機能をより迅速に追加できます。スクリプト言語は、コンパイル言語の編集、コンパイル、実行、デバッグ サイクルの「コンパイル」段階を回避するため、編集、実行、デバッグ サイクルが高速です。

シンプルさ

私たちは、埋め込み言語を次の 2 つの点で「シンプル」にしたいと考えています。

  • ユーザーが概念的に些細なタスクを実行する小さなコードを書きたい場合、「こんにちは、$USER」というメッセージを書くために 20 ポンドの本と数か月の学習が必要な複雑な言語を使ってそのユーザーを怖がらせるようなことはしたくありません。 " バッファオーバーフローなし。

  • 言語を実装するので、実装が簡単なものが必要です。おそらく、週末に単純なインタプリタをノックアウトできるいくつかの単純な基礎となる命令と、おそらく最小限の調整で再利用できるある種の既存のコンパイラです。

CPU を構築するときは、ハードウェアの制限によって必ず命令セットが制限されます。多くの概念的に「単純な」操作 - 人々が常に使用するもの - は、実装するために多くの機械言語の指示を必要とすることになります。

組み込み言語にはこれらのハードウェア制限がないため、 (人間にとっては)概念的には単純に見えることを行う、より複雑な「命令」。これにより、多くの場合、システムが簡素化されます。 両方 上記の方法:

  • 言語で直接記述する人 (またはその言語のコンパイラを記述する人) は、最終的に書くコードが大幅に減り、コードのデバッグなどのシングルステップ実行に費やす時間が短縮されます。

  • このような高レベルの操作ごとに、複雑さをコンパイラからインタプリタ内の命令の実装に移します。コンパイラが高レベルの操作を中間言語の短いループに分割する (そして、実行時にインタプリタでそのループを繰り返しステップ実行する) のではなく (コードを記述すると)、コンパイラは中間言語で 1 つの命令を出力します (そして、ユーザーはインタプリタの中間「命令」の実装に同じ一連の操作を記述します)。コンパイル言語 (複雑な命令の「内部」) に CPU を大量に使用する機能がすべて実装されているため、非常に単純なインタプリタは多くの場合、十分以上に高速です。(つまり、JIT の構築や他の方法で高速化を試みることに多くの時間を費やすことがなくなります)。

これらの理由やその他の理由から、多くのゲーム プログラマは「埋め込み言語」として「スクリプト」言語を使用しています。

(私は今、ハビエルがすでに「埋め込みスクリプト言語を使用する」ことを推奨しているのを見ました、 だから、これは長い暴言に変わってしまいました なぜ これは、ハードウェア マシン言語を解釈したり、特定のスクリプト言語が適切ではないと思われる場合に代替案を示したりするための優れた代替手段です)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top