トップ «前の日記(2007-04-12) 最新 次の日記(2007-04-15)» 月表示 編集

日々の流転


2007-04-14 [長年日記]

λ. RHG読書会::東京 入門JavaScript 第四回

先月はなかったので二ヶ月ぶり。 RHG読書会みたいな楽しさは久しぶりで、なんだか元気をもらった気がする。

jsthread

牧さんのjsthreadの話が面白かった。jsthreadはプリエンプティブなスレッドを実装したJavaScriptライブラリ。

今回の話を聞くまでは「CPS変換して継続呼び出しをsetTimeoutを介するようにすれば良いだけじゃん」とか思っていたのだが、実際に話を聴いたら面白かった。

Function#toStringで取得した関数のソースコードをパースし Trampolined Style に変換する。そして、変換結果をその関数のプロパティに保存しておく。このライブラリは関数を呼ぶ際にこのプロパティが存在するかチェックし、存在しない場合には普通の関数呼び出しを行い、存在する場合にはそれをスケジューラに渡して呼び出す。 このようになっているために、変換されていないコードから変換済みの関数を呼び出す際にも問題が起こらないようになっている。 考えてみればJavaScriptらしい自然な設計ではあるが、細かいところまで良く出来ていると感じた。

本質的な問題は変換対象の関数が自由変数を含む場合。JavaScriptには環境を明示的に操作する機能はないと思うので、自由変数にアクセスできないはず。 ……と思ったが、Firefoxではevalの第二引数を使うことで以下のようにアクセスできた。IEやOperaではダメだったけど。

var f = (function(x){ return function(){ return x } })(10)
eval("x", f) //=> 10
eval("function(z){x=z}", f)(100)

ということは、Firefoxのことだけを考えるのなら jsthread-fv-firefox.diff のようにすれば良い。

それから、JavaScriptのパーサがソースコード中の大きな量を占めている。個人的に「JavaScriptでパーサはあまり書きたくないなぁ」と思っていたが…… なお、パーサはRhinoのコードを翻訳したそうで、拡張構文(?)もそのまま使えるそうだ。

あと、このような変換ではプログラムの意味が変わってしまうので、変換の正当性をどのように定義するかが難しいそうだ。

関連

λ. 日本Ruby会議2007のチケット

今日10:00に発売で13:30頃に売り切れだったとか。 買えなかった……しょぼーん。

というか、そもそも今日発売だったこと自体を知らなかった。 最近アンテナが低すぎな私 orz

そういえば、プログラムをみて気付いたのだが、今回はむとうさんも発表するのだな。むとうさんはあまりこういうイベントには出てこない印象があったので楽しみ。

Tags: ruby
本日のツッコミ(全2件) [ツッコミを入れる]
ψ むとう (2007-04-15 20:17)

えー、正直、発表は初めて、というよりもこのようなイベントに参加する事自体が初めてです(苦笑)。<br>いきなりのデビューが発表者から、というのはかなり無謀な気がして、今更ながら多少後悔しております(汗)。

ψ さかい (2007-04-16 22:04)

いやいや、むとうさんなら大丈夫ですってば、多分(^^;