2011/09/25 ProofSummit2011                                             #ProofSummit                   Coqによる              ...
自己紹介              @mzp / みずぴー              名古屋のSE              Coq / proof-general派              ProofCafeに参加してます         ...
ProofCafe              開催日: 第4土曜日              開催場所: どえりゃあカフェ@名古屋              アダムッチさんのCPDTをみんなで読む              ‣ そろそろ別のこと...
2011/09/25 ProofSummit2011              だいたいこんな感じ11   9   25
MsgPackを証明した動機              ネットワーク通信がしたい               楽をしたいので、既存のライブラリを               活用したい               要件             ...
MsgPackがよさそう              オブジェクトのシリアライザ + RPC              ✓ 高速かつ省サイズ(らしい)              ✓ 非同期呼び出しもサポート              ✓ いろんな...
MsgPackライブラリ一覧                    711   9   25
MsgPackライブラリ一覧              OCaml版がないじゃん                   → 作ろう                         711   9   25
バグがこわい              作るのはいいけどバグがこわい              省サイズ化のため仕様が複雑              ✗ 実装を間違えてないかな?              ✗ テストの網羅性が十分かな?    ...
証明すればよくね?              証明すれば...              ✓ 全入力に対して正しさが保証される              ✓ 人間が網羅性を考えなくてもOK              ✓ 変更しても大丈夫かを考え...
証明した(シリアライザだけ)                シリアライザ部分のみ                多言語間のデータやり取りには使える                RPCは今後の課題              MsgPack = ...
公式レポジトリに入って                  ます(キリッ              msgpack/ocaml/proofというディレクト              リがあるよ                           ...
証明の流れ11   9   25
Coq使いました              証明にはCoqを使いました              ✓ 証明したコードをOCamlに変換できる              ✓ 日本語の文書も豊富              ✓ Twitterでいろん...
開発の流れ                1411   9   25
証明のアウトライン              1.8/16/32/64bits整数を作る              2.オブジェクトと変換ルールを定義する              3.シリアライズ関数、デシリアライズ関            ...
証明のアウトライン              1.8/16/32/64bits整数を作る              2.オブジェクトと変換ルールを定義する              3.シリアライズ関数、デシリアライズ関            ...
8/16/32/64ビット整数              MsgPackはビットレベルの操作を多用す              るのでnatだと不便              標準ライブラリのasciiを組合せて、マ              ...
natとの変換              asciiのままだと証明が面倒              natとasciiの相互変換関数を作る                       1811   9   25
巨大なnatが扱えない              5000以上のnatを使おうとするとオー              バーフローする              16ビットすら扱えない (><)                        19...
オーバーフローする理由              Coqのnat := ペアノ数              再帰的に定義されている              値が大きすぎると、ネストが深くなり              すぎる         ...
オーバーフローの回避              巨大な自然数が登場しないようにする              simplダメ、ゼッタイ              累乗に関する補題を使う                      累乗に関する補題...
証明のアウトライン              1.8/16/32/64bits整数を作る              2.オブジェクトと変換ルールを定義する              3.シリアライズ関数、デシリアライズ関            ...
オブジェクトの定義                  2311   9   25
変換ルールの定義                 2411   9   25
↓これを証明する                 2511   9   25
健全性の証明              これを証明するときに定義の誤りが見              付かる(ことが多い)              Serialized obj1 xsに関する帰納法で              証明する   ...
証明のアウトライン              1.8/16/32/64bits整数を作る              2.オブジェクトと変換ルールを定義する              3.シリアライズ関数、デシリアライズ関            ...
変換ルールは実行不可              変換前後の関係を定義してるだけ              実行できるように関数を定義する                     2811   9   25
serialize関数                        OCamlっぽい!!                   2911   9   25
deserialize関数                         ↑失敗するかも                    3011   9   25
関数が変換ルールを満す                 ことを示す              serialize/deserialize関数が変換ルー              ルと矛盾しない                          ...
証明のアウトライン              1.8/16/32/64bits整数を作る              2.オブジェクトと変換ルールを定義する              3.シリアライズ関数、デシリアライズ関            ...
OCamlへの変換              Coq 8.3からCoqの型とOCamlの型が対応              づくようになった              ‣ 例: natとint, optionとoption           ...
まがまがしいコード                  3411   9   25
3511   9   25
速度を測ってみた              やっぱり速度が気になる              比較対象はRuby版MsgPack 0.4.6              ‣ 拡張ライブラリを使っているので、ほぼC                言...
シリアライズ                                            Ruby     OCaml               100               1000              10000  ...
シリアライズ                                            Ruby     OCaml               100               1000              10000  ...
デシリアライズ                                         Ruby        OCaml               100               1000              10000 ...
2011/09/25 ProofSummit2011              結論:ボロ負け11   9   25
まとめ              MsgPack for OCamlを作りました              バグが怖いのでCoqで証明しました              ‣ 健全性を証明しました              ‣ マルチバイトの扱い...
今後の課題                   性能の向上              やっぱり性能は大事              最適化してもエンバグしてないことが              保証できるし              Ascii...
今後の課題                 RPCのサポート              ネットワーク通信の形式化が必要              π計算/ applpiによって定義できる?              IDL処理系はMsgPack...
Upcoming SlideShare
Loading in …5
×

CoqによるMsgPackの証明

5,638 views

Published on

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

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

No Downloads
Views
Total views
5,638
On SlideShare
0
From Embeds
0
Number of Embeds
2,520
Actions
Shares
0
Downloads
18
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

CoqによるMsgPackの証明

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

×