2008-09-01から1ヶ月間の記事一覧

Scheme Compiler の勉強(21) - letrec の実装の細分化

あー、自分で書いたものを読み直して、ふと procedure の実装も少し細かいステップに分割できることに気付いた。難しく考えすぎていたようだ。しめしめ、これで先に進めるぞ。 全ての関数が LLVM の i32 を返す(当面これで問題無し。いまのおもちゃのコンパ…

TOEIC

受験。リスニングは「もう1回聞けば確実に分かるのに4つの選択肢を2つに減らす位しかできず勘で選んだ」問題多数。 穴埋め問題は例によってフィーリングで選んだのが多数。勉強しよう。 http://www.toeic.or.jp/toeic/guide01/guide01_01.html 結果発送予…

Scheme Compiler の勉強(20) - 問題の整理、 Procedures (letrec)

うーん、仕事が忙しいのもあるのだけど、 scheme compiler の勉強が止まり気味。理由はいくつか。 procedure を実装したい。ただし、 LLVM IR の define で定義される関数は、高級言語での関数に近く、引数を明示的に指定し、かつ型が付く。"An Incremental …

LLVM structure

配列と構造体の使い方勉強。

Macro を書くタイミング

繰返しが何回か出てきたら関数に抽出する、というのはまあ分かるけど、 lisp でマクロを定義するタイミングは難しい。 同じような形が出てきたときにさっと定義すればいいのだけど、つい「これはマクロでごまかすんではなくて奇麗なデータ構造を考えるべきだ…

LLVM malloc

memory allocation を調査、中。

LLVM heap allocation

分からなくなってきたので直接 LLVM IR を書いてみている。以下 cons のつもりで書いたけど違うな、これだと唯の配列操作か。もう少し LLVM を調べないと。 define [2 x i32]* @cons(i32 %arg1, i32 %arg2) nounwind { entry: %tmp1 = alloca i32 store i32 …

LLVM 論文

"LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation", Chris Lattner and Vikram Adve. Proceedings of the 2004 International Symposium on Code Generation and Optimization (CGO'04), Palo Alto, California, Mar. 2004. …

Scheme Compiler の勉強(19) - Binary Primitives(fx+) & Local variables(let)

Compilers: Backend to Frontend and Back to Front Again: 1.5 Binary Primitives ここまでは一つしか引数を取らない手続き(fxadd1, boolean?, null?など)と、特別扱いの if, and 位だけ定義していた。ここから2つの引数を取る fx+ (http://practical-sche…

IRC についてメモ

freenode(http://freenode.net/)…Open Projects Netとして始まったオープンソースプログラマのコミュニケーション用に設置されているIRC網。 インターネットリレーチャット(Internet Relay Chat)の略で、いわゆるチャットシステムのひとつ。接続しているユ…

[scheme]Scheme Compiler の勉強(18)

Scheme で Scheme を書く場合、簡単にテストデータが作れるのが嬉しい。 ※現在作成中の勉強用 scheme コンパイラ(というのもおこがましいが)は、直接 LLVM IR を吐き出すプリミティブしかなく、そしてまだ任意の足し算すらできない。またプリミティブな手…

Scheme Compiler の勉強(16) - SSA

いよいよ 1.4 Conditional Expressions の実装。そのまえに SSA についてメモ。Redhat の GCC に関する文書 http://www.jp.redhat.com/magazine/NO5/ 静的単一代入(SSA) 静的単一代入形式は、GIMPLE上に構築される表現で、プログラム内のデータの流れを非…

Scheme Compiler の勉強(17) - c->llvm-ir

いままでは地味に "llvm-gcc -O3 -emit-llvm -o c-test.s c-test.c" なんてのを手で入力して、 LLVM IR を調べていた。でもよく考えるといちいち shell (実際は eshell だけど)でコマンドを打つなんて面倒。c->llvm-ir という scheme の手続きをでっちあげた…

Shibuya.lisp 第1回TechTalk

Lisp/Scheme ユーザのコミュニティ、Shibuya.lisp 。ものすごい勢いで話が進んでいるなぁ。(うれしいことに reddit に紹介された。 reddit.com から Scheme Compiler で検索してこのページに来られた方へ; 残念ながらそんなに高度な話題はここにはありませ…

Scheme Compiler の勉強(15) - 小まとめ

LLVM 用 scheme compiler の勉強をしています。ようやく "Compilers: Backend to Frontend and Back to Front Again" の 1.3 まで終了(自分は時間のないおっさんなので時間が掛かっているけど、やる気とセンスのある人なら一日二日くらいでゆうゆういけると…

Scheme Compiler の勉強(14) - 自動テストの修正と gauche への移行

tests-driver.scm は、実害はないけど細かい問題がある。同じ手続きが2回定義されていたり。これもさっき気付いたが(http://practical-scheme.net/wiliki/schemexref.cgi?error)、 ChezScheme の error はメッセージの format を行う。仕様上はそうではなさ…

[scheme] Scheme Compiler の勉強(13)

区切りがいいので少しまとめてみる。"An Incremental Approach to Compiler Construction" & "Compilers: Backend to Frontend and Back to Front Again" は, Abdulaziz Ghuloum によって書かれた合わせても50ページほど、 Scheme のネイティブコンパイラ…

Scheme Compiler の勉強 (12) - LLVM opt による最適化

作成した貧弱なコンパイラによる冗長なコードを llvm-ac で.bc(バイナリ)を生成。この中間コードのバイナリ .bc にたいして opt コマンドで最適化し、それから PowerPC のコードをllcで吐かせる。 ;; tests-driver.scm に追加 (unless (zero? (system "opt -…

資料

前後したけど LLVM 関連資料をたどったもの。 http://groups.google.co.jp/group/llvm_study/web/第一回+llvm+勉強会 http://d.hatena.ne.jp/fd0/20080825/p1 http://alohakun.blog7.fc2.com/blog-entry-706.html しばらく手を動かしたおかげでやっと上で書…

Scheme Compiler の勉強 (11) - fixnum, char

1.3 Unary Primitives の fixnum->char までテストが通るようになった。 一旦基盤ができてしまえば、テストを追加=>primitive を追加=>テストを実行、とループを回せる。結局テキスト通りでちゃんとうまくいく。

Scheme Compiler の勉強 (10) - Unary Primitives (fxadd1)

scheme 流の define-syntax はエレガントだけど今のところとても使い辛い。式を変形したいだけであって、別にパターンマッチをしたい訳じゃないんだよなぁ。 define-syntax でうなっているうち、そもそも根本的に勘違いしていることに気付いた。define-synta…

Scheme Compiler の勉強 (9) - define-syntax

そもそも scheme が良くわかっていないので勉強。 define-macro と関数定義と。http://practical-scheme.net/gauche/man/gauche-refj_24.html#SEC30 より。 注: いくつかのSchemeの実装ではformalsの構文を拡張して、 CommonLispのように省略可能引数やキー…

コンパイラー

A「なんだ、コンパイラなんて、所詮誰かが決めたルールの中で悪あがきするだけじゃあないか」 B「俳句に感動したことはないのかい?」

Scheme Compiler の勉強 (8) - define-primitive マクロ

元のだと、 define-primitive なるマクロを定義している。ここが LLVM 用だともう変えざるを得ない。しょうがないのでいくつか定義しながらマクロも都合がいいように変更していこう。ここの大変さが、http://llvm.org/docs/FAQ.html#langirgen にあった、 "a…

Scheme Compiler の勉強 (7) - LLVM と PowerPC の返り値

ちょっと整理。今のところ、コンパイラーといっても与えられた即値に対応する LLVM アセンブラを生成して、それをテスト用の runtime.c の main から呼び出しているだけ。primitive の定義も、手続きを定義するというより個々のに対応するアセンブラを出力す…

Scheme Compiler の勉強 (6) - レジスタ %eax

primitive を定義するところで少し知識不足でつっかえている。 "Compilers: Backend to Frontend and Back to Front Again" の実装では、レジスタ %eax を特別扱いとしている。 これって特別なのかと思ったら、http://ja.wikipedia.org/wiki/呼出規約 を見る…

Scheme Compiler の勉強 (5) - immediate constants

とりあえず、 llvm のコンパイラが(とりあえず即値を扱う上では)若干簡単のようだ。とりあえずこれで少し進めて、 llvm の複雑さが重荷になってきたら拘泥せず戻ってこよう。 "1.2 immediate constants" にカタをつけよう。つまり runtime.c と compiler.s…

Scheme Compiler の勉強 (4) - LLVM IR の出力

llvm-gcc があれば gcc と同じようにできる、と思ったらそうでもなかった。※以下、ろくにドキュメントを読んでいないので注意。 やりたいことは llvm の instruction set を吐き出す scheme コンパイラを作る勉強。 困ったときは C で書いて確認(少なくとも…

Scheme Compiler の勉強 (3) - LLVM へ

ここまでで、少しずつネイティブコンパイラを作る勉強のイメージと、そのためには自動テストスイートが大事ということが少し分かった。どっちの方針でいくか決める前に、ターゲットを LLVM にする場合も試してみよう。 LLVM については、文字通り、全然分か…

Scheme Compiler の勉強 (2) - fxupper

compiler.scm で tests-1.1-req.scm の二つのテストが通らない理由を追いかける。このテストは、前回決めた tagged pointer で表現できる最大と最小の整数(fxupper = 即値 536870911 (=2^29-1))を確認している。そもそも手元の環境は PowerPC なので、命令が…