2005年11月17日 木曜日

「アルゴリズム+データ構造=プログラム」? 本当に?

福盛さんのプログラミングにおけるインターフェイスに関する考察。なかなか興味深く読ませていただいた。構造化の要件としての「アルゴリズム」と「データ構造」に加えて、プログラムになるには「インタフェース」も必要なのではないかという話。面白い視点だとは思うのだけど、はたしてそうなんだろうか?
プログラムという概念を考える際に人によってその規模が違うので、たしかに「アルゴリズム+データ構造=プログラム」というのは必ずしも自明ではない。(僕自身は「Σ(アルゴリズム×データ構造)=プログラム」ではなかろうかと思うのだけれども。) たとえば数行で記述可能な簡単なものから、Officeソフトのような大規模なものまで、どれもプログラムである。プログラムというものをどういうくくりで考えればいいのだろうか? 小規模なプログラムについては「アルゴリズム+データ構造=プログラム」と言う直感的な理解も可能であるが、福盛さんの考察は、構造化・モジュール化を進めた大規模なプログラムとなるとどうであろうかという論点であると思う。
僕はそもそも等号が成り立つような次元が同じ物ではないので階層化して考えたほうが自然だと思う。インターフェースやプログラムという概念は、「アルゴリズム」や「データ構造」のようなプリミティヴな存在であるか否か?という視点でかんがえたいのである。僕は「インターフェース」は「アルゴリズム」や「データ構造」とは同じ次元の存在ではなく、「アルゴリズム」と「データ構造」というプリミティヴな概念を演繹したようなもので記述可能ではなかろうかと思う。(公理論的アプローチなのかもしれないが…)
ではインターフェースというものをどう言う位置付けでおいておけばいいのかという話になるのであるが、インタフェースはその名のとおり、振る舞い(応答? 動作?なんて言うのかな)・データ・プログラム・外界との_相互作用_を考えた際にはじめて登場する概念だから、第1層目としてはアルゴリズム・データ構造、第2層目は第1層目の概念のみで記述可能であるインターフェース・プロシジャ・オブジェクト・プログラムというような階層的な理解でいいんじゃなかろうか? (プログラムを3階層目において置いた方がいいかな・・・整理悪いかも。)
ただしこれはプログラムの構成要素としてボトムアップして考えてみただけであって、実際のところプログラムが何でできているのかを考える際には実装詳細はどうでも良くて、インターフェースとその振る舞いが規定されていれば良いだけのような気がする。あとあの本はインターフェース云々以前の時代の本で、現代的なプログラミングとは若干の差があるのはあたりまえと思う。あくまで手続き指向な言語から構造化プログラミングへプログラミング・スタイルを切り替える提案をした本だという理解をすべきかと思うのだけど。ちゃんと読んでないから、なんとも。(Adaの本とかも今読むとふむふむと思うところはあるんだよねえ。Pascalに型総称性をいれてがちがちな仕様にしたらAdaになりそうだもんなあ。ただAdaにしてもPascalにしても好きではないな。)

日記の補完をせねば

今月は忙しくてあまり日記を書いてません。ネタはあるので、さかのぼって補完することになりそうです。