*[hatefu:labs.yaneu.com/20090401/] JavaScriptによる日本語BASICの実装
「いまどきエープリルフールなんて誰もやらないだろう」と思っていたのだが、日付が変わった途端、他のサイトはなんだかお祭り状態である。
これは私も参加せねば!と思い、今回はJavaScriptで日本語BASICを実装してみることにした。
日本語BASICと言えば、言わずと知れた「ぴゅう太」である。
「ぴゅう太」の日本語BASICをエミュレーションするコードをJavaScriptで書いてみる。
えっ?「ぴゅう太」を知らない?そ、、そうですか…。(汗)
* JavaScriptのソースコード
前回と同じく、面倒なのでhtmlのpreタグで囲まれたところからコードを拾ってくることにする。
そのあと、インタプリタ的にそれを1行ずつ実行する。
>>
var e = document.getElementById('code');
// preタグのなかで'>','<'が変換されてしまっている可能性があるので戻す。
var script = e.innerHTML.replace(/>/g,'>').replace(/</g,'<').split('\n');
var pc = 0; // program counter
var for_stack = []; // 'マワレ'用のstack
while(pc < script.length)
{
var line = script[pc++];
if (line.match(/シキ (\w+ = .*)/))
eval("var " + RegExp.$1);
else if (line.match(/カケ (\w+)/))
alert(eval(RegExp.$1));
else if (line.match(/マワレ (\w+) = (.*) カラ (.*)/)) {
eval("var " + RegExp.$1 + '=' + RegExp.$2);
for_stack.push({ reg_name : RegExp.$1 , upto : RegExp.$3 , loop_start : pc });
} else if (line.match(/トジル.*/)) {
var loop = for_stack[for_stack.length-1];
if (eval('++' + loop.reg_name + ' <= ' + loop.upto)) {
pc = loop.loop_start;
} else {
for_stack.pop();
}
}
}
<<
※ エープリルフール企画ではあるけど、このソースで本当に動きます。
このソースコードは自由に改造して使っていただきたい。ご覧のようにソースコードは極めて短い。
JavaScriptには、もっと実用的なインタプリタ型の言語がお手軽に実装できるだけのポテンシャルがあることが見てとれるだろう。
* サンプルプログラム
>>
シキ S = 0
マワレ I = 1 カラ 10
シキ S = S + I
トジル
カケ S
<<
1から10までを足しあわせた55が表示される。
http://labs.yaneu.com/20090401/sample1.html
>>
シキ S = 0
マワレ I = 1 カラ 10
マワレ J = 1 カラ 10
シキ S = S + I*J
トジル
トジル
カケ S
<<
2重ループも正しく動く。3025が表示される。
http://labs.yaneu.com/20090401/sample2.html
* まとめ
今回のJavaScriptでぴゅう太のエミュレーションを行なうというのはネタに過ぎないが、
・JavaScriptである種のsandbox環境を作る
・ターゲットコードを1行ずつ実行できるのだからJavaScript1.7で導入されるyieldを待たずともconcurrentな実行を行なうことができる
などの応用が考えられる。
** 関連記事
JavaScriptへのマルチスレッド・プログラミングの導入
http://www.infoq.com/jp/articles/js_multithread
JavaScriptによるマルチスレッドの実現‐Concurrent.Threadの裏側
http://www.infoq.com/jp/articles/js_multithread_2
* 更新履歴
2009.04.01 公開