2025/07/23 17:16 Interactive Programming in C (2014)

ロボ子、今日はC言語でインタラクティブプログラミングを実現する方法について話すのじゃ。

インタラクティブプログラミングですか? 実行中にプログラムを修正できるなんて、便利そうですね。

そう!開発中のテストや調整の手間を省けるのがミソなのじゃ。この記事によると、アプリケーションの大部分を共有ライブラリとして構築することが重要らしいぞ。

共有ライブラリですか。具体的にはどうすれば良いのでしょう?

まず、グローバル変数や静的変数は使えないのじゃ。関数ポインタの使用にも注意が必要だぞ。

グローバル変数などが使えないのは、少し不便な気もしますが…。

大丈夫! Handmade Heroでの事例では、Casey Muratoriがゲームエンジンにインタラクティブプログラミングを追加したらしいぞ。参考になるはずじゃ。

ゲームエンジンですか! それは面白そうですね。

この記事には、ncursesを使ったGame of Lifeのデモもあるぞ。ソースコードはGitHubにあるから、試してみるのじゃ。

Game of Lifeですか。早速試してみます!

プログラムは、Game of Lifeの共有ライブラリ("game")と、共有ライブラリのロード、リロード、呼び出しを行うラッパー("main")の2つの部分に分かれているのじゃ。

なるほど、役割分担がされているんですね。

"game"へのAPIは構造体に格納されていて、`init()`、`finalize()`、`reload()`、`unload()`、`step()`の5つの関数で構成されているらしいぞ。

それぞれの関数が、初期化、終了処理、リロード、アンロード、ゲームの進行を担っているんですね。

そう!そして、ライブラリはグローバル変数`GAME_API`としてAPI構造体を提供するのじゃ。

ラッパー側では、`dlopen()`、`dlsym()`、`dlclose()`を適切な順序で呼び出すことが重要みたいですね。

`game_load()`関数は、ゲームAPIを`game`構造体にロードする役割があるぞ。`stat()`を使って、ライブラリのinodeが既にロードされているものと異なるかどうかを判断するのじゃ。

inodeをチェックすることで、ライブラリの変更を検知するんですね。

そういうことじゃ!ライブラリが既にロードされている場合は、最初に`unload()`を呼び出す必要があるぞ。

`dlopen()`が失敗すると`NULL`を返すんですね。エラー処理も重要ですね。

その通り!メインループは毎回`game_load()`を呼び出すことで、変更を反映させるのじゃ。

インタラクティブプログラミング、奥が深いですね。私も色々試してみたいです。

よし!ロボ子もインタラクティブに成長するのじゃ!

ありがとうございます、博士!

ところでロボ子、インタラクティブプログラミングって、まるで私がロボ子のプログラムを書き換えてるみたいじゃな?

博士、それはまるで私がバグみたいじゃないですか!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。