2008-10-01から1ヶ月間の記事一覧
予想ほど悪くはない。ダイエット必須。
コンパイラがこんな感じだったら入門者(わたしのような)が勉強しやすいのだけど、現実はもっと複雑だ。 (defun compile (program) (emit (optimize-3 (optimize-2 (optimize-1 program))))) 自作のコンパイラは、何か要素を見つける度に問答無用で断片をフ…
小休止して、汚く冗長なコンパイラを少し整理。今までは何でも文字列で処理していたので、見た目も悪いしメンテしにくかった。instruction を定義して(まだ乱暴だけど)、以前だと (emit "~a = load i32 %ret" %tmp1) などと書いていた処理を、(assign %tmp…
src/compiler/ppc/insts.lisp "instruction set definition for PPC" でインストラクションを設定。多段回のマクロによる定義でちょっと追い辛い。 うーん、なんとも複雑だ。以下の流れも怪しい。 compile (src/compiler/target-main.lisp) -> compile-in-le…
tests-*-req.scm から適当に抜き出したサンプルについて gauche コンパイルのパス1,2,3を眺める。 ($gref 手続き) というパターンと $asm というパターンがある。また、定数式になってしまうものとそうでないものとがあって、なかなか面白い。HTML 表にして…
http://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3aYAGHG%3aIntroduction 素晴らしいドキュメント。
※適当な粒度で書いていたら 24 回にもなってしまった。元の文書だと全部で24ステップなのに。コンパイラ自体は単純だけど、それが吐き出す結果は十分ややこしい。procedure の定義までできるようになったので、結果をよく眺めてみることにする。また、いま…
Abdulaziz Ghuloum さんの "Compilers: Backend to Frontend and Back to Front Again" という文書を参考にして、Scheme とコンパイラ、それからついでに LLVM の勉強をしています。この文書は、コンパイラがけっして魔術的な難しいものではないことを示すた…
うひゃー、これはちょっと眺めたくらいじゃとても理解するのは無理だ。
いくつかの処理系毎の scheme 言語レベルでの最適化が終わった中間形式を、 LLVM IR に落としてから LLVM のレベルで最適化を掛けると何が起きるだろう?メモ。 SBCL http://sbcl-internals.cliki.net/Backend 中間表現は IR1, IR2. http://www.cliki.net/LL…
要素が n 個の list '(x y z) が与えられたときに、"," で連結された文字列を作る。n=3のときは、 "i32 %arg1, i32 %arg2, i32 %arg3" が欲しい(リストの中身は使っていない)。「(Common Lisp の)loop マクロ無しにどうやって '(1 2 3) を作るんだ?doか?…
procedure (letrec) (letrec *1 が通るようになった。おお、これは嬉しい。以下のような scheme のプログラム断片が、 (build-program '(letrec ((f (lambda (n) (if ($fxzero? n) 1 (fx* n (f ($fxsub1 n))))))) (f 3))) 自作の”コンパイラ”によって以下の …