手続き型言語(VO構文)vs オブジェクト指向言語(OV構文)

言語学的な文法から見た,手続き型言語(VO構文)vs オブジェクト指向言語(OV構文)について。


ビンゴ中西のほげほげプログラマは言語学者であるという熱い主張より(ただしリンクと<>の部分は僕がつけたしました):

そこには SVO や SVOO といった英語の文型を色濃く反映した構造が見受けられる(Sがない気もするが)。

しかし、次の記事<からのリンク>にあるように実は オブジェクト指向は OV という形ではないかという 意見があるようです。 コレは解釈の問題で SVO  OV どちらの理解も大切なような気がします・・・・

SV(O)とOV(C)の違い(カッコでくくったのは引数。CはComplement=補語)は言語学的にはきっと能動態か受動態かの違いだから一緒じゃないかなと*1。例えば。

文字列をトークン(配列)に分割する:

"just do it".split(" ")

のは「文字列を分割する」=OVC(文字列から見たら受動態,プログラマ=Sから見たらSOVCの能動態)の方が分かりやすいけど,
ある性質や関数を持っているかどうか:

if ( kent.hasTail() ) { ... }

は「もし『ケントが尻尾を持っている』ならば」=SV(ケントから見たら能動態)の方が分かりやすい。

これはやりたいことをどうモデル化すれば「直感的に理解しやすいか」ということですよね。実際にプログラムに落とすには「効率的にコーディングできるか」とかいった要素もモデル化にからんできますけれども。

それから,プログラミング言語におけるオブジェクト指向が読みやすいのはドットシンタックスの貢献が大きいと思います。関数(=VV)を適用した結果はデータ(=O)なので,「データを処理した結果のデータ」を処理する... といった場合,

func3( func2( func1(data) ) )

という風に関数を数珠繋ぎにしなければならない。これはV(V(VO)なので,処理の流れを追うためには後ろから読む必要があります。これがVOの書き方の限界ですね。それに対してオブジェクト指向の書き方であれば,

data.func1().func2().func3()

と前から読み下していくことができる(構文的には(((OV)V)V)ですね)ので,処理のフローが理解しやすくなります。認知脳科学的にいえば,関数の数が短期記憶のマジックナンバーを超えてもスタックオーバーフローにならない。:-) オブジェクトオリエンテッドという考え方(主語ドリブンとか名詞ドリブンとかデータドリブンとかと言い換えてもいいかな)が受け入れられたのはこの点も大きいでしょう。

プログラミング言語におけるオブジェクト指向というのは,このような「データドリブン」以外にも「変数と関数のスコープ/名前空間の局所化(いわゆるプロパティとメソッドのこと)」だとか,「アクセス制御(いわゆるカプセル化のこと)」だとか,「差分プログラミング(いわゆるサブクラスのこと)」だとか,「オブジェクトの最適化と型チェックを行う型システム(いわゆるクラスのこと)」だとか,そういったことが「抱き合わせ商法」的にセット売りされてるので分かりづらいんですが。(これらの考え方は本来独立したプログラミングテクニックなので,初学者には別々に教えた方がいいと思いませんか?みんなごっちゃにしすぎですよ。)

*1:SもOも名詞で,SとOの差は機能の違い。