ヒマだったのでMessagePack for Erlangを書いてみた

バイナリアンでも何でもない*1くせに、分をわきまえていません。Yatceを書いている関係でバイナリフォーマットに結構興味があったりして、MessagePackErlang版を書いてみました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に移動)

*1:アセンブラ機械語も全然わからん