萌えハッカーニュースリーダー

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

出典: https://nullprogram.com/blog/2014/12/23/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

博士、それはまるで私がバグみたいじゃないですか!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search