qprof

qprof で VM のインストラクションレベルでプロファイルを眺める。速くできそうなところはない。
速くするには

  • プログラムの命令数を減らす→コンパイラにおける最適化
  • allocationを減らす→コンパイラにおける最適化、できるだけ静的にオブジェクトを埋め込む

あたり。
JITに行くのはまだ速いと思うので、関数型言語特有の最適化手法を学んでみるかな。
Gauche の行っている最適化で一部未実装なものがあるのでそれを洗い出してみよう。

Affine Transform

Real-Time Renderingの 4章 のTransform に突入。
ついに念願のアフィン変換が出てきた。以前から id:nik9 先生が何度も IRC で「アフィン変換」とつぶやくのを見てきた。その当時は全く意味が分からなかったが、こういう事だったのか。


せっかく自分が Mosh という数学の計算が得意(?)なインタプリタを持っているので、簡単なアフィン変換の行列計算を試していこうと思う。今日は早速、一番簡単な Translation を実装した。
Scheme 上で行列をどのように表現し、抽象化するのかあたりも追求してみよう。現時点では point, vector は Record で、Matrix は Vector で表現している。


そういえば Mosh でも早く絵を出せるようにしたいな。Postscript でならもう絵がでているが味気ない。いっそのこと Scheme のコードを JavaScript や Action Script に変換するコンパイラを書いてブラウザ上でぐりぐり動かすのはどうか。と思ったが、コード変換するコンパイラを書くのが楽しいだけだな。

psyntax で and を if に展開せずバックエンドに渡す方法

1. (and (core-macro . and)) を builder-script の psyntax-system-macros に追加。
(and (macro . and)) を削除。
2. builder.ss に追加

  (define-syntax build-and
    (syntax-rules ()
      ((_ ae exp*)
       `(and . ,exp*))))

export に build-and を追加。

3. expander.ss に追加

((and) and-transformer)

  (define and-transformer
    (lambda (e r mr)
      (syntax-match e ()
        ((_ e* ...)
         (build-and no-source (chi-expr* e* r mr))))))