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

caper 新バージョン

caperをupdateしました。 細かいバグフィックスと capella(AST作成ツール)の追加です。 capellaのデキはまあまだ全然ナニですが、 一応LLVMでのプログラミングには使えているので 自分でソース書き換える覚悟で 適当にアレしてください。 AST以外にもtypesaf…

if then else if then else if 〜

else ifに対応。 boolean定数追加。

fib

とりあえずフィボナッチ数列をコンパイル可能に。 ソース fun fib(n) { if( n == 1 ) { 1; } else { if( n == 2 ) { 1; } else { fib(n-1)+fib(n-2); } } } fun main() { puti(fib(6)); 0; } 結果 8たぶんあってる。 ちなみに試しに最適化してみたら 一段階…

新言語

とりあえず計算機のソースを整理する形で移植。 同じソースをコンパイルできるところまで完了。

まあいいや

そろそろ普通のコンパイラ始めるか

最適化

とりあえず こんなコードをコンパイルして: fun foo( a, b ) { a+b } if( 1 ) { foo(1,2) } else { foo(3,4) } こんなコードを出力して: ; ModuleID = 'test' @format0 = internal constant [4 x i8] c"%d\0A\00" declare i32 @printf(i8*, ...) define in…

リッチ計算機(ただし整数のみ)

変数つけた カッコつけたcaperとcapella(AST作成ツール)のおかげで結構楽はできているが、 それでもソースがややこしくなってきた そろそろ整理するか ただいまの文法 %token Number<calc::Integer*> Identifier<calc::Identifier*>; %token Add Sub Mul Div Var Equal LPar RPar; %namespace ca</calc::identifier*></calc::integer*>…

あるじゃん

select使えばいいだけか! あれ? でもこれ使うと 片方の値は未定義になる気がするけど いいのかな まあ明日試してみるか

if〜then〜else続き

ほっとくのも気色悪いので 明示的スタック操作で実装した。 一応動いた。 よく考えるとLLVMのBasicBlockは引数をとれるわけではないから CPSとかそういう問題ではないよな。 関数の引数以外に同じ名前で違う値を持つ方法がない。 とするとthen句とかのBasicB…

さらにif〜then〜else

……と思ったけど if then else(ただし値を持つ)はSSAだと簡単ではないなァ ytqwertyさんのを見ると…… 普通に無条件ブランチして合流してる。 3項演算子風のif書きたいときは戻り値どうすればいいのかな…… 明示的にスタック操作すんのかな レジスタだけで美し…

いまのソース

こんなのソースを fun foo( a, b ) { a + b } foo(1,4) * foo(5,7);コンパイルすると ; ModuleID = 'test' @format0 = internal constant [4 x i8] c"%d\0A\00" declare i32 @printf(i8*, ...) define void @puti(i32 %arg0) { %format0_address = getelemen…

関数呼び出し

関数定義と関数呼び出しを追加。動いた。 LLVMのインターフェイスってよくできてるな…… カンチャンずっぽりって感じでズバズバ決まる。 おかげでコーディング楽できる。

 次どうするか

さてそろそろリファレンスを読む。 ふむふむ、レジスタ無限の仮想アセンブラくらいまでは 自分でやらないとだめなのねー。 昔おもちゃの最適化コンパイラ作ったことあるから できると思うけど、 共通インフラなら構造化プログラムを内部表現にしたのを 与え…

AST

とりあえずパーサでは 自作のAST作成ツール使って作った ASTを構築するようにして そっからllvmの中間表現に変換するように変更 ついでに複数の式を読み込むように変更うまく動いた

電卓コンパイラできた

echo '8+7*3+4-8/2-9' | ./calc > t.ll rm -f t.bc llvm-as t.ll lli t.bc20意味はないが! ちなみにcaperのセマンティックアクションを こんな感じにした。 struct SemanticAction { typedef llvm::Value* value_t; llvm::BasicBlock* bb; int regi; Semant…

printf

動いた 上で書いたコードはあってた 実引数の方の型が間違ってた getelementptrのFAQ読んだらなんとなくわかった (正確に理解はしてないけど) dereferenceが一個足りなかったのかな あとは計算内容を動的にすれば 電卓の完成だ……

printf

んーーprintfの呼び出し方がわかんねー アセンブラだとそんなに難しくなかったんだけど、 C++コードで動的に作ろうとするとassert失敗しちゃう std::vector<const llvm::Type*> ft_printf_args; ft_printf_args.push_back( llvm::PointerType::getUnqual(llvm::IntegerType::get</const>…

[LLVM] テンプレートエンジン欲しい

とりあえず電卓コンパイラ作ろうと思って しこしこコーディングしてみたが、 アセンブリの構造をllvmのライブラリで作るのは 予想以上に大変だな。 テンプレートエンジン欲しい ライブラリははじめからアセンブラで書いて あとでリンクしろ、って話か……

stacker

Stackerをcoして言われたとおりにスクリプト走らせようとしたら なんかうまく動かないのでオカシーナーと思って スクリプトをのぞいたら svn info . | grep 'Repository Root:'とかやってる場所があって、試しに % svn info .ってやってみたら パス: . URL: …

グラフの3D可視化

前にMOON GIFTで見つけた便利そうなやつを備忘録として張っておく。 コンパイラ作るとき便利そうなやつ。http://www.ubietylab.net/ubigraph/index.html

LLVMお勉強

LLのお勉強を始める。 飽きるまでね。 とりあえずつまらない苦労は後回しにしたいので linux(Fedora 5)上で。 ソースtarballをとってきて./configure && make && make install。 特に問題なし。 stackerのページを見てやろうかとおもったら ワケわかんなかっ…

なんてことだ

もうすぐ嫁がでてくるらしい

vector

std::vector v; &v[n] == &v[0]+n (ただし!v.empty()) って標準準拠だったのか。 いままで無駄にエネルギー使ってた。 昔vectorの内部表現について ネットで因縁つけられたのがトラウマになって いちいちかなり無駄に考える癖がついてた。 Effective STL、ぱ…

ModuleMaker

examples/ModuleMakerを lessで見ながらタイプして書き写すというオールドタイプローテク作戦 (ベーマガ方式) でもモノ覚えるのはこれが一番早い気がしてならない どのライブラリリンクしたらよいのかとかわからなくて ちょっと時間くったけど動いた。 けど…

stacker

やっぱ全然ワカンネ まずはllvm-2.3/examples/Fibonacciあたりを 見たほうが良さそうだな 違うか、 examples/Module examples/Fibonacci examples/BrainFuck の順か 絶対どっかに書いてありそうだけど ドキュメント絶対読まないやつ = 私

よし!

4870で夏休みにやるゲームはこれに決めた!