Hatena::ブログ(Diary)

yukobaのブログ このページをアンテナに追加 RSSフィード Twitter

2007年11月08日 OreScript時代の幕開け

[] OreScript時代の幕開け

先日、MozillaECMAScript(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)もトップダウンパーサーなんですが、あれ、ソースが、美しすぎます!

この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 VM を作ってくれ!!

(ECMA-335 とは別にね。もはや、政治的な理由しかないですが…)

トリビア

Java VM と .NET VM の違いで僕が唯一知っているのはメソッド呼び出しの差だけです。

以下の3種類のメソッドは、Java VM と .NET VM 両方にあります。

  • invokevirtual - インスタンスメソッド呼び出し
  • invokestatic - クラスメソッド呼び出し
  • invokespecial - private や super など、どのクラスにメソッドの実装が存在するか、親クラスをたどって行かなくてもすぐにわかるメソッド

Java VMはこれに加えて、

があります。JITがのる前の時代は、これを使って、高速化をかけていたみたいんですが、今や不要みたいです。というわけで、.NET にはないはずです。

mal_bluemal_blue 2007/11/08 20:39 > Brendanくらいじゃないでしょうか、JavaScript使いこなせているの
Chatzilla の内部コードも結構すごかったですね。美しいかどうかは別ですが。

> コンパイラコンパイラが JavaScript にも欲しいです…
http://nanto.asablo.jp/blog/2007/09/12/1793275

mal_bluemal_blue 2007/11/08 20:56 > ECMAScriptは使うための言語じゃないんです。プログラミング言語を作るための言語なんです。http://lambda-the-ultimate.org/node/2504#comment-37612
最終的にはそうしたいけど、読みにくくなるし今のところまだ早い、ってことみたいですね。Brendan によると。

> ECMA VM
次次期 ES/JS は Abstruct Syntax Tree は決めるとかゆーてますから方向性としてはありでしょ。何年先かが問題ですが。

> ECMAScript 4 は Mozilla と Microsoft がグダグダもめていて、仕様がまとまるのか不透明です。
一応、仕様の内部でもめてるんじゃないんでまとまることはまとまるでしょ。後は Reference Impl. にどれだけかかるかと、ECMA の承認のための作業にどれだけ時間食うかってだけです。
MS ともめてんのは実装すんのかどうかって話(MS はやりそうにないってこと)と後は政治的な問題です。

みずしまみずしま 2007/11/16 18:02 Logoの仕様は詳しいくないですが、

> こういう関数の使い方ができます。gのなかで、fのスコープの
> resultが使えます。関数を呼び出しても、変数は引き続き使える
> そうです。

こういう仕様のことを動的スコープといい、割と古典的な概念
です(Emacs Lispなどで採用されています)。

http://ja.wikipedia.org/wiki/%E5%8B%95%E7%9A%84%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97

最近の言語では動的スコープである言語はあまり無いと思いますが、
部分的に動的スコープ変数を作るための機能を提供している言語
もあります。

yukobayukoba 2007/11/16 18:18 久しぶりに見たら、コメントが一杯ついていました。

> mal_blue さん
> Chatzilla の内部コードも結構すごかったですね。美しいかどうかは別ですが。

へぇ〜 今度、見てみます

> http://lambda-the-ultimate.org/node/2504#comment-37612

いいリンク先ありがとうございます。
Brendan Eich さんも、なんか、僕と同じようなことを悩み考えている感じなのかな??
同じようなネタが、コメント欄にいっぱいかいてあってビックリしました。
(他人のブログを、全然、読んでない僕がいけないんですが)

> みずしまさん
> 動的スコープ

ありがとうございます。amachang にも同じ事、教えてもらいました。
僕が LISP 使えないのが、完全にバレバレですね。
LOGO は LISP から発展しているという話なので、動的スコープを引き継いだんですね。
40〜50年前のコンピュータ業界がどんな感じだったか、いまいちぴんとこないんですが、
21世紀の人間が見ると、なんか、新鮮です。