非公式 MessagePack ライブラリを公開しました

Erlang 勉強したてでも使える、お気軽ライブラリを目指して作りました。

公式

公式は @kuenishi が書いたものがあります。

URL
https://github.com/msgpack/msgpack-erlang

なぜ今更 MessagePack ライブラリなの?

勉強がてら、という事もあるのですが @kuenishi が書いたライブラリをリファクタしようと思っていたのですが RPC とべったりということもあり、まずは pack/unpack だけ出来るシンプルなライブラリを作ってみました。

もちろん1から書くことはせず、@kuenishi のコードを大きく流用させていただきました。@kuenishi さえ許せば本家に統合したいところですが RPC との兼ね合いもあるので難しいと思い、別に作りました。

本家とどう違うの?

特徴とかをだらだらといかにまとめましたのでどうぞ。

pack/unpack というシンプルな形

本家は unpack_all という形をとっていますが、今回のは pack/unpack のみにしています。ほかのライブラリがそんな感じだったので統一感を出してみました。

例外を使っていない

本家は例外で最後にキャッチするパターンでしたが、あくまでも ok/error で対応してみました。単にこだわりの違いだと思います。

QuickCheck によるテスト

シリアライザ系に一番効果を発揮する QuickCheck を投入してみたかったというのが一つあります。一応最低限投入してみたところ見事に @kuenishi の仕込んだバグを発見しました。単なるガードのチェックミスですが ... 。気軽にバグがみつかるのはいいですね。

QC だけでテストを書くというところに挑戦してみたかったのですが map32 と array32 が重すぎて挫折しました。引き続き頑張りたいです。

RPC 実装との切り離し

RPC は今のところ魅力が無いので、作るなら別ライブラリで作りたいなと思っていました。msgpack ライブラリとしてはシンプル実装で。

末尾再帰にした

とことん末尾再帰にしてみました。ただ、本家の方がシリアライズは少しだけ早いです。その代わりデシリアライズはこちらのほうが早いです。もう少しプロファイラー使ってうまいことやっていきたいところですね。

高速化、というところでは NIF を使うべきなのでしょうがピュア Erlang 実装ということでもある程度速度出るみたいなので MessagePack 偉大なり。

感想

もともとの @kuenishi のコードがとてもよくかけたのでそれをリファクタリングしたという感じです。ほとんどテストを書いていたような気がしないでもないです。

テストも QC でほとんど終わっています、もう少し QC 側でのテスト増やしたいですね。今までよりももっと気軽に MessagePack を Erlang で使ってもらえるのではないかなと思います。

あとはこれでプロファイルの勉強もしたいなと考えています。ピュア Erlang でのプロファイルもしっかりやっておかないと。

TODO は高速化とかテスト追加くらいしか無いので、何か積みたい機能があれば Pull-Request お待ちしてます。