トップ «前の日記(2006-04-03) 最新 次の日記(2006-04-05)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2006-04-04

_ お釈迦様までもう一歩

しがつよっかった。

_ 動的言語

やりたければ、こんなことだって出来るしな。

class Ordinal
  def monologue
    'hello citizens !'
  end
end
 
class Sleepy
  def method_missing(m, *a)
    return "don't disturb neko"
  end
end
 
class Metamon
  def initialize(org)
    @org = org
  end
  def method_missing(m, *a)
    @org.send(m, *a)
  end
end
 
class Yesman
  def method_missing(m, *a)
    print "what opinion do you have about #{m} ? "
    gets
  end
end
 
def show_yourself(o)
  puts o.monologue
end
 
show_yourself(Ordinal.new()) # hello citizens
show_yourself(Sleepy.new()) # don't disturb neko
show_yourself(Metamon.new(Ordinal.new())) # hello citizens
show_yourself(Metamon.new(Sleepy.new())) # don't disturb neko
show_yourself(Yesman.new()) # ?

Yesmanのインタラクティブ性に興味がある。

調べたいのなら調べられる言語を使えばいいだけではなかろうか? 調べられない前途洋々たる用途にそっちは使えないんだからバランスじゃん。

つまり全然問題とは思えないんだけど。っていうかそういうことができない言語しかないとそのほうが問題。

_ むむむむ

ネタじゃなかったのかなぁ。

たとえば

public void sort(Comparator c, Object o1, Object o2); 

というメソッドシグネチャから、cがComparatorだということはわかる。

だけど、それだけじゃない。多分、o1とo2を比較するのかな? とは想像がつくように思わなくもないけど、実は、((String)o1).length()と((String)o2).length()を比較するのかも知れない。ドキュメント(ソースでも良いけど)読んだら、なんとまずo1とo2の大小関係を別口で比較したのちに、小さいほうを:の左に配置した上でlengthじゃないけどo1/o2が持つメソッドの呼び出し結果を引数にしてcの比較メソッドを呼び出すのかも知れない。

とどのつまり、cの比較メソッドを呼ぶということがわかっても、それだけのことだ。このメソッドはどういうコンテキストで呼び出すのか、その引数はどういう機能を求められるのか、つまりは不変条件、事前条件、事後条件がわからなければ、そんなメソッドは呼んではいけない。

型があってればOKなんて、そんなことはどうでも良いのだ。

#これは、インターフェイス重要なパラメータの話であって(でもそういう例だったよ)、スカラーはまた話が異なるので、もっと複雑な話の一部に過ぎない。

つまるところ、不快感を覚えたのは、そういうIDEがどうした(良くできたIDEは作業効率をあげるから僕はVS.NETは好きだけど。いらいらするくらい遅い時があるからEclipseとかは嫌いだけど)とか言い出すのは、実際にプログラムを作ったことがない、能書きだけの口先野郎の得意技だと相場が決まっているからだ。好き嫌い論議は別として、xx(型あり、なし、コンパイル/インタープリタ、ネイティブ/VM)言語だからOK、とか言い出すやつほど、プログラムを書いた量やシステムを触った経験はゼロの単なるビジネスマンが多い。良き反例はあるかな? ポールがいたか。でもちょっとレイヤーが違うように思うけど。まあ、好き嫌いで話すのはとても楽しいし。でも、それを、好き嫌いのレイヤーでもなければポールのようなレイヤーでもなく、単に「何が呼ばれるかわからないから問題だ」程度の話をIDEのエバンジェリストが言い出すならともかく(それが彼のビジネスだ)、でもbabieさんが問題だとか言ってみるのは、なんのことだかとってもはてなくん。

型チェックの効用としてくだらないミスを防げるから、まあ無いより合っても良いとは思わないでもない。否定の連続。

でも、そんなことはこれっぽっちも本質ではない。むしろ、ほとんどのバグは、「正しく使っていない」=「なんにもコンテキストをわかってない」=「無知」=「無能」に起因してるじゃん。まあ、勘違いは良くあるけどな、はっはっは(と我が身を振り返る)。

#もしも、これが本当に重要で、本当に問題だとしたら、Eclipse使ってJavaで開発したシステムは、それはそれは無問題だろう。でも現実をちょっとでも見れば、それは大して役に立ってないことが良くわかる。むしろ、丁寧な仕事を妨げているとさえ言えるのではないか。おま、API呼ぶ前にまず、ドキュメント見ろ、と言いたくなることもあるね。インテリセンスとかでさっと候補が出て来ちゃうので調べもせずに突っ込んだだけなんじゃないかと小一時間、とか。

はーぷいぷい。

_ 結論

銀の弾丸は未だにない。

でもそれではくだらない。

とりあえず、ドキュメンテーションとテスト。

夢がない?

だったらそれがビジネスチャンスだ。少なくてもIDEじゃないだろう(さくさく動くのなら歓迎だけど)。

_ 動と静

で、普遍的な話はともかく、動的言語対静的言語とやった場合に、それが本当に問題かどうか、というところに戻ると、これはそれがどうでも良い問題だということがすべてで、まったくどうでも良い。

そんなものは動的言語が静的言語に負けてる点でもなんでもない。そりゃ、どうしようもない人が、

def add(a, b)
  a + b
end

に対して

add(nil, false)
と呼べば期待通りに実行時にエラーになるけど、それをもってほら見ろ、これだから動的言語は静的言語と違って問題だ、せめてIDEがあれば救えるのにと言うのってばかげてるな。

というのは、こんなのは思考実験でしかありえないエラーだからだ。だから、実際にプログラムを書かない人のエバンジェリズムと思えるのだ。「自動車は徒歩にくらべて問題がある」「たとえば?」「ガス欠したら困るでしょ」「うむ、それは1番の問題だ」そりゃ、ゼロとは言わないけど、それは問題じゃないだろ。でもわかりやすいし、実際に車を運転したことがない人間同士には「なるほど、確かに問題ですなぁ。やっぱり徒歩にしておきますか」とウケるかも。そういう話題に過ぎないよ。

逆を考えてみると、VS.NETの支援機能のおかげでうろ覚えの綴りミスがすくわれるとか、死ぬほど長いメソッド名を全部打たなくても済んで楽(でも↓を同じ量だけ叩いていたり)というのはあるかも知れないけど、型エラーが見つかってよかったね、なんてのは無い。経験ありますか?

エディット−実行のターンアラウンドタイムの速さというのもあるよ。テストをちゃんとすれば。ビルド過程をすっとばせるから、コンパイル時の型エラー発見でなくて実行時の型エラー発見でも、別に効率が落ちるとも言えない。(追記:エラーメッセージが当を得てなくて途方に暮れることは時々あるけど、それはメッセージの質とかどうエラーを検出するかの問題であって、やはり型チェックが事前云々とは違う。型に関してそういうメッセージがあったかどうかはちょっと微妙。"忘れとかかな)

本当の問題は、それが遅かったからでもない。もしそうなら、VB2〜4が席巻した過去はありえない。でもVC++よりも一般的に利用されていた。それはIDEのおかげだろうか? うむ、少しはあるかも。では、なぜDelphiよりもVBだったのか? いや、わたしはDelphiでしたという人もいるだろうけどシェアが違うよ。ここで問題って言ってるのはそういう話に過ぎないんじゃないか?

本当の答えってのは、つまり問題ってのは、そこにあるんだと思う。遅いからでも、型チェックが事前にされないからでも、ない。それに静的言語との比較ってのが、必ずのようにJavaやC++になるってのが、そういった問題に過ぎないってのを如実に語っているように見える。

_ 変な名前つけるな

そりゃそうだ。そこで、IDEに求められる機能は、入力したトークンがその言語の予約語じゃない場合には、辞書に存在するかどうかをチェックする機能だとういことになる。ではどうか?

もちろん、予約語チェックの必要もあるから、どの言語かの選択は最初に行われる。で、C#で書いているときに、public void fooとか書くと、ドガーンと音がして画面がぴかぴかぴかぴかフラッシュして、赤いでっかな波線がついて、Fooと直すまで先に進まないというか、かってに直しても良いような。

同じくJavaで、public void Fooと書くと、ドガーンピカピカピカピカゴロゴロチューン! でpublic void fooに直る。でも、fooは辞書にないからやっぱり先に進めない。

enum Color { を見た瞬間、BRUEでドガーンピカゴロピカゴロ。GLEENでドガーン。

そういうIDEを与えたいものだ。

ちなみに辞書は、デフォルトで3種類あって、単語が100個しか収録されていない大手SI屋が下請けに渡すやつ(※)と、100000個登録されている自社開発用と、0個(でなんでも入れ放題)の2.0屋さん用に分かれていて、なぜか別売りで買うと0個のやつが1番高価で、その理由はむにゃむにゃ(※※)。その他、専門用語アドオン辞書とかもあるでよ。

※いまいちつまらないから、こうしよう。最初は1000語登録されている。で、下請けが受領する。下請けが孫受けに渡すときには単語は100語に減っている。そして、孫受けがひ孫受けに渡すときには単語は10語に減っている。これでは、どうがんばってもまともなプログラムができるわけがない。しかし、それが(後は想像の世界に任せる)。

※※やっと理由が氷解した。動作がすごく速いから価格が高いってことだ。思考の流れをさまたげない鬼速辞書。思ったとおりにプログラミングできるぜだんな。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|

ジェズイットを見習え