バイナリアンでも何でもない*1くせに、分をわきまえていません。Yatceを書いている関係でバイナリフォーマットに結構興味があったりして、MessagePackのErlang版を書いてみました。Python版も出ていたりしてMessagePack速いんだろなーErlangだとどうなんだろなーと思っていますがErlangでベンチマークとかどうやるんだろと思ったところで飽きました。
ポイントはいくつかありましたが、
- Erlangのバイナリフォーマットの表現力
- ハフマン符号を超えている(ような気がする)MessagePackのバイナリフォーマットの美しさ
- Erlangのプログラミングのやりやすさ
- MessagePack for C/C++のコードの変態っぷり
- 頭の中でポルナレフが延々と喋っていた
が特に印象的でした。
Erlangでは、eiというバイナリフォーマット変換ツールがC言語で提供されていて、これを使ってErlang VM内部のデータや型を外側の世界の任意のフォーマットに変形することができますが、残念ながらそのバイナリフォーマットは仕様としては公開されていません(追記:公開されてましたorz)。つまり、「変換ツールはErlangが提供するけどバイナリフォーマットは勝手に変えることがあるから、よろしくね」ということです。でもまあ、CでLinked-in driverを書くと嫌でも見ることになるわけで、Efficiency Guideの話も参考にしながら見てみると結構美しいフォーマットです。MessagePackと違うのは極端に小さいデータ(8bit整数)なんかが用意されていないというだけで、基本的には同様の思想(型や長さは必ず先に渡す)です。Erlangには何やらUBF(Universal Binary Format)という考えやその最新の実装があるのですが、そこまでは調べきれていません。調べなきゃ。
そうそう、float周りのバイナリをいじるところではid:Voluntasにお世話になりました。ありがとう。それから、面白いプログラムを作って元ネタを提供してくれたid:viverに感謝します。
(追記:gistからbitbucketに移動)