オブジェクト指向と副作用
[id:lethevert:20060329:p1]の続きになるわけですが、オブジェクト指向だから副作用が増えるというわけではないということは留意しておくべきかもしれません。今までも、そんなことは書いたことはなかったと思いますが、そうではないということも書いていなかったので。
オブジェクト指向でも関数型でもない古い言語、たとえば、COBOLとかを考えてみるとよいと思います。
000100 IDENTIFICATION DIVISION. PROGRAM-ID. SAMPLE. 000200 ENVIRONMENT DIVISION. 000300 DATA DIVISION. WORKING-STORAGE SECTION. 01 LINE1 02 STR1 PIC XX. 02 TXT1 PIC X(3) VALUES " # ". 02 NUM1 PIC 99. 02 TXT2 PIC X VALUES ".". 000400 PROCEDURE DIVISION. DISPLAY "INPUT 2 LETTERS > ". ACCEPT STR1. MOVE 0 TO NUM1. PERFORM 10 TIMES COMPUTE NUM1 = NUM1 + 1 DISPLAY LINE1 END-PERFORM. STOP RUN.
これは、実行するとこんな感じになります(と思う。手元にCOBOLコンパイラがないので、デバッグしてません。動かない可能性大)
C:\> sample.exe INPUT 2 LETTERS > MY MY # 0. MY # 1. MY # 2. MY # 3. MY # 4. MY # 5. MY # 6. MY # 7. MY # 8. MY # 9. MY # 10.
なんていうか、この頃のプログラム(COBOLだけ?)って、おそらく、副作用で成り立っていたんですよ。メモリ空間に固定的に領域を確保して、そこのデータを破壊的に書き換えながら実行が進むようなモデルなんです。"DISPLAY LINE1"とかって、真骨頂な感じですね。確かCOBOLって、動的にメモリを確保しない(もしかしたら、拡張構文があるのかも知れないけど、あまり使わないんじゃないかな)し、当然GCとかもないです。
そんな言語がこの世にあって、しかも今でも使われている(!!*1)ということを考えれば、オブジェクト指向の普及が如何に副作用を減らしたプログラミングの普及につながったかということは、言うまでもないですね。