「細切れにしてeval」じゃないよ

This entry was posted by on Monday, 16 April, 2007

http://b.hatena.ne.jp/entry/http://www.jmuk.org/diary/2007/04/15/2 うーん、この日記よりほかにブックマークするところがあると思うんだけど、まあそれはいいや。

でね、反応を見ていると「細切れにしてevalする」という不思議な表現が流布しているようなのだが、それは誤解です。ぜんぜん違う。 JavaScript の関数は toString メソッドで文字列化できる(組み込みのものはのぞく)のはそうで、それを使っているらしいのだけれど、実際にはそうして得られた文字列をパースし、コンパイルして、その結果の関数を呼ぶようにしている。

何が違うかって?

だいたい文字列ベースで分断して eval するくらいでそんなことができたら苦労はないわけ。たとえば try … catch したり break したりといったことを考えると(現在は未対応らしいんだが)、そんなことではとうてい対処できないでしょ。そういった難しいことをきちんと考えていくとけっきょく、プログラムを解析し、どう書き換えるかといった方針を立てなきゃいけないってことがわかるはずだ(だいいち毎回evalなんかしてられないでしょう、常識的に考えて)。

だから、いってみればアレは「JavaScript で JavaScript のコンパイラを書きました」っていう話として理解した方がいい。で、ふつうのコンパイラというのは高級言語からVMなり機械語なりに変換するのだが、そうではなく JavaScript から JavaScript へのコンパイラとなっている(ので、こういうのをふつうはコード変換とかいいます)。コンパイル(コード変換)するときに、ふつうのプログラムを食わせると CPS な関数が返されると考えるといい(CPSが何か、くらいはまさか知らないということはないよね?)。

ちなみにコンパイル部分のコードは Rhino をベースにしたらしいですよ。

ふだんはねえ、はてなブックマークにはいちいち反応しないんですけど、わたしの書き方が曖昧なせいでこの誤解が広まるのは嬉しくないので。確かにわたしの書き方も親切さが足りないのだけれど……。

ああひょっとすると「細切れにして eval」という表現が↑を意味してたのかもしれないが、そうならわたしの理解が足りていなかったってことでごめんね。でもそれはいっそう誤解を生む表現だと思うな。

Comments are closed.