C/C++ を「スクリプト言語」として使用するアーキテクチャを作成しようとしています。私はすでに以下に基づいて動作するプロトタイプを持っています:
http://www.codeproject.com/Articles/29999/Compiling-C-code-at-runtime
と
http://runtimecompiledcplusplus.blogspot.com
私のプロトタイプでは、ダイナミック リンク ライブラリ / 共有オブジェクトを再コンパイルし、実行時に再ロードできます。次のコードの例を見てみましょう。
[bot.c]
typedef struct
{
float health;
float speed;
bool alive;
} Bot;
Bot bot = { .health = 100.0f,
.speed = 1.0f,
.alive = true };
void OnCollision( void )
{
bot.health -= 10.0f;
if( bot.health <= 0.0f )
{ bot.alive = false; }
}
void OnUpdate( void )
{
if( bot.alive )
{
/* Update animation */
}
}
bot.c スクリプトが 1 つのボットに割り当てられている場合は問題ありませんが、コールバックを複数のボットに割り当てると、同じデータを共有します (1 つがヒットすると、すべてがヒットします!)。各ボットに対してボットスクリプトを「個別に」実行するにはどうすればよいですか?
私はすでに C/C++ でコルーチンを研究していますが (setjmp/longjmp を使用)、C++ コンストラクターとデストラクタにはリスクがあります (また、関数内にマクロを統合する必要があります。私の場合、これはユーザーのオプションではありません)。
複数のスレッドを実行することを考えていましたが、同じ問題が発生します (データは dll から取得されるため、共有されるため)。フォーク/コプロセスにはあまり慣れていませんが、私の場合には当てはまらないようです。そして、パイプもオプションだとは思いません...私はかなり行き詰まっています。
とにかくこの問題を解決する方法はありますか?
ps: はい、Lua や Javascript (V8) などのスクリプト言語にはコルーチンが組み込まれていること、または Lua lua_thread の場合は問題を解決できることは知っていますが、ユーザーがコーディングできるように C/C++ インターフェイスを使い続けたいと考えています。ゲームのパフォーマンスは非常に重要です。