Making PL/0(その1)
この前の日記わーい \(^o^)/ PL/0を JS で書いたよー! - ockeghem(徳丸浩)の日記で、JavaScript記述のPL/0を紹介したが、その開発過程を少し紹介してみたいと思う。
私の開発スタイルはどういうネーミングをしたらよいのか分からないが、ここ20年くらい、以下のような泥縄的なプロセスでやっている。つまり必要なものから作っていくということだ。
開発の途中経過を残していなかったので、記憶や、ゴミ箱から回収したファイルを元に再現したものを示そう*1。
JavaScriptでPL/0を作ろうと思い立って、最初に作ったものはおおよそ以下のような字句読み取り器だった。
var keywords = {
"begin" : BEGIN,
"end" : END,
"program" : PROGRAM,
}
var src = '';
function getToken() {
src = src.replace(/^[ \t\r\n]+/, "");
var token = '';
if (src == '')
return null;
if (src.match(/^[a-z_][a-z0-9_]*/i)) {
src = src.replace(/^([a-z_][a-z0-9_]*)/i, "");
token = RegExp.$1;
kind = IDENT;
if (keywords[token]) {
kind = keywords[token];
}
} else if (src.match(/^[0-9]+/)) {
src = src.replace(/^([0-9]+)/, "");
token = RegExp.$1;
kind = NUMBER;
} else {
token = src.charAt(0);
src = src.substring(1);
kind = OTHERS;
}
return kind;
}プログラム全体はこちら*2。
プログラム全体をご覧いただけば分かることだが、はじめからテスト用のPL/0コードも埋め込んで、字句読み取り器をテストすることからはじめた。
ご覧のように、いかにも泥縄的だ。記憶を頼りに作っているので、PL/0の予約語に"program"が入っていたりする。これではPascalだ。
それはともかく、いったんこう書いてみて、一旦はテストまでしたところで、これはいかにもダラダラしたプログラムになりそうだと思った。PL/0の原典であるPascalのソースは、こんなものでなく、もっともっとダラダラしているのだが、それを割り引いてもちょっと耐えられない。それに、グローバル変数を多用することになりそうな点も、Pascal的で面白くない。
そこで、プログラムが動く状態を維持しながら、プログラムを書き換えることにした。
続く(多分)。
*2:HTMLソース内に、<text/pl0>でPL/0のソースを記述する方法は、Logo on JavaScriptを参考にさせていただいた。