flat7th

memo/20120618

created 2012-06-18 modified 2012-06-18 

人間は、シンプルにバイクや自転車の絵を描いてだれかに伝えようとしたとき、横から見た絵を描くと思う。

これって、実はすごいこと。どの方角から見た絵を描けば、そのものの特徴を一番分かりやすく表現できるかを瞬間的にぐるっと検索して、よし、ここだ、と決めて、イメージを紙に投影する。




プログラミング言語の、字面表現について思うところがたくさんあるのだが、今そういう分野ってあまり発展していない気がする。

飛躍するけど、Qtのサンプルで

layout->addWidget(spinbox);
layout->addWidget(slider);
window->addLayout(layout);

ってのがあって、率直に言って言語として読みにくくね?と思った。


パラメータ型によるメソッドの区別で
layout->add(spinbox);
layout->add(slider);
window->add(layout);
でもいいわけだ。
(でもそれがメンテ性いいか悪いかは検討が必要だ。)
add っていう単語を選ぶこと自体についても議論できる余地がたくさんある。他の言葉だとどうか、と。


次に矢印について。まあC++でポインタだから "->" なのも分かる。けど、上のサンプルを、前提知識が薄い状態で読んだ人は混乱すると思うんだ。


矢印を図解表現で用いるとき、「どっちがどっちを指すのか」で混乱することが、よくある。で、みんなが合意しやすいのは、「情報や物が流れていく」さまをイメージして、「ブツが流れる方向に矢印を描く」ことだと思う。そうすると、上記はむしろ

         幅・高さの情報
spinbox ----------------> layout計算をするひと

         幅・高さの情報
spinbox ----------------> layout計算をするひと

                      幅・高さの情報
layout計算をするひと ----------------> window

であって、矢印の向きが逆なのよね。まぁこれはC言語の罪のひとつかな。


じゃあ、ポインタじゃなくてauto変数で . にしたらどうなるか。
layout.add(spinbox);
layout.add(slider);
window.add(layout);
ふむ。

使役っていう考え方で、このほうがまともだと思う。
layout.内包する(spinbox);
layout.内包する(slider);
window.使用する(layout);


主語と目的語が入れ替わるとどうか。
spinbox .所属する layout
slider .所属する layout
layout .情報を提供する window
とか。

字面の問題って、実は重要だと思うんだよなぁ。


さらに飛躍。今オブジェクト指向って、クラスがプロパティとメソッドを持ってる、ていう考え方で、そこは20年くらい変わってないけど、そろそろ yet another が出てもいいよね。

プログラム言語は、ソースコード上で以下のような事柄を記述できる必要がある。
  • アルゴリズムだけじゃなくて、
  • オブジェクトの所有関係とか、
  • ライフサイクル(いつ生まれていつ消えるか)とか、
  • 同時処理の区切り(スレッド分割)とか。

プログラムという多次元の塊を、どの次元に焦点を当ててソースリスト=文字の並びに投影するか、なんだけど、今ってスレッド分割とかは非常に分かりずらいところに追いやられてるよね。

(相当飛躍するけど、統一場理論は10次元で考えると5通りあって混乱してて、11次元にしたら全部同じものだったんだそうな。11人いる!てなもんですな)


また飛躍。「メソッド」って、元は非オブジェクト指向言語の「関数」で、ソースコードの文字列では、パラメータを括弧でくくって表現するけど、そのパラメータのうち
  • どこが in パラメータで
  • どこが out パラメータなのか
も、「ソースコードで表現しずらい角度で投影」されていると思う。

SVOC的な考え方で、APIのメソッドをどう構成するかは、
それぞれのライブラリの「流儀」である、として、ソフトウェア工学がプログラマに丸投げしてしまっている。それって、混乱の一因なのよね。

つまり、ソフトウェア工学の専門家が、世の中に「解の案」を提示すべき問題として、以下の問題があるってことだ。
  • 2つのオブジェクトがかかわる、というソースコードで、主語と述語をどう選択すべきか
  • メソッドの述語をどう選択すべきか
  • パラメータのうち、どこがinパラメータでどこがoutパラメータなのかを、どう分かりやすくするか(分かりやすくするとメンテナンス性の高いプログラムの蓄積で人類に貢献できる)

そもそも、パラメータっていう考え方がもう時代遅れなのかも。ロボット関係の開発環境だと、
        伝達情報
送信者 ----------> 受信者
ていう、有向グラフ構造を、GUIで作成できる環境がほぼ標準になりつつある。これって、テキストでのプログラム表現にフィードバックできるよね。





思えば、ぼくら世代は英語を学ぶ前にBASICを読んでいた。つまり、自分にとって英語は第二外国語なんだな。

石田先生の「パソコン言語学」を読んだのは、小学生のときだったのか、中学生になってからだったのか。なんか、それがすごく重要なことのような気がしてきた。

独り言だけど
  • HTMLの単語頻度分布判定のアレとか
  • pktsendとか
自分が lex/yacc で作ったものを公開できていないわけだが、頑張って公開できるものを用意してみようかな。

自分が、「昔からプログラム言語の字面に興味を持っていて、そこについて思うことをたくさん持っている」ことを、他の誰かに分かってもらえるきっかけになるかもしれないから。



まつもとゆきひろさんみたいな言語マニアの方が、石田先生の「パソコン言語学」を継ぐ、21世紀版を書いてくれないかなぁ、と半分あきらめ、半分本気で期待。そんな本、誰が買うのかって?僕は買います。でも一般的には売れないだろうなぁ(w