OreScript時代の幕開け
先日、MozillaでECMAScript(JavaScript)の仕様を作っているJohn Resigさんが来日しました。
その際、1時間ほどのQ&Aの司会と、ライトニングトークでの発表を私させていたただきました。
その際、基調講演をしてくださった、etoさん(http://eto.com/d/PresenForJohnResig.html)のコメント。
こないだのJohn Resigによる講演の後に一緒に飲んだんですけど, その席で聞いた話がすんごく面白かったな. いろいろ面白かったんだけど,特にjquery2が面白かった. http://ejohn.org/apps/jquery2/ このURLなんですけど,コードはこんな感じ. <script src="http://jquery.com/src/latest/"></script> <script src="parse.js"></script> <script type="text/jquery"> pre: css 'background' '#212121' css 'color' '#0F0' css 'padding' '10px' css 'font-size' '14px' body: prepend '<h1>jquery<sup>2</sup></h1>' input:first: click compile input:last: click run </script> つまり,<script type="text/jquery"></script> というスクリプトタグを勝手に導入し, この中に書いた文をパースしてJavaScriptに翻訳して実行する. ここではYAMLっぽい文法で jQueryに相当するコードを記述できるようにしている. ここで面白いのは,同様の仕組みを使えば 任意のスクリプト言語をJavaScript内で勝手に作れちゃうってこと. この発想は新しいわ.
<script type="text/jquery"> は本当に衝撃でした!!
ECMAScript4に対して、「Webの世界には新しい言語が必要である!」と言う人もいますが、そうではない、
オレオレ言語を作れと!!(笑)
ECMAScriptは使うための言語じゃないんです。プログラミング言語を作るための言語なんです。Standard ML と同じ文脈で語られるべきなんです。(本当か?)
もはや、ECMAScript 4、HTML 5 は時代遅れですよ!
の時代ですね。
例えば、IECanvas は<canvas>タグをIEの中に作り出しています。
というわけで作ってみました。
http://accelart.jp/shibuyajs/logo/logo.html
LOGOを実装してみました。内容はソースを見てください。
とりあえず、手っ取り早く作りたかったので、パーサーは極限まで汚いです。ごめんなさい。
今回、LOGO、ちまたで転がっている情報から、適当に文法を仕立て上げて、BNF見ずに、実装してみたんですが、関数呼び出しが不思議です。
JavaScript風に書くと、
function f(result) { g(1, 2); print(result); } function g(a, b) { result = a + b }
こういう関数の使い方ができます。gのなかで、fのスコープのresultが使えます。関数を呼び出しても、変数は引き続き使えるそうです。
関数呼び出しが、末端に来れば来るほど、変数がたくさん使える不思議な言語です。関数をいつでも抜き出せるのでリファクタリングがしやすいです。
その代わり、関数の戻り値がないみたいです。(確証とらずに実装してしまった…)
森の一部を描け :何回目 + 1 :長さ * 0.6 右へ 85
コードを一部抜き出したんですが、:で始まるのが変数名で、「森の一部を描け」が自分で定義した関数名ですが、他の言語のように、(,,,,) でパラメータを区切らないので、引数がずらずら並ぶ上に、引数の終わりがさっぱりわかりません。
僕は、「関数は呼び出す前に先に宣言しないといけない」というルールを作り、引数の数をあらかじめ知っておくことにより、引数の終わりを決めたんですが、さっき気づいたんですが、関数の返値がないので、「右へ」にきた時点で、そこで関数のパラメータが終わった、という処理にすべきなんですね。
本当に、不思議な言語です。こんなのが40年前にあったんですね。C言語より古いです。
いつもいつも思うんですが、処理系作って初めて、言語を理解できますよね。20年前にさわったときは、こんな仕様だとは夢にも思いませんでした。
今回、トップダウンパーサー(LL)を作るに当たって、手抜きをするため、 http://fxp.hp.infoseek.co.jp/arti/parser.html を参考にしました。「10分で書ける、お手軽パーザー」
JavaScriptの最初の作者である、Brendan Eichの書いた、Narcissus (JavaScript on JavaScript)もトップダウンパーサーなんですが、あれ、ソースが、美しすぎます!
- prototypeとコンストラクタ
- オブジェクトのメンバ変数に宣言なしに値をつっこむ手法
この2つのバランスが美しすぎます。
世の中のほとんどの人が、構造化言語かクラス型オブジェクト指向のようなプログラムをJavaScriptで書いてしまうこの世の中、Brendanくらいじゃないでしょうか、JavaScript使いこなせているの(笑)
初めて、コンパイラコンパイラなしで、コンパイラを作ったんですが、コンパイラコンパイラが JavaScript にも欲しいです…
ECMA VM
追記@18:50。
ECMAScript 4 は Mozilla と Microsoft がグダグダもめていて、仕様がまとまるのか不透明です。
しかし、OreScript, OreHTML を作ることを前提にすると、ブラウザは、プリミティブだけど高速に動作する仮想機械(VM)と<canvas>みたいなやつで、同じくプリミティブだけど高速に動作する描画領域があれば十分ではないでしょうか?
クラス型オブジェクト指向のVMは Java や .NET で使われていますが、技術としては枯れていますし、高速に動作することが実証されています。そして、Rhino(JavaScript on Java)は、JavaScript on C と同じ速度で動作することからわかるように、非クラス型オブジェクト指向言語をクラス型オブジェクト指向VMの上で動かすことには何ら問題ありません。
<bytecode type="binary/ecmavm" src="perl6.vm" /> <script type="text/perl6"> print "Hello World !" </script>
これが使えれば十分です!HTMLなど、レンダリングエンジンに関してもしかり。
クラス型オブジェクト指向のVMは誰が作っても大差ないです。Java VM と .NET VM はほとんど同じ。なので、仕様策定はすぐに終わり、もめることはないでしょう。
(ECMA-335 とは別にね。もはや、政治的な理由しかないですが…)
トリビア
Java VM と .NET VM の違いで僕が唯一知っているのはメソッド呼び出しの差だけです。
以下の3種類のメソッドは、Java VM と .NET VM 両方にあります。
- invokevirtual - インスタンスメソッド呼び出し
- invokestatic - クラスメソッド呼び出し
- invokespecial - private や super など、どのクラスにメソッドの実装が存在するか、親クラスをたどって行かなくてもすぐにわかるメソッド
- invokeinterface - インターフェイスメソッド呼び出し(本来は invokevirtual の一部)
があります。JITがのる前の時代は、これを使って、高速化をかけていたみたいんですが、今や不要みたいです。というわけで、.NET にはないはずです。