2009-03-01から1ヶ月間の記事一覧

滅多に使われない常套句(2)

「おれの嫁は本当に幸せだな。おれはちゃんと働いて金を持って帰るし、家事もたまには手伝うし、暴力はもちろん振るわないし、疲れて帰ってきて家が散らかってても文句言わないし。おれの嫁ってのはなんて楽な仕事なんだろう。そうだ、おれ、生まれ変わった…

LLVM 勉強会第2回の記録

ちょっと遅くなりましたが LLVM 勉強会に参加した記録を残します。 御礼 まずは勉強会を主催してくださった syoyo 様、場所を提供してくださった SGI 様、発表していただいた syoyo 様、miura 様、omo 様、ありがとうございました。 また参加された皆様、懇…

イチロー、イチロー!

メモ2

やっぱり日記じゃなくて記事を書かなくっちゃなぁ。

メモ

年度末、納品。そして忙しい時に発生するトラブル。

LLVM 勉強会第2回

仕事は一応なんとかしたはず。さあ勉強会に出発だ。どんな人が集まるのか?とか、レベルに付いていけるか?とか多々疑問はあるけど、楽しみ。参加される方へ; PowerBook を抱えた丸い顔のおっさんが多分わたしです。初参加で技術レベルは低いですが今は sch…

歩いてわかる生活リズムDS

先月美しい家内の誕生日に購入し、わたしも一緒に毎日記録を付けている。これがなかなか優れたおもちゃで、割と楽しい。精度が良く、ちょっと仕事中に歩いてもちゃんと記録に残っている。わたしの場合鍵入れに一緒にデバイス(万歩計みたいな奴)を入れていて…

休日

でも出勤。そして明日も。TODO; 勉強会向けに私用名刺を作ること => 間に合わないかも。

メモ

runtime.ll は現在 1164 行。コンパイルして最適化して disassemble すると 621 行になった。コンスセルとかを表示するためのそこそこ長くて冗長な関数 display_obj が400行から100行と最適化されているなどが大きいようだ。 よくみると最適化がスゴいと…

滅多に使われない常套句

「一度は言語処理系を書いてみるといいよ、プログラムに対する理解がぐっと深まるから。おれも勉強したものさ。対話環境がある言語でその言語自身を実装すると楽しいし面白いよ。そうだね、例えば Common Lisp を書くなんてお勧めだよ。」上は冗談としても、…

嫌なデバッグ

vector 関連(make-vector, vector-length, vector-set!, vector-ref) をライブラリとして定義しようとしている。今までは常にインライン化しているようなものだった。 make-vector, vector-length は動いているっぽいが、vector-set! を実行すると異常終了。…

メモ

予想に反して、primitive をランタイムにうつしたほうがコンパイラが単純になった‥ そういうものなのだろうか。 ;; 現在の car, cdr の定義 ;;; (car (define-function ,opts i32 @prim_car ((i32 %arg1)) (assign %intptr (sub (i32 %arg1 1)) ; -1 %ptr (i…

opt オプション

LLVM の最適化コマンド opt は山ほどオプションがあって、しかも任意の順番に組み合わせて実行できる。-std-compile-opts で実行されるオプションにして2.4 と 2.5 で異なっている。よく見ると同じ最適化オプションが繰返し使われていて、ほとんど暗号。「カ…

Scheme Compiler の勉強(42) - 変換、変換!

自作コンパイラもどきは、 3.11 を飛ばして 3.12 Assignment, 3.13 Extending Syntax あたりを行った。これでかなりコンパイラらしくなってきた。 3.11 Complex Constants は説明がわからないのでスキップ。"An Incremental Approach to Compiler Constructi…

メモ

.emacs に (add-to-list 'auto-mode-alist '("\\.bc$" . hexl-mode)) と書いて .bc を開くとMagic Number(42 43 c 0 de) が見れる。が、とてもバイナリファイルを自力でパーズできる気はしない。BitcodeReader.cpp は 2000行程度。 lib/AsmParser/LLLexer.cpp…

コンパイラ

Common Lisp が文字列からプログラムになりコンパイルされ実行される過程を調べていると、他の言語には無い異様な部分に改めて気付く。そもそも、Wikipedia に書かれているように " それ以前の乱立した方言を標準化するために" 、という理由で Common Lisp …

メモ

gosh> (run-program '(let ((make-withdraw (lambda (balance) (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insufficient funds"))))) (let ((w1 (make-withdraw 10000)) (w2 (make-withdraw 5000))) (di…

llvmruby との比較

細かく修正。3/12http://d.hatena.ne.jp/miura1729/20090311 経由で http://llvmruby.org/wordpress-llvmruby/ compiling a standalone binary の例をなんとなく真似してみました。 llvm ruby は言ってみれば DOM で HTML 作るみたいなイメージでしょうか。"…

メモ

非効率ではあるものの、こんなのが普通に動くようになった。 (run-program '(let ((make-bank-account (lambda (amount) (lambda (n) (set! amount (+ amount n)) amount)))) (let ((foo (make-bank-account 0))) (foo 1000) (foo 500) (foo -100)))) => "14…

letrec ではまる

今まで明示的に (funcall f)と書いていたけどカッコ悪いので内部で(f) を (funcall f) とするようにマクロ展開子を作成中。 LLVM 関数を直接呼び出す labels/labelcall を使うとちゃんと fib 31 を実行できるが、これはホントの Scheme には無い命令なので、…

帰ってからやること

Common Lisp マクロのメモ。 リーダーマクロ、コンパイラマクロ、マクロ、 load time value ってのもあった

letrec

実装できたつもり。

Common Lisp の評価について

途中。 役割 カスタマイズ 備考 CLHS Read reader-macro, get-macro-character Read 時に動作するマクロ http://www.lispworks.com/documentation/HyperSpec/Body/02_b.htm Eval Symbol symbol-macro symbol に対するマクロ http://www.lispworks.com/docume…

iMac

新 iMac 登場。やっぱりこれを購入か?Core 2 Duo。

alpha-conversion, let*

let* を実装。単純に、再帰的に let の入れ子に変換した。 letrec が未だ。どこかで実装方法を見た気がするけど見つからない。

LLVM 2.5

id:miura1729 さん経由。どんどんバージョンアップされている印象。 はたしてわたしのコンパイラのような何かはちゃんと追随できるだろうか。わたしは以下の FAQ の2番目、自分で LLVM IR を書く、というのを選択していて S式で書いているけど、現時点でわ…

alpha-conversion

α変換。ひげぽんさんの2年前くらいの日記経由で、http://min-caml.sourceforge.net/ MinCaml コンパイラ にたどりつく。 α変換自体は何となく実装できたつもり。式をたどっていって奇麗に変換しきるととてもうれしい。

macro-expander

マクロ展開子を導入(3.13)。今までも and は if に書き換えてコンパイルしていたけど、マクロ展開をしてからコンパイルすることで、コードが少し明確になった。 util.match のおかげで式変形は簡単。 cond, and, or, when, unless をマクロで書き換え。let*,…

メモ

自作のコンパイラにまだこんな致命的なバグが残っていてのけぞる。 (let ((x 1)) (let ((x 3)) 999) x) => 3 ;; 誤り (let ((x 1)) (let ((x 3)) 999) x) => 1 ;; 正 新しく書いた assignment conversion (3.12) のせいかと思ったらずっとまえからこのバグは…