In article <1036531761.901892.25889.nullmailer / picachu.netlab.jp>,
  matz / ruby-lang.org (Yukihiro Matsumoto) writes:

> 不条理を感じる人がいるのは理解できますが、では変えた方が良い
> かというと必ずしもそうは思っていません。

ふむ。

> 個人的にプログラム上の識別子の「意味」あるいは「種別」は静的
> に決まるべきだと考えています。

同意します。

> 問題はその決め方ですが、上から
> 順に見ていくというのは、2パスを避けるという観点からもそんな
> に悪くないと思っています。

それほど悪くはないかも知れませんが、if then else end については制御の
流れにそって解析しても 2パスにはならないでしょう。then節でのローカル変
数に関する判定には条件節およびそれよりも上の知識だけあれば十分で、else
節での判定も同様に条件節およびそれよりも上の知識だけあれば十分です。つ
まり、ある場所での判定にはそこよりも上の知識だけあれば十分で、else節で
のローカル変数の判定に then節の代入を使わないようにしても 2パスにはな
りません。

後置 if のほうは 2パスになるかもしれませんが、普通 1行ですむような短い
文にしか使われないので、2パスにすることによる実行コストの増加はそれほ
ど大きくないように感じます。

> まあ、ローカル変数に対する代入に静的な意味(宣言)と動的な意味
> (初期化)の両方の意味を与えているのが問題の元凶ではあるのです
> が、これは目的によって見方を変えてもらうのがよいと個人的には
> 思っています。つまり、ある識別子がローカル変数かどうか判定す
> る場合には、メソッドの先頭から(実行状況は無視して)宣言だと思っ
> て代入をスキャンしてすれば良くって、逆にローカル変数の実行時
> の値に関心がある場合には、そのまま代入として見ればよいのでは
> ないかと。

なぜユーザは「メソッドの先頭から(実行状況は無視して)宣言だと思って代入
をスキャン」すべきなんでしょうか?

プログラムというものが小説のように上から下に読んでいくべきものならそう
なのかもしれませんが、私はそうは思いません。私は根から葉に(なるべく余
計な葉には寄らずに)読めるべきだと思います。else節を読むのに then節も読
まなければならないというのが適切だとは思えません。

また、ローカル変数の静的な意味(宣言)は動的な意味(初期化)の近似でもあり
ます。一般に、ローカル変数に限らず、静的な意味は動的な意味の近似です。

そして、現在の上から下に検査するというのは近似としてはそれなりに適切で
す。とくに、プログラムの上から下に流れる部分については正確ですし、ルー
プに関してはボディ内は(参照できるときには必ず代入されていると言う意味
で)保守的な近似になっていて、ループの終了後は(ボディが一回も実行されな
い場合を無視しているという意味で)非保守的な近似になっています。クロー
ジャのようにいつ実行されるか不明でどうしようもない話を気にしないことに
すれば、残りは条件分岐です。

そして、あげた例のように、条件分岐については近似として見当外れなところ
があり、少なくともそこはよろしくないんじゃないかと思います。

ついでにいえば、今回の発端をこの見方からとらえなおせば、近似をもっと保
守的にして欲しいという要求だと解釈できるのですが、私の要求は見当外れな
ところを直せというもので狙いが違うので割り込むような形ではなく独立して
始めるべきだったかもしれませんが、それはそれとして。

> 知ってますが、そのプログラム解析のコストは割りに合わないので
> はないかと考えています。

むろん、まつもとさんが知らないと思っていたわけではありません。

コストについては... もちろん解析のコストは増えるのですが、その理由がパ
スが増えるからという点については納得しがたいものがあります。上で述べた
ように if then else end についてはパスを増やさなくてもいいわけですが、
仮に、「後置if はそのままでいいから if then else end については変えて
欲しい」という提案にしたら受け入れられるのでしょうか?
-- 
[田中 哲][たなか あきら][Tanaka Akira]
「ふえろ! わかめちゃん作戦です$(C⊇」(Little Worker, 桂遊生丸)