Continuation Fest
最初の方と最後の方に興味があったので、すが、まぁ順当に寝坊したので最後の方だけ聞きに行きました。
CbC の話は順当に面白かった…というか話者の方が面白くて順当以上に面白かったです。行って良かった。 C 言語って上から下までなんでも作れるっていうけど、プログラム言語作るにはどうもちょっともの足りないよね、という人は見てみるといいんじゃないかなぁと思いました。 GCC についてるってのは普通に良さそうだなぁ。 TODO: CbC をちゃんと見る。
ささださんはまぁ知ったような聞いたような話をしていたように思う。
でまぁ適当にアウェーのまんま呑み会とか行った。
なんか前に外人さんが座っててしょぼしょぼ英語とかで話を聞いた。なんかコンパイラの実装に continuation 使ってコンパイラをパーツにバラすってのが割とあるジャンルなんだぜとかなんとか。それ本当に実用的な速度で実用的な最適化つきで動くのかなーとか思ったけど、まぁ研究の話にそいうこと聞くのもヤボなのかなと思った。話としてはとても興味深いと思いました。
あとその外人さんの研究分野とか聞いたけどなんか話が大きくて面白かった。「言語をなー言語になー埋めるのなー」「ソレ DSL 、言ウコト、違ウ?」「DSL もなー含むけどなーもっとなー広いなー。日本語の中に英語あったりするだろー。ああいうのも範囲だなー。あと AI でほげほげでふがふが」みたいな。
Haskell の Monad とかは正確な議論でなくていいからなんか適当に騙して説明してくれた方が初学者には優しいとかいう話。 Monad ってよくわかってないんだけどそんなに難しいものなのかが未だにわからないので、よくわかってないのだと思う。
なんていうか私の理解では、 Monad ってよくわからんけどリストで、 IO だったら IO の命令のリストで、 List はそのまんまリストで、あとモナドって何があったっけ、と全く理解してないじゃないかという。で Maybe モナドが何でモナドなんだと聞いたら Maybe の Nothing 側への operation はまた Nothing かえすとかいう話で、なるほどそういう意味でリストかーと始めて Maybe モナドがわかりました。いや明らかにわかってないだろう。
たぶん重要なのは、あーいうインターフェイスで定義される Monad っていうリストの作りかたしとけば、数学的にほげほげで証明された理由で色々嬉しいことがあったりする、って話なんだろうと思う。そういうのは物理とかでもよく見たことがあって、数学的に綺麗な形にしとくと色々嬉しい、っていうのは理屈はわかってないけど、なんとなくわからんでもない。
CbC の方に GCC 大変じゃないすかと聞いたら 4.x でだいぶ良くなったと教えていただいた。あと C++ を批判されたので全人格を否定されたように思えた。
帰りに akr さんが IA64 の register stack について質問されてたのを思い出して IA64 どうなんすかと聞いてみたら、特に感動するほど速くはないとのことでした。あとシングルステップ実行で VLIW の切れ目ごとに step できるとか。 cf.sourceforge.net の死が遺憾でならないというような話をしたら hp のなんかが色々使えてすごいと教えていただいたのでとても嬉しかった。
で帰って探してみたけど、うまく見つからんかったので ukai 先生に苦情を言ったらそれは test drive だよと教えて下さったのでハッピーです。でもなんか Get an account のところ行ったらフォームが途中で切れてて入力できなかったので hp に苦情メールを送ったら直してくれた。どうも。クレーマーはまじです。
はろーわーるど!
main: .prologue 14, 32 .save ar.pfs, r33 alloc r33 = ar.pfs, 0, 4, 1, 0 .vframe r34 mov r34 = r12 mov r35 = r1 .save rp, r32 mov r32 = b0 .body addl r36 = @ltoffx(.LC0), r1 ;; ld8.mov r36 = [r36], .LC0 br.call.sptk.many b0 = puts# mov r1 = r35 ;; mov ar.pfs = r33 mov b0 = r32 .restore sp mov r12 = r34 br.ret.sptk.many b0 ;; .endp main#
読めません。 objdump の方が VLIW の切れ目がわかって読みやすい気がする。
40000000000005e0 <main>: int main() { 40000000000005e0: 00 08 15 08 80 05 [MII] alloc r33=ar.pfs,5,4 ,0 40000000000005e6: 20 02 30 00 42 60 mov r34=r12 40000000000005ec: 04 08 00 84 mov r35=r1 40000000000005f0: 01 00 00 00 01 00 [MII] nop.m 0x0 puts("Hello, world!"); 40000000000005f6: 00 02 00 62 00 80 mov r32=b0 40000000000005fc: 84 0c 00 90 addl r36=72,r1;; 4000000000000600: 10 20 01 48 18 10 [MIB] ld8 r36=[r36] 4000000000000606: 00 00 00 02 00 00 nop.i 0x0 400000000000060c: a8 fd ff 58 br.call.sptk.many b0 =40000000000003a0 <_init+0x90> 4000000000000610: 0a 08 00 46 00 21 [MMI] mov r1=r35;; } 4000000000000616: 00 00 00 02 00 00 nop.m 0x0 400000000000061c: 10 02 aa 00 mov.i ar.pfs=r33 4000000000000620: 00 00 00 00 01 00 [MII] nop.m 0x0 4000000000000626: 00 00 05 80 03 80 mov b0=r32 400000000000062c: 01 10 01 84 mov r12=r34 4000000000000630: 11 00 00 00 01 00 [MIB] nop.m 0x0 4000000000000636: 00 00 00 02 00 80 nop.i 0x0 400000000000063c: 08 00 84 00 br.ret.sptk.many b0;;
わかったこと:
- 逆アセの出力に ;; が残ってるということはきっとこれは何か意味がある。
- nop は書かなくても勝手に入ってるぽい。
- えーと先頭 4 bit がタグで最後の 1bit が次との関係で 41bit*3 が残りか。これ左の数字読むの至難の技ですね!