LLVM

しらんまに

2.5が出てた。 Release Notesを読む…… えっ、まだ構造体返し実装してないの? 実験してないからわかんないけど、 記述は見あたらない……

LLVM2.4ちょっと試してみた

これとこれ なおってねーじゃんかチキショー LLVM IRではFirst Class Aggreateをフルサポートしました! でもCodeGenではサポートしてません ってそんな! ポインタ渡しにしたほうがよさそうだ

2.4リリースされたのかな

LLVM http://llvm.org/

例外処理

例外処理を実装しようと目論む。 …… 何もオブジェクトをthrowしないで フロー制御するだけなら何も考えずに書けるようだけど、 オブジェクトをthrowしようとすると そうもいかないらしい。 少し考えねば。 llvm.eh.exceptionを使ってどっかよくわからん場所…

構造体と構造体リテラル

構造体実装した。 require leaf; struct Foo { x: char; y: short; z: int; w: long; }; fun main(): int { var foo = Foo { x = 13@char; y = 75@short; z = 46@int; w = 2@long; }; 0; }こんなソースが ; ModuleID = 'test' declare i32 @puti(i32) declar…

キャスト

キャスト演算子を@にしてしばらく書いてみたけど アセンブリみたいでキモい foo as int とかにしようかと思ったけど asみたいな短い文字列を変数名に使えないのはハマりそう foo cast int かなあ でもいまいち意味が取りづらい foo => int とか? うーん foo…

名前

いま気づいたleafってエロゲ屋の名前じゃねえか シナプスが全く結合してなかった まいいやいまから変えるのめんどくさい

多値

今生きてるバグレポートはこれっすかねhttp://llvm.org/bugs/show_bug.cgi?id=2660まあ待つか sretってなんだろ? はあ、返り値をポインタ渡しするための引数の修飾子か ポインタ渡しと実際の返り値とを フロントエンドの時点で恣意的に分別するのはやだな …

多値続き

ああなるほど、多値サポートなくなって struct返しが普通になるのかhttp://lists.cs.uiuc.edu/pipermail/llvmbugs/2008-July/005462.htmlsubversionのレポジトリから持ってきた方に 多値Returnがなかったので、なんかおかしいなと思ってた (複数環境をインス…

多値

struct返しにしてもだめなもんはだめだった ジェネレータの問題みたいだからほっとくしかないか 手動にしてもいいけど 私の勘違いかもしれないし そのうち直るかもしれないから 別のことやるか lli -force-interpreter=true t.bcってやったら lli: Interpret…

多値続き

ググったらBugzillaでなんかやってたX86のABIでレジスタが余ってなかったらだめとかなんとか 他にもいろいろ問題あるみたいで 要するに多値はまともに機能してなさそう 実装変えるか

多値

超必死こいて多値の実装をしていたわけですが、 よくみたらLLVMの多値( Multiple Return Value => MRV )って 2.3で新しく入った機能なのね!!! でもって、 require leaf; fun foo( n: int ): int, char { n, n@char; } fun main(): int { var a, b = foo(3…

 クロージャ

ふひー やっとこのコードが通った 10時間くらいかかった require leaf; fun foo( n: int ): fun ( int ): int { fun( m: int ): int { n * m; }; } fun main(): int { var f = foo( 3 ); puti( f( 4 ) ); 0; }クロージャに封じてある自由変数の数とか 呼び出…

返り値の型とキャスト

今まで手抜きで関数の返値の型を全部Int32Tyにしてたのを ちゃんと型宣言を見てつけるようにした。 そのテストにあたってchar, longなどの値を生成する必要がでたので、 キャスト演算子"@"を実装した。 でも Expr '@' TypeExpr ていう文法にしようとしたら r…

ローカル関数

なんとかローカル関数を実装した。 無理矢理っぽくてあんまり納得いかないけど。 自由変数を本物の引数の前に並べるような lambda-liftingしただけなので、 関数が定義されたスコープを抜けたらコール不能になる。 (引数として使う自由変数の存在が保証でき…

変換

うーむなんだか関数型中間表現変換 入れた方がいいような気がしてきた ASTからダイレクトにLLVMに持ってくのは この辺が限界のような気もする クロージャのエスケープ解析とか入れたい でもSSA作る手順が関数型中間表現作る手順に似ていて 同じことするだけ…

自由変数の収集

自由変数の収集はたいしたことなかった 以前OCamlでやったときは結構めんどくさかったような気がするが あれはOCamlの練習も兼ねてたので 破壊的操作をしないという掟を己に課していたせいだな C++でやったら 10行くらいの追加ですんだ (その分ソースが不自…

うーん

問題の依存関係的に分割ができねー 気合い入れて全部同時に実装するしかない

と思いきや

意外と簡単に直った気がするが よくわからん テストコードいっぱい書くしかないな

あっ

型推論の実装が中途半端だったの忘れてた つっても現状関数が型省略を許してないし、 変数の初期化以外の代入文もないから 推論するところほとんどないな あっ うーん 変数の型推論のアルゴリズムが間違ってる 結構面倒だな 関数型IRみたいな構造になってれ…

さて次はどうしよう

無名関数の前に ローカル関数かな〜 LLVMの仕様だとlambda liftingすることになると思うので とりあえず自由変数の検出かしら。 というか何するにしても 自由変数の検出は必要か。 じゃあそれにしよう。

デザイン予定

leafのデザインは以下のような雰囲気で 進めていく予定です。 強い型付け c系の字面 デザインの美しさと使いやすさがコンフリクトしたときは使いやすさをとる。 perl/ruby的なスタンス あくまで道具。 強い型も「自分に必要な道具だから」つける。 関数型言…

今の文法

ちなみに現在の文法はこんな感じです。 なんだかんだで結構大きくなりつつありますね。 エラートラップ用の文法も含まれているので、実質的には もうちょっと小さいですが。 バグって変な動作をするたびに「caperのせいかな?」と疑って ビクビクしながら使…

分岐

phiとかいうの使えばよかったのね 書き換えよう

チェックアウト

subversionのレポジトリはバンバン更新しますが アーカイブの方はあまり更新しないと思います。 従って、leafで遊ぶなら subversionでチェックアウトした方がよいかと思います。 匿名チェックアウトは svn checkout http://caper.googlecode.com/svn/trunk/ …

google code view

グーグルユーザーならサインインしてればツッコミ入れられるみたいです。 プロジェクトの設定にありました。 匿名はむりみたいですけど。

caper 新バージョン+おまけでleaf公開

caperの新バージョンをアップロードしました。 Makefile、VC++のプロジェクトを微修正して 若干コンパイルしやすくしました。 あとおまけで'leaf'(LLVM用修作コンパイラ)を追加しました。 caper, capellaのサンプルにもなっています。 まだ全然見所のない言…

とりあえず型式のパースだけするようにした 無視してるけど んで char 8bit short 16bit int 32bit long 64bit にした。 C#ってこうだったよね? んで型システムはLLVMのそのまま使おうかとも思ったけど たぶん後で困ると読んだので 似たようなものを自作。

require

C++でプリミティブな関数を書くのは もう勘弁願いたいので RTLは外部の.llに追い出してアセンブル・リンクすることにした。 すると関数宣言のrequireが必要になったので実装。 いまのところ普通に動いている。 標準関数の実装が簡単になったので 文字出力関…

キャスト

型システムを取り入れようかと思うんだが キャストとかどうしようかなー 今最高にかっこいいキャストってどんなかな? 暗黙の型キャストとか全廃したほうがいいよね バグの温床だから cast(v)とか好みだけど scannerに厳しいからどうしようかなあ どなたか、…