SSブログ

プログラミング言語の意味の違い

ちょっと前の話だが、dankogai さんのブログで JavaScript における値と参照の区別を説明する記事 [1] があって、Number は値だということの根拠として以下のような作例をしていた。

var a = 0;
var b = a;
b++;
p(b);
p(a);

そして、少なくともこの例だけでは根拠になってないよ、ということでコメントやトラックバックで突っ込みを受けていた。

ここでは JavaScript の話の内容に立ち入るつもりはない(リンク先を見てください)のだけど、こういう風に「意味の違い」を議論するときの原則というのはおそらく、
(a) プログラムが言語処理系に受理されるかされないかの違いがあるか、
(b) 上記のような作例を作って意味の違いがプログラムの動作の違いとして観察できるか、
ということのみを元に判断せよということなのだろうと思う。言語学者が発話データや話者の文法性判断を元に話者の頭の中にある文法について仮説を立てるのと一緒だ。

ここで「実装ではこうなっている」(あるいはこういうコードにコンパイルされる)という話をしだすと話が混乱してきて、実装がどうであっても上記 (a) ないし (b) の形で empirical に観察できなければ、説を支持する根拠にはできない。実装の話をする人は下位レベルに降りているように見えて却って形而上学をやっている。

こういう立場に立った上で(こういう立場には何かいい名前が付いているかもしれない)、しかし何をもって観察可能な事象とみなすかはコンピュータの世界でも微妙なケースがあると思う。そういうことをつらつらと考えていた。

例えば冒頭の JavaScript の記事に対するあるブログ記事(URLは失念)では String が値ではなく参照である根拠として、String をコピーする処理は文字列の長さによらず速い、これは String が参照である証拠だ、というような議論をしていた。これは意味の違いを云々するのに十分な根拠だろうか。

ひとまず「処理時間は意味の違いと関係ない」という立場に立ってみる。
ここで副作用の無いある言語の評価が eager か、それとも lazy かを観察するために、if を関数として定義して、もし lazy であれば評価されないと期待されるほうの引数に無限ループする関数を与えるという作例を考える。無限ループせず停止すれば lazy だとみなせる。いつまで待っても止まらなかったら eager とみなせるのだろうか。ひょっとしたら息の長い GC が始まってしまって80年後くらいに止まるのかもしれない。処理時間が意味の違いと関係ないとしたらこのような作例は無効なのだろうか。

私は前者を無効、後者を有効としたい気持ちがあるのだけど、うまい理由は見つからない。

処理系の受理非受理についても微妙なケースがある。例えばコンパイラの出すエラーメッセージが違う、というのを根拠にした議論は有効だろうか。私は以前そういうことを根拠に自分の考えを述べたことがある [2] のだが、今思うとこうした議論は間違っていた気がする。

コンパイラのエラーメッセージはプログラミング言語の制約のうちいずれに違反していたかを示すものだから一見強い証拠を提供するように見える。しかし「受理/非受理」ではなく「非受理される2ケースの違い」を根拠にするとき、その2つはいずれも「その言語のプログラムの集合に含まれない」と判断されたのであって、結局のところ両方とも無意味ということだ。

[1] http://blog.livedoor.jp/dankogai/archives/50963275.html
[2] http://blog.so-net.ne.jp/rainyday/2007-08-19


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。