2014/07/21
プログラムは書いたとおりに動くのか
もちろん、コードはバグも含めて書いてあるとおりに動く。 だからプログラマは自分の意図をなるべく無駄なく正確に記述出来る言語を望むわけだ。 自分が思うとおりにプログラムを動かしたいからね。
けれども、プログラムの振る舞いというのは、書いてあるコードだけでは決まらない。 矛盾するようだけど、「決まる」のレイヤが違うのだ。
プログラムの出力は、当然、コードだけでなく与えられたデータで決まる。 プログラムの目的が、ただデータを受け取り処理して出力するだけなら、 その処理過程はコードにすべて記されているのだから、コードがすべてと言える。
けれども現実のプログラムのほとんどは、 プログラムとしての入出力の他にもデータを抱えていて、 プログラム総体としての動作はコードだけでなく内部データにも依存している。 プログラマとしては、自分の責任はコードが仕様通り動くところまでだよ、 望む動作をさせるために必要なデータは各自用意してね、と言いたいところだけど、 ユーザから見れば、どこまでがコードで決まりどこから内部データ=内部状態に依存しているかは どうでも良いことだ。
昨今は、プログラムがユーザから見て「正しく」動くためにこの内部データの 比重がどんどん増しているように思う。例えば統計的スパムフィルタ。ユーザから見た 「正しい動作」とは、ユーザがスパムだと思うメールを弾いて、ユーザがそう思わない メールを通すことだ。コードだけ見ていくら正しさを検証したとしても、 ユーザにとっての正しい動作は保証できない。ユーザにとっての正しい動作に 近づけるには、データの性質に沿うようにコードを変形させ適合させてゆく必要がある。
また、コードとデータの境界というのは、それほどはっきりしているものでもない。
ゲームのエフェクト。アーティストが用意したデータファイルを読み込んで表示するようにするか、 プログラム的に生成するか、一部は素材として読み込んで一部はプログラムで生成するか、 どこに線を引くべきかは、開発リソースにも依存するし、どんな出力が欲しいかによっても変わってくる。 出来を見ながら試行錯誤する段階で、線引きがころころ変わることもある。 実装上も、外部ファイルから読んでいればいかにもデータっぽいが、 プリプロセッサ通して静的なデータとしてプログラムにリンクしたり、 さらにデータからパラメータを抽出してそれを埋め込んだコードを生成したり、 とやってゆくとどこまでがコードかわからない。
言語処理系をいじってるとコードとデータの境界は相対的なものにしか見えなくなる。 Scheme処理系にとって、処理対象のSchemeプログラムはデータだ。 GaucheがSchemeスクリプトを読んで何か意味のある動作をする時、 Gaucheに着目すればSchemeスクリプト自体は内部データだが、 Schemeを見ればそれはコードだ。しかも総体としてのプログラムにとって、 Schemeコードが実行時解釈されているかコンパイルされてコードの一部になっているかは どこまで部分評価してるかという程度問題で、ユーザにとっては意味をもたない。
★ ★ ★
さて。自分の書いたコードについて、その動作を隅から隅まで把握し、 正しさを保証したい、と思うのはプログラマとして無理からぬことである。 静的型システムや、副作用の排除といった枠組みはそれを助けてくれる。
でも、それで完璧に正しいコードが書けたとしても、 プログラムの動作を決めている内部データの方がうんと大きかったら、 それで保証される正しさはごく限定的なものになる。
むしろ、現在のソフトウェアの趨勢を見ていると、未来のプログラムのあり方というのは、 何だか良く分からない可塑性のある膨大なデータが永続的に存在していて、 各種プログラムは後付けでそこにそれぞれの意味を見出して寄生するような形に なるかもしれない。
入力データの仕様と出力データの仕様が決まってからプログラムが書かれるのではなく、 プログラムを書きながら、バージョンアップを重ねながら、 当初見えなかったデータの「かたち」を彫り出して、 思いもかけなかった出力を得てゆく、 そういう「プログラミング」の重要性が増してゆくかもしれない。
Tag: Programming
seiki (2014/08/04 16:31:20):