Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
Matzにっき(2004-10-02)
[go: Go Back, main page]

«前の日記(2004-10-01) 最新 次の日記(2004-10-03)» 編集

Matzにっき

<< 2004/10/ 1 1. ChangeLog
2. 長女の帰還
3. Ruby Conference 2004
4. U-20プログラミングコンテスト表彰式
2 1. 文法のデザイン
2. 初心者パラドックス
3. DSL(domain specific language)と組み込み言語
3 1. 松江、そして岡山
4 1. AC
2. (行ってないのに)RubyConf 2004レポート
5 1. コダック、Java特許訴訟で勝訴--判決に批判の声が噴出
2. tDiary 2.0
6 1. Rubyの教科書
2. コーディングスタンダード
7 1. Skype
2. 携帯電話の2画面特許,NECとドコモ側が東京地裁で勝訴
8 1. [特許]KodakとSun、オブジェクト特許で和解
2. テレビ番組の録画サービス、東京地裁が差し止め命令
3. rubyist.netドメイン
4. Amazonアソシエイト支払い履歴の罠
9 1. 総大会ビデオ
2. キリスト教信仰
10 1. 総大会ビデオ(その2)
11 1. 市立図書館
2. ブラックジャック
3. 来客・家庭の夕べ
4. Skypeコール
12 1. 『ソフトウェアの匠』
2. 島根県が“地元発オープンソース言語”Rubyの講習会,地域のIT人材育成を目指す
3. 知財プロ
4. 『リーグ・オブ・レジェンド 』
13 1. 知財あれこれ
14 1. DRMとDMCRA
2. 突然の仕事
15 1. 忙しい
2. DRMのあるべき姿
16 1. 洗濯機
2. Skypeコンファレンスコール
3. 『Beyond C++』
17 1. 好きな言葉
2. 岡山
18 1. 東京出張
19 1. 地方でのRuby意識
20 1. JASRAC、CCCD廃止の流れに疑問を提示〜船村徹会長ら新役員が会見
2. 台風28号
21 1. コンテンツ業界の硬直化が生む最悪のシナリオ
2. クマデス
22 1. 「Curl」言語普及促進へ新会社
2. 松本零士氏の珍妙なる主張
3. 関西オープンソース 2004
23 1. 関西オープンソース2004に参加
2. recommuni
24 1. 松江
25 1. LogoはLispじゃない(当たり前)
2. Ruby講習会初級コース前半1日目
3. 「300年ぶりの著作権のパラダイム・シフトが起きている」−経済産業省 村上敬亮氏
4. 検索メールリーダー
26 1. Ruby講習会初級コース前半2日目
2. Logoの式
3. 好かれる言語、広まる言語
27 1. 『プログラミングのための線形代数
28 1. 出産と満月
2. 誕生
29 1. 特許は地雷か
2. 名前重要
30 1. 親子活動
2. ハロウィーンパーティ
31 1. 松江
2. 新潟中越地震について
>>
迷惑メール対策なら Dr.WEB
『Dr.WEB メールデーモン』、MTA 用迷惑メール対策製品です!


2004-10-02 [長年日記]

_ [言語]文法のデザイン

先日の言語ツールキットに関連して、 (Gaucheの)shiroさん*1から コメントをいただいた。貴重な意見だと感じるので、ここに全文再掲。

文法のデザインは、ハフマン符号化のようなものかもしれません。基本は「良く使うものを書きやすく」ですが、それをすると、その影で書きにくくなる部分があります。例:演算子など、lexerにとって特殊な意味をもつ文字を増やす→識別子にその文字が使えなくなる。中置記法を使う→その演算子が2項演算に限定される(haskell方式を使わない限り)。そもそも、「良く使う」ものが特別扱いされているということを覚えておかねばならない、等。最後のものは、言語設計者の考える使用法と、言語ユーザの考える使用法がずれている場合に、ユーザの負担になります。

使う人のバックグラウンドや対象となる問題領域にかかわらない、グローバルに最適な「良く使うもの」を決められるとするか否かで、立場が分かれると思います。

そのようなグローバルな最適点は無くて、最適な解は個々の問題を解くプログラマのみが知っている、とする立場に立つと、「良く使うもの」を言語設計者が決め過ぎるのはpremature optimizationになります。この立場では、なるべく文法規則を単純で一様なものにしておき、必要ならプログラマが問題に合わせてカスタマイズする、という方向になります。これがLispやTclの立場だと思います。

一方、問題の対象が限定されればされるほど「良く使う」操作に関して予測が立てやすくなるので、最適化が成功しやすくなるでしょう。シェーダー言語に、汎用的配列とは別に2〜4要素のベクタと配列を扱う文法レベルでのサポートがあるのは大いに意味があります。

問題の対象を一切限定しないで、グローバルに最適な文法をデザインできるか、はかなり未知なる領域だと思います。

これくらい切れ味の良い文章が書きたいものだ。私の文章と言ったら...。

まあ、それは置いといて、このコメントを切り口として文法のデザインについて考えてみたい。

shiroさんは「問題の対象を一切限定しないで、グローバルに最適な文法をデザインできるか、はかなり未知なる領域」とあいまいに表現してらっしゃるが、私はすべてをカバーするのことは、はっきり無理だと思う。 だから「premature optimizationを避けるため単純で一様なものを選択する」のが「LispやTclの立場」だというのは、 十分理解できる戦略である。

しかし、TclやLispは「単純で一様」ではあるが、 多くの人にとって、とっつきにくいのも事実である。 また、あらゆる局面に対応するためにあらゆるカスタマイズが可能なのは良いとしても、 あまりに柔軟に変化しうるので、結局提供される共通項は大枠(メタ文法)だけということになりかねない。 となると、「単純で一様」なものですべてをカバーしようと思うと、 無理が出るような気がする。

ふむ。最適な文法をデザインしようとすれば「バックグラウンドや対象となる問題領域」によっては、 premature optimizationになる。 しかし、それを避けて「単純で一様なものを選択する」ことは(それを好む人がいる一方で)、 とっつきにくさを生んでしまうし、柔軟性によってかえって消費脳力が増えてしまう(かもしれない、私の仮説)。

鍵は「あらゆる領域をカバーすることはない」ということだろうか。 すべてに最適な文法が存在できなくても、たとえば仮に、 80%で有効で、 残りのうち10%が可能である(残り10%はすっぱりあきらめる)、 という文法が存在できるとすれば、 その文法には十分価値があるのではないだろうか。

(比較的オーソドックスな)プログラマビリティを提供する文法を仮定すると、 この「80%に有効な文法」というのはけっこう可能なところではないだろうか。

さて、仮に言語ツールキットを本当に作るとして*2、 成功するために必要そうな条件について、後日考察してみることにしよう。

*1  私が「Rubyのまつもと」と呼ばれるように。ただ、私自身はいまだに違和感がある

*2  私には自分で言語ツールキットを作る余力はなさそうだ

_ 初心者パラドックス

初心者に優しくないと評判のまつもとです(苦笑)。

高橋さん曰く:

この辺のまつもとさんの発言はパラドキシカルなもので、「そういう発言をすると良心的な初心者は(良心的なので)結局萎縮する一方、良心的でない初心者は(良心的じゃないので)そんな発言は気にしないか、逆切れする」ということで、実はあんまり益のない発言だと思うのですがどうでしょう>まつもとさん

確かにそうかも。いや、その辺はあえて無視して、 良心的な初心者にはたたみかけるように「萎縮するな」と(ある意味無茶を)呼びかけ、 そうでない初心者は相手にしないってのが私の立ち位置かもしれません。

実は、若干エゴイスト入ってる私には、 「困った初心者」に悩まされないことの方が、 初心者を助けることよりも重要だったりするかもしれません。

ところで、初心者に優しいが、そればっかりやってRubyの開発が全然進まないまつもとと、 初心者の扱いは他人に任せるがRubyの開発はばっちりのまつもととどっちがお好みでしょう? みなさん。

期待はともかく、なんとなく正体は「初心者にも優しくなく、開発も進まないまつもと」のような気がしないでもないんですが。

いずれにしても、高橋さんの

私見では、MLには「give and take」などは存在しません。あるのは「質問・ネタフリという貢献」と「回答・応答という貢献」だけ、つまりgiveしかないのです。

という言葉には賛成です。

_ DSL(domain specific language)と組み込み言語

shelarcyさんのツッコミに、 ぜんぜん分からないなどと返事してしまったが、 ちょっと考えたら、一部は理解できてきた。これくらいすぐ理解しろよって感じだが。

要するに

  • ベース言語に十分な機能を提供して、DSLとして用意すれば、 個別のツールに言語を組み込む必要はない(言語が主、ツール(機能)が従)
  • ツールに言語を組み込むなんて..ナンセンス

ということが要点のようだ。

ここは反論として、なぜツールに言語を組み込むことがナンセンスでないか、を示すべきだろう。 ただし、「DSLはナンセンス」という主張はしない。 っていうか、ユーザと開発者がそれを望むならDSLはナンセンスどころか優れたアプローチだと思うし。 ただ、組み込み言語がナンセンスであるほど万能のソリューションではない、と言うだけ。

考えるに、言語(DSL)が主ではいけない技術的な理由はない。 プログラマブルなツールと、そのツールが持つすべての機能を利用できるDSLとでは、 技術的には差は全くないだろう。 にもかかわらず、いまだに私は「成功するためには言語主・ツール従ではなく、ツール主・言語従」であるべきだと考えている。

なぜか。

最大の理由は「ユーザと開発者の心理」である。

DSLをポンと渡されて自由に使いこなせるユーザは少ない(と思う)。 まずは提供されるツールを使い、 それを拡張したいと考えた時にはじめてプログラム機能を使いツールを強化していく、 というのが一般的なユーザエクペリエンスではないだろうか。 となると必然ツール主体が望ましいということにはならないだろうか。

開発者もDSLを作りたいと言う人は少数派だ(と思う)。 たくさんいる「ツールを作りたい開発者」が自分のツールにプログラム機能が欲しくなった時の答えとして 「じゃあ、あなたのツールを機能ごとにばらばらにして、この言語から使えるようにすれば立派なDSLになりますよ」というのは、あんまり喜ばれないんじゃないだろうか。 むしろ「この言語ツールキットをリンクして機能を登録してやれば、 あなたのツールがプログラマブルに」と言ってあげた方が、 (たとえ実際の作業の本質がほとんど大差なくても)心地よく聞こえるのではないだろうか。

成功するためには、心理的な側面も重要だ*1


ところで、shelarcyさんの意見だが実はまだ理解できないところがある。

  • 結局「「LispやTclの立場」ではあってもそれを Ruby のような言語 が利用する」とはどういう意味か。
  • 「ある言語でうまくできることを それならばこの言語でもできないだろうかという風に考えるのは..良いものだと思うのだが」 というコメントにあった、 「ある言語でうまくできること」のに「私が考えなかったこと」は何か。

*1  ここで「だから、Lispや関数型言語は広まらないんだ」なんて暴言は思っても吐いてはいけない。そんなこと言ってませんからねー。言ってないってば

本日のツッコミ(全10件) [ツッコミを入れる]
_ shelarcy (2004-10-02 21:42)

いや、「LispやTclの立場」ではあってもそれを Ruby のような言語が利用してもいいんですよ。Haskell はそれ相応の大きさの文法をもった言語ですが、Lisp のような手法が当然のように使われています。
まつもとさんは文法が変わってしまうのは好きじゃないようですけど。

http://page.freett.com/shelarcy/diary_2004-09.html#dsl_combinator

_ まつもと (2004-10-02 22:14)

関数型言語の素養がないせいか、

  * 「「LispやTclの立場」ではあってもそれを Ruby のような言語
    が利用する」とか

  * 「Ruby とかにライブラリを用意してやってその上に DSL を構
    築」とか

  * 「下のレベルのライブラリをうまく確保しさえすれば、後は
    combinator を書いていくことで DSL は簡単に記述できる」とか

要するに重要な点がまったく理解できませんでした。頭悪いな>自分。

あと、「Ruby 論者はマクロ不要論を唱える」というのは事実に反
します。むしろ強硬に不要論を唱えているのは私だけじゃないかと。
数年前のRuby Conference(確か2001 Florida)では、マクロ欲しい
派と議論を戦わせたことが思い出されます。

_ shelarcy (2004-10-03 00:07)

マクロ不要論は事実誤認でしたか。

「LispやTclの立場」ではあってもそれを Ruby のような言語 が利用するというのは、言語内 DSL を利用しようよというぐらいのことでしかありません。言語内 DSL を利用することで言語の備えている一般的世界から専用の世界に行けばいいんじゃないかということで。

DSL の構築し方については、どう説明していけばいいかな……Haskell 入門者のための本である "The Haskell School of Expression" の時点で、まず C の API とのインターフェースが用意されていて、それを外部ライブラリを使っていることを悟らせないように DSL で包んでやる方法が言及されているので。
http://page.freett.com/shelarcy/diary_2004-03.
html#haskell_soe

今回の言及の元になったこの辺の記事から想像できますでしょうか?

http://d.hatena.ne.jp/tanakh/20040928#p2

Lisp だと "On Lisp" で目の前の問題を解決するべく抽象化関数を書いていくうちに DSL ができあがるという形でした。

_ shelarcy (2004-10-03 22:08)

「ある言語で……うんぬん」という場所は言語設計者ではなく言語使用者に対して呼びかけています。

C++ の template を metaprogramming に使用することで、言語設計の側も return type における型推論の導入を考え始めているように、言語使用者が設計者の考えなかった思わぬ使用法をすることで初めてそういうフィードバックが可能になります。あえて言うなら、これの大切さを呼びかけているというところですね。

_ MoonWolf (2004-10-05 17:58)

この日記もRSS提供してください〜。
makerss.rb入れるだけですから。

_ かずひこ (2004-10-05 21:43)

makerss.rb をインストールしたのでツッコミのテストさせてください。

_ かずひこ (2004-10-05 21:45)

エラーが出たのでもう一度ツッコミのテストさせてください。m(_ _)m

_ かずひこ (2004-10-05 21:49)

すみません、今度こそうまくいくはず...なのでツッコミのテストさせてください。m(_ _)m

_ たかはし (2004-10-06 02:23)

もちろん「初心者に優しくて、Rubyの開発もばっちりのまつもとさん」がお好みです :D
という好みはさておき、初心者の扱いは他人任せでぜんぜん構わないと思いますよ。

_ foolist (2004-10-07 04:41)

 子は経験の生まれかわり。なにもしらなくても、そのやり方が、
受けつがれてる。だからわたしたちはいつも新鮮生気。プログラムは生まれかわる。人、生物のように。
親が0+1=1 1+1=2 2+1=3 … 9+1=10 … としてきた。
子はx+yが分かるかも?
 

お名前:
E-mail:
コメント:
本日のリンク元
検索

«前の日記(2004-10-01) 最新 次の日記(2004-10-03)» 編集

RSS feed meter for http://www.rubyist.net/~matz/ Creative Commons License This work is licensed under a Creative Commons License.