Your SlideShare is downloading. ×

CoqによるMsgPackの証明

5,027

Published on

ProofSummit2011 http://partake.in/events/ac41261d-6026-4d09-8814-5ad3e58446e8 における発表

ProofSummit2011 http://partake.in/events/ac41261d-6026-4d09-8814-5ad3e58446e8 における発表

Published in: Technology
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,027
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
14
Comments
0
Likes
7
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 2011/09/25 ProofSummit2011 #ProofSummit Coqによる MsgPackシリアライザの 証明と実装 mzp / みずぴー 111 9 25
  • 2. 自己紹介 @mzp / みずぴー 名古屋のSE Coq / proof-general派 ProofCafeに参加してます 211 9 25
  • 3. ProofCafe 開催日: 第4土曜日 開催場所: どえりゃあカフェ@名古屋 アダムッチさんのCPDTをみんなで読む ‣ そろそろ別のことやるかも たまにイベント開催 311 9 25
  • 4. 2011/09/25 ProofSummit2011 だいたいこんな感じ11 9 25
  • 5. MsgPackを証明した動機 ネットワーク通信がしたい 楽をしたいので、既存のライブラリを 活用したい 要件 ‣ ある程度の実績がある ‣ 非同期の呼び出しができる ‣ いろんな言語のライブラリが充実してる 511 9 25
  • 6. MsgPackがよさそう オブジェクトのシリアライザ + RPC ✓ 高速かつ省サイズ(らしい) ✓ 非同期呼び出しもサポート ✓ いろんな言語のライブラリがある 611 9 25
  • 7. MsgPackライブラリ一覧 711 9 25
  • 8. MsgPackライブラリ一覧 OCaml版がないじゃん → 作ろう 711 9 25
  • 9. バグがこわい 作るのはいいけどバグがこわい 省サイズ化のため仕様が複雑 ✗ 実装を間違えてないかな? ✗ テストの網羅性が十分かな? ✗ この変更しても大丈夫かな? 811 9 25
  • 10. 証明すればよくね? 証明すれば... ✓ 全入力に対して正しさが保証される ✓ 人間が網羅性を考えなくてもOK ✓ 変更しても大丈夫かを考えなくても OK 証明したほうが楽!! 911 9 25
  • 11. 証明した(シリアライザだけ) シリアライザ部分のみ 多言語間のデータやり取りには使える RPCは今後の課題 MsgPack = シリアライザ + RPC + RPC-IDL ↑ ここだけ 1011 9 25
  • 12. 公式レポジトリに入って ます(キリッ msgpack/ocaml/proofというディレクト リがあるよ ↑ これ 1111 9 25
  • 13. 証明の流れ11 9 25
  • 14. Coq使いました 証明にはCoqを使いました ✓ 証明したコードをOCamlに変換できる ✓ 日本語の文書も豊富 ✓ Twitterでいろんな人に訊ける 1311 9 25
  • 15. 開発の流れ 1411 9 25
  • 16. 証明のアウトライン 1.8/16/32/64bits整数を作る 2.オブジェクトと変換ルールを定義する 3.シリアライズ関数、デシリアライズ関 数を定義する 4.OCamlに変換する 1511 9 25
  • 17. 証明のアウトライン 1.8/16/32/64bits整数を作る 2.オブジェクトと変換ルールを定義する 3.シリアライズ関数、デシリアライズ関 数を定義する 4.OCamlに変換する 1611 9 25
  • 18. 8/16/32/64ビット整数 MsgPackはビットレベルの操作を多用す るのでnatだと不便 標準ライブラリのasciiを組合せて、マ ルチバイトの整数を定義する 1711 9 25
  • 19. natとの変換 asciiのままだと証明が面倒 natとasciiの相互変換関数を作る 1811 9 25
  • 20. 巨大なnatが扱えない 5000以上のnatを使おうとするとオー バーフローする 16ビットすら扱えない (><) 1911 9 25
  • 21. オーバーフローする理由 Coqのnat := ペアノ数 再帰的に定義されている 値が大きすぎると、ネストが深くなり すぎる 2011 9 25
  • 22. オーバーフローの回避 巨大な自然数が登場しないようにする simplダメ、ゼッタイ 累乗に関する補題を使う 累乗に関する補題 n m (n+m) 2 ⇥2 =2 n 0  n ならば 0  2 n m n  m ならば 2  2 2111 9 25
  • 23. 証明のアウトライン 1.8/16/32/64bits整数を作る 2.オブジェクトと変換ルールを定義する 3.シリアライズ関数、デシリアライズ関 数を定義する 4.OCamlに変換する 2211 9 25
  • 24. オブジェクトの定義 2311 9 25
  • 25. 変換ルールの定義 2411 9 25
  • 26. ↓これを証明する 2511 9 25
  • 27. 健全性の証明 これを証明するときに定義の誤りが見 付かる(ことが多い) Serialized obj1 xsに関する帰納法で 証明する 2611 9 25
  • 28. 証明のアウトライン 1.8/16/32/64bits整数を作る 2.オブジェクトと変換ルールを定義する 3.シリアライズ関数、デシリアライズ関 数を定義する 4.OCamlに変換する 2711 9 25
  • 29. 変換ルールは実行不可 変換前後の関係を定義してるだけ 実行できるように関数を定義する 2811 9 25
  • 30. serialize関数 OCamlっぽい!! 2911 9 25
  • 31. deserialize関数 ↑失敗するかも 3011 9 25
  • 32. 関数が変換ルールを満す ことを示す serialize/deserialize関数が変換ルー ルと矛盾しない 3111 9 25
  • 33. 証明のアウトライン 1.8/16/32/64bits整数を作る 2.オブジェクトと変換ルールを定義する 3.シリアライズ関数、デシリアライズ関 数を定義する 4.OCamlに変換する 3211 9 25
  • 34. OCamlへの変換 Coq 8.3からCoqの型とOCamlの型が対応 づくようになった ‣ 例: natとint, optionとoption 3311 9 25
  • 35. まがまがしいコード 3411 9 25
  • 36. 3511 9 25
  • 37. 速度を測ってみた やっぱり速度が気になる 比較対象はRuby版MsgPack 0.4.6 ‣ 拡張ライブラリを使っているので、ほぼC 言語版と速度が同じ 長さnの配列のシリアライズ速度・デシ リアライズ速度を比較 ‣ n = 100,1000,10000 3611 9 25
  • 38. シリアライズ Ruby OCaml 100 1000 10000 0 2.5 5.0 7.5 10.0 12.5 15.011 9 25
  • 39. シリアライズ Ruby OCaml 100 1000 10000 0 2.5 5.0 7.5 10.0 12.5 15.011 9 25
  • 40. デシリアライズ Ruby OCaml 100 1000 10000 0 5 10 15 20 3811 9 25
  • 41. 2011/09/25 ProofSummit2011 結論:ボロ負け11 9 25
  • 42. まとめ MsgPack for OCamlを作りました バグが怖いのでCoqで証明しました ‣ 健全性を証明しました ‣ マルチバイトの扱いで苦労しました 性能はオリジナルの1/10 4011 9 25
  • 43. 今後の課題 性能の向上 やっぱり性能は大事 最適化してもエンバグしてないことが 保証できるし AsciiのExtraction方法を変更すれば性 能を上げれるはず ‣ Erlangっぽくバイナリ列を操作する Bitstringライブラリがよさそう 4111 9 25
  • 44. 今後の課題 RPCのサポート ネットワーク通信の形式化が必要 π計算/ applpiによって定義できる? IDL処理系はMsgPack側で用意されるら しいので、プラグインを作ればOK 4211 9 25

×