«前の日記(2007年01月11日) 最新 次の日記(2007年01月13日)» 編集

Matzにっき


2007年01月12日 [長年日記]

_ [Ruby] 丸山先生レクチャーシリーズ in 東京 2006-2007

半蔵門から大森へ移動。

レクチャーシリーズ、今回のテーマは「web2.0 -- 新しい技術と新しいビジネスモデル」 なんだそうだが、Rubyの話はアウェイな気がしないでもない。

丸山先生の話は盛り沢山であった。時間内に終わるかな、と心配したが、 案の定、スライドを消化しきれてなかった。 ま、しょうがない。Web2.0のアウトラインを理解するには良かったのではないかと。

次が私の話。「動的言語の世界」と題して、 Rubyのような言語がなぜ注目されているか、というような話。 最近の講演(日経BP次世代フォーラム、福岡)とややかぶる。

次がマイクロソフトの安藤さんによる「マイクロソフト技術で体現するWeb 2.0「Windows Live」〜ソフトウェア+サービスの目指すところ〜」。 要するにVistaのガジェットでなにができるか、どう作るかと言う話。 それほど目新しい話ではなかった。 注目すべき発言は「画期的なのはそのインストールベース(数)」というもの。 非常にマイクロソフト的であった(苦笑)。

次は首藤さんの「peer-to-peer の世界」。 ウタゴエCTOになってからははじめて会うのかな。 Wiiリモコンを使ってプレゼンしようとしていたようだが、 センサとの距離や蛍光燈の光などに負けて断念したようだ。

この話興味があったのだが、飛行機の時間の関係で途中で抜けないといけなかった。 最初の導入しか聞けなかったのが心残り。

コンポーネントスクエアのページから発表資料がダウンロードできる。

当日の感想リンク

_ [言語] 静的/動的言語

休憩時間に挨拶していただいた方と雑談していたのだが、 「動的言語の利点を持ちつつ、静的言語のように情報を与えてコンパイルすることで実行効率を実現できる言語(の組み合わせ)はありえないものか」というような質問を受ける。

プロトタイプは動的言語で作っておいて、 ライブラリやフレームワークとして切り出す時には、 コンパイルして効率の良いものにしたいという開発スタイルを考えておられるようだ。

RubyとかだとJavaに代表されるような静的言語とは プログラミングモデルからして違うから 単にちょいちょいと型情報を追加して、というわけには行きそうにもない。 最初から動的・静的のミックスを念頭に置いた言語が必要そうだ。

と、ここまで考えて気がついた。

それなんてLisp?

Lispなら基本は動的言語だし、柔軟さについては他の追随を許さない。 さらに型情報を負荷付加することもできるし、 多くの処理系ではコンパイラも用意されていて、 場合によっては通常のコンパイル型言語(Cとか)よりも速いことがある、そうだ。

ということで、 「Lispとかどうでしょうね」と答えたら、 その方は苦笑しておられた。

Lispの不人気は相当なものである

誤解(?)の根は深い。

_ [Ruby] 2006年「Ruby on Rails」が愛された理由

愛されてますねえ。NaClもちょっとだけ言及されてる。

_ [Ruby] local variables new scoping rule

Evan Phoenixがruby-talkでRubyConf 2003のスライドについて言及する。 すっかり忘れてたよ。

で、改めて考えてみると、これは悪くないアイディアかもしれない。 まあ、もともと自分のアイディアなんだけど。

まずは問題点から。

問題

現状のRubyでは、ブロックの中で初出のローカル変数の有効範囲は そのブロックの中に限定される。 これは無名関数のようにブロックが使われる時に その関数の中だけで有効なローカル変数が使えないと 非常に不自由だからだ。

しかし、一方、通常のループ的にブロックを使う場合、 値を持ち出すためにローカル変数に代入しても その変数が(そのままでは)ブロック外部には見えないため わざわざブロックの前まで戻ってあらかじめ代入しておく必要がある。

しかし、ブロック限定のローカル変数を使いたい局面は限定されており、 ハフマン圧縮的見地からは、より頻繁に使われる通常のローカル変数的使い方のために、 いちいちブロックの前に戻って宣言的代入が必須と言うのはめんどくさい。

解決法の提案

元々はローカル変数のスコープの昇格で解決することを考えていたのだけれど、 これは構文的に後ろに登場する情報が前の意味を変更するというのが 非常にRuby的でない(or 私の好みではない)気がしていて踏み切れなかった。 実装もそれなりに面倒なものしか思いつかなかったし。

しかし、Evanの指摘により、昇格法よりもさらに前に考えていた*1、 デフォルトはスコープローカル、明示的に指定した場合だけブロックローカル、 というものを採用する気になった。

具体的には

  • 通常の代入によって作られるローカル変数は(class,module,defが作る)スコープローカル変数
  • ブロックパラメータはブロックローカル
  • 以下のいずれか、または両方
    • ブロックパラメータの後ろに「;」を置き、そこに続けた変数はブロックローカル変数
    • 「:=」で代入した変数はブロックローカル変数

結局は3年前のエントリで 考察していた通りで、その時、あきらめた明示的なブロックローカル宣言を取り込んだものとなった。

英語圏の人のためには、このエントリをRCRにまとめた方がよいよなあ。 ちょっと面倒だなあ。

実装

一度心を決めたら話は難しくない。 丸山先生のお話を聞きながらハックしてたら30分でできてしまった。 変更はparse.yだけに限定されるので、きっとYARVでもそのまま動く、はず。

*1  より正確には、最初に昇格法を思いつき(1999年ごろ)、次にスコープローカル法に気持ちが動き(2003年)、さらにまた昇格法にしようかという気になり(2005年)、で、今回再びスコープローカル法にする気(2007年)になった、ということ。 とんでもない堂々巡りだなあ。


«前の日記(2007年01月11日) 最新 次の日記(2007年01月13日)» 編集