「C言語とC++がわかる本」というムック(2013年4月2日発売)の作業で、Windows 8/RTで動く「Windowsストア アプリ」をC++で作った。元記事はVisual BasicとC#(シーシャープ)で作っていたので、それをC++で書き直すというわけだ。
これが想像をはるかに超えて難しく、土日に働き続けるのはもちろんのこと、1日の睡眠時間を2時間に削ったりして長時間取り組んでも、思うように進まなかった。印刷会社にデータを渡す日は近付くしプログラムは動かないしで、10年に1度クラスの大ピンチ。冷や汗をかき、涙目になりながら書き続けて何とか間に合わせたのだが、どこが最大の難所だったかというと、「順次処理を書いたつもりなのに順次処理してくれない」という、常識破りの大変化があったことだと思う。
手続き型のプログラミング言語でプログラムを書く場合、プログラマが
処理A
処理B
処理C
でも、Windows 8/RT用のWindowsストア アプリのプログラムはそうではない。コンピュータは処理Aを始め、処理Aが終わったかどうかにかかわらず処理Bを始め、処理Aと処理Bが終わったかどうかにかかわらず処理Cを始める。上の行の完了を待たずに非同期に次の行を実行し、かっ飛んでいってしまうのだ。
これは、私にとってものすごくショッキングなことだった。プログラミングの常識がひっくり返ったと言ってもよい。あるプログラムで正しい結果が得られずにデバッガを使ってステップ実行をしたときに、結果が正しかったのには呆然とした。ステップ実行をすれば正しいのに通常実行をするとおかしいのは、通常実行が順次実行ではないからなのだ。どうしろっていうんだ!と頭を抱えた。
こういう「非同期プログラミング」は色々なところに現れつつあるようだ。Windowsストア アプリの開発では、Visual Basic、C#、JavaScriptのどれを使っても、C++と程度の差こそあれ、非同期処理と無関係ではいられない。日経ソフトウエア2013年5月号の特集2「イチからわかるサーバーサイドJavaScript Node.js入門」によると、Node.jsでも非同期処理が行われているらしい。つまり、あなたもある日突然、非同期の世界に迷い込んでしまうかもしれないのだ。
ここからは、非同期の世界がいかに恐ろしいかを、なるべくシンプルなC++コードで説明する。私が味わった苦闘の日々を、皆さんには追体験してほしくない。この記事が少しでも助けになればと思う。