kなんとかの日記 このページをアンテナに追加

2010-06-16

「disる」と「指摘する」は違う・・・よね?

| 10:01 |  「disる」と「指摘する」は違う・・・よね?を含むブックマーク

cgi.rbをあんまり意識していないRubyistPHPdisれないのだとしたら、それはなんか「自分が完全完璧じゃないと、人を指摘してはいけない!」ような雰囲気になってしまってちょっと嫌かなぁと、というのが率直な感想です。

http://d.hatena.ne.jp/kwatch/20100613/1276385931#c1276477440

ワシは、「disる」と「指摘する」はだいぶ違うと思ってるんだけど、どうなんだろう。一緒と思っている人も多いのかな。

ワシのイメージはこんなかんじ。


「指摘する」の例:

http://www.rubyist.net/~matz/20080126.html#p04

disる」の例:

http://blog.livedoor.jp/dankogai/archives/50835571.html

ef3ef3 2010/06/17 13:46 まさに ruby では変数への代入が宣言です
p defined?(a) # => nil
a = 1 if false
p defined? a # => "local-variable"
ここでの問題の本質は、未使用変数の検出だと思います。
レシーバなし引数なしのメソッド呼び出しは左辺値式には現れないので、ローカル変数との区別は着くと思います。
ruby2rubyを使えば構文木が得られるので、ブロック内の個々の変数の宣言参照バランスを調べることで未使用変数は判ると思います。
flayに組み込めそうですね。

kwatchkwatch 2010/06/17 21:49 > まさに ruby では変数への代入が宣言です

それが静的に可能かどうかが問題です。defined? でわかっても、今回の場合ではうれしくありません。

> ここでの問題の本質は、未使用変数の検出だと思います。

代入したけど未使用なローカル変数と、代入してないのに参照しようとしているローカル変数ですね。

> レシーバなし引数なしのメソッド呼び出しは左辺値式には現れないので、ローカル変数との区別は着くと思います。

こちらの説明が足りてませんでした。正しくは、「レシーバなし引数なしのメソッド呼び出しと、*代入してない*ローカル変数との区別がつかない」です。

> ruby2rubyを使えば構文木が得られるので、ブロック内の個々の変数の宣言参照バランスを調べることで未使用変数は判ると思います。
> flayに組み込めそうですね。

期待してます。

ef3ef3 2010/06/18 09:32 二行目の a = 1 if false の a = 1 は実行されないのですが、宣言としては成立していて a の値は nil になります。この事は、スクリプトからは使い道はあまりなさそうですが、パーサだけで静的に変数の使用/否がブロック末で確定している事を示しています(実行時のcondにより出来たり出来なかったりするローカル変数がないという意味で静的です)。

動的・静的って表現は難しいですね
・変数の(示すインスタンスの)型は動的に決まる
・ローカル変数のスコープは静的に決まる
・ローカル変数のスコープは実行/否に関わらず、代入から始まる
という意味です

あと、ruby で「*代入してない*ローカル変数」は出来ないと思うのですが?

ブロックの最後の式の値がブロックの値になる事でしょうか?

kwatchkwatch 2010/06/19 09:14 ef3さん:
> ・ローカル変数のスコープは静的に決まる
> ・ローカル変数のスコープは実行/否に関わらず、代入から始まる

おーこれはわかりやすい。参考になる情報をありがとうございます。

> あと、ruby で「*代入してない*ローカル変数」は出来ないと思うのですが?

言語仕様上はそうですが、「ローカル変数に関するバグを検出する」という観点からは、以下のような場合が考えられます (本文でもちょっと触れてます)。

name, password = 'kwatch', 'anpontan'
p pass # 「pass」というローカル変数を使ったつもりが実は代入してなかった
p namae # 「name」というローカル変数を使ったつもりが実は typo してしまった

どちらの場合も、代入されてないのでローカル変数ではありません (これはef3さんのおっしゃる通りです)。ただ、ユーザはどちらもローカル変数のつもりで書いているので、これらをうまく検出しないと「ローカル変数に関するバグを静的に検出する」ことにはならないと思います。そして、こういったのが「レシーバなし引数なしメソッド呼び出し」と見分けがつかないよね、という意味でした。ちょっと説明がわかりにくかったですよね。すいません。

#スクリプト言語にそんなこと求める方が間違いだ!
#という意見もあるかと思いますが、今は単に思考実験
#だと思ってください。

ef3ef3 2010/06/26 08:46 #亀レス失礼

ローカル変数に限らず、typo の発見はかなりハードルの高いテーマですね。

スクリプト言語処理系の外部で(lintの様に)解析する方法も含めて、プログラマのミスを適切に指摘する機能は、重要な機能だと思います。