しんどいときが正念場
なんかね、もういいかなぁ。なんて思う時がね。正念場なんです。きっと。
一瞬の気を緩めるときは緩めていいと思うんだけど、緩めっぱなしでそのままでいいかな?
なんて思って、あきらめちゃうのはもったいないと思うんだなぁ。
今まで積み上げてきたものは自分にとってはなんてことがないように思える。
だけど、実際はとても大変なものを築き上げていたりするんだ。
それを、なんとなく捨てちゃうなんてもったいないと思うんだ。
ということで、mincamlのscala版のソースをちょっとだけ綺麗にしてみました。
進み続けることが大きな力になるのです。
ということで、mincamlのscala版のmainのソースを見てみます。
/** * バッファをコンパイルしてチャンネルへ出力する */ def lexbuf(outchan:PrintWriter, inchan:FileReader):Unit = { val yyparser = new Parser(inchan); yyparser.yyparse(); Id.counter = 0; Typing.extenv = Map(); val ast = yyparser.yyval.obj.asInstanceOf[Syntax.T]; println("ast "+ast) val typedAst = Typing.f(ast); println("typedAst "+typedAst) val knormal = KNormal.f(typedAst); println("knormal "+knormal) val alpha = Alpha.f(knormal); println("alpha "+ alpha); val iter1 = iter(limit, alpha);println("iter "+iter1); val closure = Closure.f(iter1); println("closure "+closure); val virtual = Virtual.f(closure); println("virtual "+virtual); val simm13 = Simm13.f(virtual); println("simm13 "+simm13); val regialloc = RegAlloc.f(simm13); println("regalloc "+ regialloc); Emit_x86.f(outchan, regialloc) outchan.close(); }
まずは、パーサが入力ファイルリーダを受け取って、パーサに渡します。
パーサはパースした結果をyyval.objに格納してあるのでそれを、Syntax.Tにキャストして
astに入れます。
それを、Typing.fで型検査をして型を付けます。
タイプづけされたASTをkNormal化することですべての計算結果に変数を割り付けます。
kNormal化された変数にα変換ですべての変数に別名を付けます。
α変換されたらいろいろと最適化したのち、クロージャ変換して仮想アセンブラにしたあと
13bit最適化して、レジスタ割り付けして、最後にアセンブラはいて終了です。
ってかんじなんですけど、順番をよく忘れるので覚えるためのすいへいりーべーぼくのふね的な
歌を作って見た。
じっこうかたけあるいたくろーばーしむれじぇみっと
実行型・毛ある・イタリアンクローバー・シム・レジェミット
と覚えてみましょう。
字句解析構文解析型検査K正規化α変換最適化クロージャ変換仮想アセンブラ化13ビット最適化レジスタ割り付けアセンブラ出力です。
最適化部分はさらに細かく分かれるけどまたこんどってことで。