PHP5でJavascriptを動かす J4P5

これはすごい
http://j4p5.sourceforge.net/
JavascriptをPHP5上で走らせる、というPHPスクリプトである。スクリプト言語スクリプト言語を実装する意味はよくわからないかもしれないが…きちんと、クロージャやプロトタイプも使える。
実装を見てみると、なんとパーサがJavascriptPHPに変換し、それをファイルに書き出して、includeで実行している…。PHPってすげー。*1
ちなみにクロージャーを使ったjavascriptのサンプル

n = (function(x){
return function(y){
  return x+y;
};
})(12);
print( n(1) ); // 13 が出力される

だと、

<?php
/* Code generated by J4P5, the javascript interpreter for PHP5
 * http://j4p5.sf.net/ copyright(c) 2005 Henri T. <metal_hurlant@users.sourceforge.net>
 */

js::init();
/* function declarations */
function jsrt_uf1() {
return jsrt::expr_plus(jsrt::idv('x'),jsrt::idv('y'));
}
function jsrt_uf2() {
/* function mapping */
jsrt::define_function('jsrt_uf1','',array('y'));
return jsrt::function_id('jsrt_uf1');
}
/* function mapping */
jsrt::define_function('jsrt_uf2','',array('x'));
jsrt::expr_assign(jsrt::id('n'),jsrt::call(jsrt::function_id('jsrt_uf2'), array(js_int(12))));
jsrt::call(jsrt::id('print'), array(jsrt::call(jsrt::id('n'), array(js_int(1)))));
?>

こんなかんじのPHPになる。


PHPJavascriptで値をやりとりするのも、それほど難しくなさそうだ。


たとえばJavascript中からPHPの関数を呼び出したい場合、

include "js/js.php";
js::init();
function phphoge($a,$b){
  $a = $a->toNumber()->value; // $a を数値にした値
  $b = $b->toNumber()->value; // $b を数値にした値
  $ret = $a + $b; // 処理(ここでは足すだけ)
  return js_int($ret); // javascript値にして返す
}
jsrt::define_function("phphoge", "phphoge",array("a",'b'));

js::run("print(phphoge(1,2));");

上のサンプルでは、3が出力される。
同じようにオブジェクトや、そのプロトタイプもスクリプト実行前に設定しておくことが可能なので、様々な場面で使えるだろう。jstr.phpの内容を見れば、実装の方法はわかると思う。


Javascript中で使った値を取り出したい場合は、

js::run("x=10;");//たとえばこんなの

$x = jsrt::idv('x')->toNumber()->value;

という感じでよい。こちらはコンパイルされるPHPを見るとわかると思う。コンパイルされたPHPは /tmp/es4php に、「javascriptコードのMD5ダイジェスト値をファイル名」として置かれているが、内容を見たい場合は

require_once("js/jsc.php");
echo nl2br(htmlspecialchars(jsc::compile($code)));

こんな感じのスクリプトを走らせた方がわかりやすいかもしれない。


S式の走るWikiなどがあるが、これを使えば「サーバサイドで」Javascriptの走るWikiができそう。サーバサイドで走るので、タグを出力できないように(安全なタグしか出力できないように)等の実装もできる。


また、近頃流行のAjaxでは、 Validator などでクライアントサイドとサーバサイドの両方の言語で実装する必要がしばしば出てくるが、これを使えば Javascriptの実装だけですますことも可能であろう。*2


うーん夢がひろがりんぐ*3

*1:でも現在の実装だと、一度のPHPjavascriptを2度実行することは考えられていない感じだな…

*2:とはいえ、正規表現オブジェクトの実装がまだ未完成なので、現状ではValidatorには難しい面もある。

*3:とはいえ、クロージャーや変数のスコープがなにかおかしく、IE等とは違った動きをする…というかおかしい…