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を参考にさせていただいた。