VBScriptの限界を突破せよ:レジストリとFSOによる「疑似IPC」実装の極意
VBScriptは、現代のモダンな言語と比較すれば確かに「化石」だ。しかし、Windowsの心臓部に深く根を下ろしたこの言語は、適切に扱えば今なお最強のタスク自動化兵器となり得る。
多くのエンジニアは、別プロセスで動くスクリプト同士の連携を諦め、テキストファイルの読み書きという原始的な手段に逃げる。だが、I/O待ちのオーバーヘッドが許されない現場においては、それは「罪」だ。
本稿では、レジストリの高速なメモリキャッシュ性能とFileSystemObjectのロック制御を組み合わせた、VBScriptにおける極限のプロセス間通信(IPC)アーキテクチャを提示する。
—
1. なぜ「ファイル」ではなく「レジストリ+ロック」なのか
FileSystemObject(FSO)単体での読み書きは、ディスクI/Oのレイテンシに直結する。OSはレジストリ(`HKEY_CURRENT_USER`以下など)へのアクセスをメモリキャッシュで最適化しているため、極小サイズのメッセージのやり取りであれば、ファイルシステムよりも圧倒的に高速だ。
ただし、レジストリには競合(Race Condition)という脆弱性がある。これを制御するために、「アトミックなロックファイル」という概念を導入する。
2. 実装の心臓部:排他制御と高速伝送
以下のコードは、レジストリをデータバスとし、空のファイル作成をセマフォ(ロック)として利用する疑似IPCクラスである。
‘ VBScript IPCクラス(抜粋)
Class IPCChannel
Private FSO, WshShell, LockFile, RegKey
Private Sub Class_Initialize()
Set FSO = CreateObject(“Scripting.FileSystemObject”)
Set WshShell = CreateObject(“WScript.Shell”)
LockFile = WshShell.ExpandEnvironmentStrings(“%TEMP%\ipc_lock.tmp”)
RegKey = “HKCU\Software\MyApp\IPC_Channel\”
End Sub
‘ 排他制御を伴うメッセージ送信
Public Sub SendMessage(msg)
Do While FSO.FileExists(LockFile)
WScript.Sleep 10 ‘ CPU負荷を抑えつつ待機
Loop
‘ ロック取得
FSO.CreateTextFile(LockFile, True).Close
‘ レジストリへデータ書き込み
WshShell.RegWrite RegKey & “Data”, msg, “REG_SZ”
‘ ロック解放
FSO.DeleteFile LockFile
End Sub
‘ オブジェクトの明示的解放(メモリ管理の鉄則)
Private Sub Class_Terminate()
Set FSO = Nothing
Set WshShell = Nothing
End Sub
End Class
3. チーフアーキテクトが説く「極限の最適化」
この実装を本番環境で運用する際、以下の3点を徹底しなければ、システムは必ず破綻する。
① CPUスピンロックの回避
`WScript.Sleep`を省いてはいけない。VBScriptはシングルスレッドで動作するため、無限ループで待機するとCPUコアを100%消費し、OS全体のレスポンスを著しく低下させる。`WScript.Sleep 10`は、Windowsのプリエンプティブ・マルチタスクの恩恵を最大限に受けるための「優しさ」だ。
② メモリリークの排除
`Set Object = Nothing`を怠るな。VBScriptのガベージコレクション(GC)は予測不能だ。特にWSH(Windows Script Host)環境下では、長時間稼働するスクリプトでオブジェクトの解放を忘れると、プロセスのワーキングセットは肥大化し続け、やがてページファイルが枯渇する。
③ レジストリの「掃除」を忘れない
レジストリを高速なメモリキャッシュとして使う代償は、ゴミデータの蓄積だ。終了処理(`Class_Terminate`)で確実にキーを削除するか、あるいは通信専用の領域として適切に管理し、定期的にパージする設計を組み込むこと。
4. このアーキテクチャの適用範囲
この手法が最も輝くのは、以下のシナリオだ。
- GUI(HTA)からのバックグラウンドタスク制御: HTAで進捗表示を行い、背後で動く複数のVBScriptから計算結果をリアルタイムに受け取る。
- 監視エージェント: 複数のプロセスが個別に死活監視を行い、異常を検知した瞬間に、中央管理プロセスへレジストリを介して「警報」を飛ばす。
—
終わりに:技術は「枯れる」のではない
VBScriptを「古い」と断じるのは簡単だ。しかし、この環境で極限の最適化を突き詰めることは、プログラミングの基礎体力、すなわち「OSがどのようにメモリを管理し、どのようにI/Oを処理しているか」を理解することに他ならない。
この記事を読んだ諸君には、APIの深淵を覗き、環境の制限を言い訳にせず、与えられたリソースの中で「最速」を叩き出すエンジニアであってほしい。
さあ、コードを書いて、この沈黙したレジストリに命を吹き込め。
