Tinycc on NaCl について kernel/VM 探検隊7で話しました

https://sites.google.com/site/kernelvm/ima-made-no-matome/di-qi-hui-kaneru-vm-tan-jian-dui

スライド

http://shinh.skr.jp/slide/nacltcc/000.html

金曜の夜…というか土曜の3時くらいになんか話しませんか offer をいただきました。せっかくだからなんか喋るかーとネタを考えたところ、ゴルフ場の sandbox が思いついた後に nacltcc を思い出して、ああこっちはスライドとか作ってないなーとこっちにしました。 C コンパイラの話なら IOCCC 入賞の自慢もできて一石二鳥ではないかという。ところで twitterIOCCC 優勝とか書いてくれてる方がいましたが、優勝はしてないっていうか優勝ってあるのかなという。誰が見てもあからさまにすごい akari.c が whowon の一番下にいて、今まで一番上にいた "Best of Show" の称号を得てるあたり、まぁそれが優勝なのかなとか思ってましたけど。でも Best of Show が2つある年もあったりするぽいですが。

で、自慢するためには私の IOCCC entry が動かんとなーとコンパイルしなおすわけですが、例のごとく NaCl と nacl-mounts が色々かわっててまず少し苦労。そもそも標準入力がサポートされてなかったので、それをさくっとつけるとこから始めて、アラインミスによる verification error を修正。このへんで既に日曜になってて、 akari.c は動くから諦めようかなーとスライド作ったり starcraft2 やったり。

64bit シフト使いまくりなんで、 32bit 環境では libtcc1.a のリンクが必要で、そのへんがぶっこわれてるのでした。これは TCC 自体に libtcc1.a をリンクしてやって、シンボルテーブルに必要な関数足してやれば動くには動くんですよね…とやってみたら動く、が出力がおかしい。

コード削除による二分探索という大変効果的なデバッグ手法により、アレコレやってるとどうも long long がそもそも i386 TCC の時点でおかしいと判明。系2個所おかしかったんですが、わかりやすい方の片方は半分私のミスで、 IOCCC で右辺負数でシフトするという未定義動作をやらかしてたことに気付いて悲しくなりました。

もう片方は複雑な状況で long long の上位のためのレジスタを確保してる間に long long 下位の方のレジスタがスピルされるという、この上なくうっとうしい種類のバグでした(そうえいば x86-64 対応の序盤でも、関数呼び出しにレジスタ使うので、苦労した場所でした…)。このへんのコード Fabrice 以外誰も理解してないんじゃないかなーと思っててて、 git blame してみても本当に誰もいじってなくて感心しました。

これの修正は苦労しそうだ…と少し考えてみたんですが難しくて、そもそも 64bit 論理演算を全部 C の関数に逃がす、という方法で逃げました。

というわけで動いたのが朝8時で、まぁしょうがないなーと細かい変更をしながら徹夜で会場に行った感じでした。

会場でもだらだらと preprocess と compile してオブジェクトの中身を hex dump する機能とかを適当につけたりしてました。

発表自体はすっとばしが多くて申し訳なかった感じでした…最初 LT って5分かなーと思ってたんで、詳しい説明はできなさげだから akari.c のすごさでも語ろうとか思ってたんですが、10分らしいということで、内容の紹介もするか…と思ったものの、となると NaCl とかからちゃんと説明しないといけなくて、なんかどっちつかずになってしまった感じ。 10 分でも akari に専念すべきだったか。

他の人の発表では、 @sora_h さんの cookpad での週休4日体制がうらやましくてしょうがなかったので詳しく聞きたかったけど懇親会いなかったなーというのが一番記憶に残っているというありさまでした。なんか全体的にゲストからホストの機能無理矢理使う系の話が多かったですね。 @nminoru_jp さんの話が、あまり MMU とかわかってないんで、そんなことできるんだなーという感じで興味深かった。

疑問点としては @hiromu1996 さんの U combinator って何ということが一つあって、どうもそれ一個あればなんでもできる素敵 combinator らしい。たしかにそういうものがあるってのは聞いたことあったような無かったようなという。 IotaJot は見覚えあるし。懇親会でそんなもんあるんですねえと聞いたらあるんですよねえという感じだった。 http://stackoverflow.com/questions/3097142/u-combinator-on-a-fibonacci-how-would-you-translate-this-code-to-python によると定義は (define (U f) (f f)) なのかな。

あと一つは @takeoka さんの e 進数が最も効率が良いという話で、シャノン限界がどうこう系の話かと思ってホンマかいなと思ってたんですが、今

http://d.hatena.ne.jp/ROYGB/20060414

を読んで納得。ただこれ直感的に 2 進数の方が効率良かったりしないかな…と思って gnuplot で plot してみました。

http://shinh.skr.jp/dat_dir/log2log3.png

たしかに 2 以上の整数に対して 3 進数が勝つな…と。あとあたり前ですが 4 進数は 2 進数と同じ効率なんだな…とか。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h