通年でLua処理系を作った
こんにちは、びしょ〜じょです。ではいきます。
T大学の情報特別演習というものでLuaの処理系を作りました。
発表スライドはこちら
どうしても百合感を出したかったのでネーミングがやや強引ですが、OKです。
関数やデフォルトのモジュールはllixを動かしているLuaからコピーしてくるので実は大したことしてない疑惑を拭えない。
本稿では8分の発表に現れなかった部分を供養したい。
1. 実装
MoonScriptで実装されている。
17行目はLuaへのDeepCopy関数をデフォルトで作ってくれという訴えであり、
19行目はOCamlなどのmatch文のようなことがしたかった、これはMoonScrriptへの要望ですね。guard
というのは当時の彼がガードとなにか混同してますね。
プログラムから叫びが見える。
関数呼び出しの管理にはcoroutineとスタックを用いている。 後述するCPS変換する前のevaluatorでは、ループ中でのbreakの実現にもこのcoroutine+スタックが用いられていた。 coroutineを用いるのは実はこれが初めてなのだが、自分でもなかなかよくやったと思った。でもCPS変換するとループの制御も簡単にできるのだ〜〜この構造は消えた。 関数の方も継続に突っ込めばできそう(実際できる)ですが今発表までに間に合わないと思ってやってない。 発表の質問でcoroutineに関するものがあり、つまりこのコールスタックの構造のままだとllixで動かすcoroutineなどを途中で破棄すると中のスタックはどうなるんだというものがあり、後ほど調査するかもしれない。
CPS変換すると、末尾再帰の後にk
を最後に適用するというスタイルを貫く必要があるため、実装がうまく思いつかなかったりな部分が多かった。
逆にCPS変換することでできたのがイテレーターだったりする。
2. ウルルン制作秘話
2-1. 序
最初は「とりあえずLua処理系でも作ってみるか」というモチベーションで挑んだのですが、本当にそれだけで、そもそも言語処理系を作るというのが個人的に初めての試みだった。 そしてそれだけではちょっと微妙かなと担当のK先生に言われてしまったので、K先生が「彼なら相談に乗ってくれるんじゃないかな?」といって紹介した院生のLさんとアレコレ考えた。 Lさんは人曰く、Luaとあまり関係ないし、先生の気まぐれに付き合わされたという形の可能性が極めた高いということを聞いたので、申し訳ない気持ちになりながらも数回ミーティングさせていただいた。
何で書くかというのはMoonScriptでと最初から決めていた。 で、コンパイラーかインタプリターか、バイトコードにするのかJVMで動かすのか、など話したが、ずぶの素人であるボクはウンウン唸るくらいしかできなかった。
で、例外処理機構のあるインタプリタということになった。あがった中で自分の実力で目標へ到達するのに一番現実的だったというのもある。
7月になっていた。
2-2. 破
とりあえずCPSとかなしにインタプリターをつくった。パースしたものをグヨグヨしていくだけなのでここはわりとスッといった。 デバッグなどで用いていたモジュールinspectが謎の挙動をたまに見せるので調査してpr送ってマージされたりした。
9月いっぱいはF社にインターンだったが、御社は無慈悲にもインターネッツ回線を一切よこしてこなかった。 テザリングやモバイルWifiでしのいでいたが、後半は速度制限がかかったので128kbpsでbitbucketにpushした。
インターンとevaluatorの実装で9月が終わった。
2-3. 急
CPSに関するものはSchemeで例示されているものが多く、選民ではないので読むのに、CPSを理解するのに難儀した。 とりあえず書きながら覚えるということをやっていってなんとか概念が手に染みこんできた。
手にCPSがなじみはじめたところでevaluatorをCPSにしていった。ここにきてMoonScriptのReferenceを見直したりすることでウオッという感じになった。
しかしCPSとオフサイドルールは相性がぶっちゃけ最悪だ。ガンガン深くしていく必要があり大変なことになった。
それでもLuaでfunction()... end
地獄になるよりはマシだったかな。eval.moonをLuaにトランスパイルすると行が2倍になる。
k with y do ...
とか-> switch x
などから苦労が窺える。
小慣れてきたあたりで適当な言語をつくったりもした。
12月ごろCPS変換が大方完了すると同時にスライドを書き始め、今年になってからREPLにlinenoiseなどを突っ込んだり突然リッチにした。
Shaji
- なんの考えなしに来た学生を見捨てなかったK先生
- 親身になってミーティングに参加してくださったLさん
- 度々おじゃました研究室の皆さん
- 御社の皆さん
- 精神を強く支えてくれたアイカツ、プリパラ
- etc
追記 2016/02/08
もうすこしまともなものを書いて提出しました。
なんで序破急かというと、エバンゲリオンが2015年冬に放映されなかったからです。エヴァはそれほど好きではない。