オブジェクト指向と副作用

[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)ということを考えれば、オブジェクト指向の普及が如何に副作用を減らしたプログラミングの普及につながったかということは、言うまでもないですね。

*1:本当に。ERPの世界では中核言語ですから。JavaCOBOLを共存させるみたいな笑い話のようなことを、大真面目に取り組んでいたりします。