SlideShare ist ein Scribd-Unternehmen logo
1 von 44
Downloaden Sie, um offline zu lesen
2011/09/25 ProofSummit2011
                                             #ProofSummit




                   Coqによる
              MsgPackシリアライザの
                   証明と実装
                  mzp / みずぴー




                      1
11   9   25
自己紹介
              @mzp / みずぴー
              名古屋のSE
              Coq / proof-general派


              ProofCafeに参加してます




                             2
11   9   25
ProofCafe
              開催日: 第4土曜日
              開催場所: どえりゃあカフェ@名古屋
              アダムッチさんのCPDTをみんなで読む
              ‣ そろそろ別のことやるかも
              たまにイベント開催




                       3
11   9   25
2011/09/25 ProofSummit2011




              だいたいこんな感じ
11   9   25
MsgPackを証明した動機
              ネットワーク通信がしたい
               楽をしたいので、既存のライブラリを
               活用したい
               要件
              ‣ ある程度の実績がある
              ‣ 非同期の呼び出しができる
              ‣ いろんな言語のライブラリが充実してる




                          5
11   9   25
MsgPackがよさそう
              オブジェクトのシリアライザ + RPC
              ✓ 高速かつ省サイズ(らしい)
              ✓ 非同期呼び出しもサポート
              ✓ いろんな言語のライブラリがある




                       6
11   9   25
MsgPackライブラリ一覧




                    7
11   9   25
MsgPackライブラリ一覧

              OCaml版がないじゃん
                   → 作ろう




                         7
11   9   25
バグがこわい
              作るのはいいけどバグがこわい
              省サイズ化のため仕様が複雑
              ✗ 実装を間違えてないかな?
              ✗ テストの網羅性が十分かな?
              ✗ この変更しても大丈夫かな?



                         8
11   9   25
証明すればよくね?
              証明すれば...
              ✓ 全入力に対して正しさが保証される
              ✓ 人間が網羅性を考えなくてもOK
              ✓ 変更しても大丈夫かを考えなくても
               OK
              証明したほうが楽!!



                         9
11   9   25
証明した(シリアライザだけ)
                シリアライザ部分のみ
                多言語間のデータやり取りには使える
                RPCは今後の課題



              MsgPack = シリアライザ + RPC + RPC-IDL
                         ↑ ここだけ

                             10
11   9   25
公式レポジトリに入って
                  ます(キリッ
              msgpack/ocaml/proofというディレクト
              リがあるよ




                               ↑ これ

                          11
11   9   25
証明の流れ



11   9   25
Coq使いました
              証明にはCoqを使いました
              ✓ 証明したコードをOCamlに変換できる
              ✓ 日本語の文書も豊富
              ✓ Twitterでいろんな人に訊ける




                       13
11   9   25
開発の流れ




                14
11   9   25
証明のアウトライン
              1.8/16/32/64bits整数を作る
              2.オブジェクトと変換ルールを定義する
              3.シリアライズ関数、デシリアライズ関
                数を定義する
              4.OCamlに変換する




                             15
11   9   25
証明のアウトライン
              1.8/16/32/64bits整数を作る
              2.オブジェクトと変換ルールを定義する
              3.シリアライズ関数、デシリアライズ関
                数を定義する
              4.OCamlに変換する




                             16
11   9   25
8/16/32/64ビット整数
              MsgPackはビットレベルの操作を多用す
              るのでnatだと不便
              標準ライブラリのasciiを組合せて、マ
              ルチバイトの整数を定義する




                       17
11   9   25
natとの変換
              asciiのままだと証明が面倒
              natとasciiの相互変換関数を作る




                       18
11   9   25
巨大なnatが扱えない
              5000以上のnatを使おうとするとオー
              バーフローする
              16ビットすら扱えない (><)




                        19
11   9   25
オーバーフローする理由
              Coqのnat := ペアノ数
              再帰的に定義されている
              値が大きすぎると、ネストが深くなり
              すぎる




                         20
11   9   25
オーバーフローの回避
              巨大な自然数が登場しないようにする
              simplダメ、ゼッタイ
              累乗に関する補題を使う

                      累乗に関する補題
                  n    m        (n+m)
                 2 ⇥2 =2
                                n
                 0  n ならば 0  2
                                  n     m
                 n  m ならば 2  2
                           21
11   9   25
証明のアウトライン
              1.8/16/32/64bits整数を作る
              2.オブジェクトと変換ルールを定義する
              3.シリアライズ関数、デシリアライズ関
                数を定義する
              4.OCamlに変換する




                             22
11   9   25
オブジェクトの定義




                  23
11   9   25
変換ルールの定義




                 24
11   9   25
↓これを証明する




                 25
11   9   25
健全性の証明



              これを証明するときに定義の誤りが見
              付かる(ことが多い)
              Serialized obj1 xsに関する帰納法で
              証明する


                         26
11   9   25
証明のアウトライン
              1.8/16/32/64bits整数を作る
              2.オブジェクトと変換ルールを定義する
              3.シリアライズ関数、デシリアライズ関
                数を定義する
              4.OCamlに変換する




                             27
11   9   25
変換ルールは実行不可




              変換前後の関係を定義してるだけ
              実行できるように関数を定義する

                     28
11   9   25
serialize関数


                        OCamlっぽい!!




                   29
11   9   25
deserialize関数

                         ↑失敗するかも




                    30
11   9   25
関数が変換ルールを満す
                 ことを示す




              serialize/deserialize関数が変換ルー
              ルと矛盾しない

                          31
11   9   25
証明のアウトライン
              1.8/16/32/64bits整数を作る
              2.オブジェクトと変換ルールを定義する
              3.シリアライズ関数、デシリアライズ関
                数を定義する
              4.OCamlに変換する




                             32
11   9   25
OCamlへの変換
              Coq 8.3からCoqの型とOCamlの型が対応
              づくようになった
              ‣ 例: natとint, optionとoption




                             33
11   9   25
まがまがしいコード




                  34
11   9   25
35
11   9   25
速度を測ってみた
              やっぱり速度が気になる
              比較対象はRuby版MsgPack 0.4.6
              ‣ 拡張ライブラリを使っているので、ほぼC
                言語版と速度が同じ
              長さnの配列のシリアライズ速度・デシ
              リアライズ速度を比較
              ‣ n = 100,1000,10000



                               36
11   9   25
シリアライズ
                                            Ruby     OCaml

               100




               1000




              10000


                      0   2.5   5.0   7.5    10.0   12.5     15.0



11   9   25
シリアライズ
                                            Ruby     OCaml

               100




               1000




              10000


                      0   2.5   5.0   7.5    10.0   12.5     15.0



11   9   25
デシリアライズ
                                         Ruby        OCaml

               100




               1000




              10000


                      0    5        10          15           20


                               38
11   9   25
2011/09/25 ProofSummit2011




              結論:ボロ負け
11   9   25
まとめ
              MsgPack for OCamlを作りました
              バグが怖いのでCoqで証明しました
              ‣ 健全性を証明しました
              ‣ マルチバイトの扱いで苦労しました
              性能はオリジナルの1/10




                          40
11   9   25
今後の課題
                   性能の向上
              やっぱり性能は大事
              最適化してもエンバグしてないことが
              保証できるし
              AsciiのExtraction方法を変更すれば性
              能を上げれるはず
              ‣ Erlangっぽくバイナリ列を操作する
                Bitstringライブラリがよさそう



                         41
11   9   25
今後の課題
                 RPCのサポート
              ネットワーク通信の形式化が必要
              π計算/ applpiによって定義できる?
              IDL処理系はMsgPack側で用意されるら
              しいので、プラグインを作ればOK




                        42
11   9   25

Weitere ähnliche Inhalte

Was ist angesagt?

JVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweepJVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweepMinoru Nakamura
 
new Objctive-C literal syntax
new Objctive-C literal syntaxnew Objctive-C literal syntax
new Objctive-C literal syntaxWataru Kimura
 
PRML10.6 変分ロジスティック回帰
PRML10.6 変分ロジスティック回帰PRML10.6 変分ロジスティック回帰
PRML10.6 変分ロジスティック回帰Yo Ehara
 
Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方Kazuki Ohta
 
Kotlinのlet/run/applyのよもやま話
Kotlinのlet/run/applyのよもやま話Kotlinのlet/run/applyのよもやま話
Kotlinのlet/run/applyのよもやま話Masaya Yashiro
 
Rubyでつくるスレッド
RubyでつくるスレッドRubyでつくるスレッド
RubyでつくるスレッドShugo Maeda
 
Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法yhara
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎信之 岩永
 
6.2 reconciling amortization and persistence
6.2 reconciling amortization and persistence6.2 reconciling amortization and persistence
6.2 reconciling amortization and persistenceHironobu Kinugawa
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Ransui Iso
 
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)Iwana Chan
 
Varnishのログの眺め方
Varnishのログの眺め方Varnishのログの眺め方
Varnishのログの眺め方Iwana Chan
 
20130215 fluentd esper_2
20130215 fluentd esper_220130215 fluentd esper_2
20130215 fluentd esper_2Ogibayashi
 
18166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi200918166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi2009Muhammad Ali
 
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)洋史 東平
 
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】株式会社ランチェスター
 
SIerアーキテクト視点でみたKotlinの紹介
SIerアーキテクト視点でみたKotlinの紹介SIerアーキテクト視点でみたKotlinの紹介
SIerアーキテクト視点でみたKotlinの紹介Shinichi Kozake
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するshigeki_ohtsu
 

Was ist angesagt? (20)

JVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweepJVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweep
 
Effective Java 輪読会 項目71-73
Effective Java 輪読会 項目71-73Effective Java 輪読会 項目71-73
Effective Java 輪読会 項目71-73
 
new Objctive-C literal syntax
new Objctive-C literal syntaxnew Objctive-C literal syntax
new Objctive-C literal syntax
 
PRML10.6 変分ロジスティック回帰
PRML10.6 変分ロジスティック回帰PRML10.6 変分ロジスティック回帰
PRML10.6 変分ロジスティック回帰
 
Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
Kotlinのlet/run/applyのよもやま話
Kotlinのlet/run/applyのよもやま話Kotlinのlet/run/applyのよもやま話
Kotlinのlet/run/applyのよもやま話
 
Rubyでつくるスレッド
RubyでつくるスレッドRubyでつくるスレッド
Rubyでつくるスレッド
 
Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
 
6.2 reconciling amortization and persistence
6.2 reconciling amortization and persistence6.2 reconciling amortization and persistence
6.2 reconciling amortization and persistence
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
 
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
 
Varnishのログの眺め方
Varnishのログの眺め方Varnishのログの眺め方
Varnishのログの眺め方
 
20130215 fluentd esper_2
20130215 fluentd esper_220130215 fluentd esper_2
20130215 fluentd esper_2
 
18166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi200918166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi2009
 
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
 
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
 
SIerアーキテクト視点でみたKotlinの紹介
SIerアーキテクト視点でみたKotlinの紹介SIerアーキテクト視点でみたKotlinの紹介
SIerアーキテクト視点でみたKotlinの紹介
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
 

Ähnlich wie CoqによるMsgPackの証明

関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理keki3
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニックinfinite_loop
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用MITSUNARI Shigeo
 
Mk network programmability-03
Mk network programmability-03Mk network programmability-03
Mk network programmability-03Miya Kohno
 
「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態npsg
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようKoichi Sasada
 
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強Kiyoshi Ogawa
 
Cobolでもやりたいテスト自動化
Cobolでもやりたいテスト自動化 Cobolでもやりたいテスト自動化
Cobolでもやりたいテスト自動化 daisukhayash
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mclMITSUNARI Shigeo
 
Network Programmability and the statefulness/transactionality
Network Programmability and the statefulness/transactionalityNetwork Programmability and the statefulness/transactionality
Network Programmability and the statefulness/transactionalityMiya Kohno
 
Mk state in-programming-01
Mk state in-programming-01Mk state in-programming-01
Mk state in-programming-01Miya Kohno
 
述語ロックの歴史 r2
述語ロックの歴史 r2述語ロックの歴史 r2
述語ロックの歴史 r2Sho Nakazono
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014信之 岩永
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lispirix_jp
 
本当にあった怖い話し Db編
本当にあった怖い話し Db編本当にあった怖い話し Db編
本当にあった怖い話し Db編Oda Shinsuke
 
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~Ryota Watabe
 
130329 04
130329 04130329 04
130329 04openrtm
 

Ähnlich wie CoqによるMsgPackの証明 (20)

関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用
 
Mk network programmability-03
Mk network programmability-03Mk network programmability-03
Mk network programmability-03
 
「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
 
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
 
Cobolでもやりたいテスト自動化
Cobolでもやりたいテスト自動化 Cobolでもやりたいテスト自動化
Cobolでもやりたいテスト自動化
 
about Perl5.10
about Perl5.10about Perl5.10
about Perl5.10
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
 
Network Programmability and the statefulness/transactionality
Network Programmability and the statefulness/transactionalityNetwork Programmability and the statefulness/transactionality
Network Programmability and the statefulness/transactionality
 
Mk state in-programming-01
Mk state in-programming-01Mk state in-programming-01
Mk state in-programming-01
 
述語ロックの歴史 r2
述語ロックの歴史 r2述語ロックの歴史 r2
述語ロックの歴史 r2
 
Clojure
ClojureClojure
Clojure
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
 
本当にあった怖い話し Db編
本当にあった怖い話し Db編本当にあった怖い話し Db編
本当にあった怖い話し Db編
 
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
 
130329 04
130329 04130329 04
130329 04
 

Mehr von Hiroki Mizuno

TypeSafe OSの試み
TypeSafe OSの試みTypeSafe OSの試み
TypeSafe OSの試みHiroki Mizuno
 
OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法Hiroki Mizuno
 
#NGK2012B Excelによる設計書について
#NGK2012B Excelによる設計書について#NGK2012B Excelによる設計書について
#NGK2012B Excelによる設計書についてHiroki Mizuno
 
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性についてScala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性についてHiroki Mizuno
 
Coq for Moblie Phone @ ML名古屋
Coq for Moblie Phone @ ML名古屋Coq for Moblie Phone @ ML名古屋
Coq for Moblie Phone @ ML名古屋Hiroki Mizuno
 
Darcs紹介@20120423-scmbc
Darcs紹介@20120423-scmbcDarcs紹介@20120423-scmbc
Darcs紹介@20120423-scmbcHiroki Mizuno
 
Gallinaによる証明駆動開発の魅力
Gallinaによる証明駆動開発の魅力Gallinaによる証明駆動開発の魅力
Gallinaによる証明駆動開発の魅力Hiroki Mizuno
 
「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)Hiroki Mizuno
 
20110424 action scriptを使わないflash勉強会
20110424 action scriptを使わないflash勉強会20110424 action scriptを使わないflash勉強会
20110424 action scriptを使わないflash勉強会Hiroki Mizuno
 
Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Coq to Rubyによる証明駆動開発@名古屋ruby会議02Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Coq to Rubyによる証明駆動開発@名古屋ruby会議02Hiroki Mizuno
 
証明駆動開発のたのしみ@名古屋reject会議
証明駆動開発のたのしみ@名古屋reject会議証明駆動開発のたのしみ@名古屋reject会議
証明駆動開発のたのしみ@名古屋reject会議Hiroki Mizuno
 
Coqによる証明駆動開発
Coqによる証明駆動開発Coqによる証明駆動開発
Coqによる証明駆動開発Hiroki Mizuno
 
NGK忘年会 2010 / CoqからRubyへ
NGK忘年会 2010 / CoqからRubyへNGK忘年会 2010 / CoqからRubyへ
NGK忘年会 2010 / CoqからRubyへHiroki Mizuno
 
From Coq to Ruby / CoqからRubyへ
From Coq to Ruby / CoqからRubyへFrom Coq to Ruby / CoqからRubyへ
From Coq to Ruby / CoqからRubyへHiroki Mizuno
 
OCamlAPISearchの紹介
OCamlAPISearchの紹介OCamlAPISearchの紹介
OCamlAPISearchの紹介Hiroki Mizuno
 

Mehr von Hiroki Mizuno (20)

TypeSafe OSの試み
TypeSafe OSの試みTypeSafe OSの試み
TypeSafe OSの試み
 
OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法
 
#NGK2012B Excelによる設計書について
#NGK2012B Excelによる設計書について#NGK2012B Excelによる設計書について
#NGK2012B Excelによる設計書について
 
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性についてScala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
 
Java基礎
Java基礎Java基礎
Java基礎
 
Sml#探検隊
Sml#探検隊Sml#探検隊
Sml#探検隊
 
どこでもCoq
どこでもCoqどこでもCoq
どこでもCoq
 
Coq for Moblie Phone @ ML名古屋
Coq for Moblie Phone @ ML名古屋Coq for Moblie Phone @ ML名古屋
Coq for Moblie Phone @ ML名古屋
 
Darcs紹介@20120423-scmbc
Darcs紹介@20120423-scmbcDarcs紹介@20120423-scmbc
Darcs紹介@20120423-scmbc
 
Gallinaによる証明駆動開発の魅力
Gallinaによる証明駆動開発の魅力Gallinaによる証明駆動開発の魅力
Gallinaによる証明駆動開発の魅力
 
「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)
 
20110424 action scriptを使わないflash勉強会
20110424 action scriptを使わないflash勉強会20110424 action scriptを使わないflash勉強会
20110424 action scriptを使わないflash勉強会
 
Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Coq to Rubyによる証明駆動開発@名古屋ruby会議02Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Coq to Rubyによる証明駆動開発@名古屋ruby会議02
 
証明駆動開発のたのしみ@名古屋reject会議
証明駆動開発のたのしみ@名古屋reject会議証明駆動開発のたのしみ@名古屋reject会議
証明駆動開発のたのしみ@名古屋reject会議
 
Coqによる証明駆動開発
Coqによる証明駆動開発Coqによる証明駆動開発
Coqによる証明駆動開発
 
NGK忘年会 2010 / CoqからRubyへ
NGK忘年会 2010 / CoqからRubyへNGK忘年会 2010 / CoqからRubyへ
NGK忘年会 2010 / CoqからRubyへ
 
From Coq to Ruby / CoqからRubyへ
From Coq to Ruby / CoqからRubyへFrom Coq to Ruby / CoqからRubyへ
From Coq to Ruby / CoqからRubyへ
 
SacalaZa #1
SacalaZa #1SacalaZa #1
SacalaZa #1
 
CoqUn2010
CoqUn2010CoqUn2010
CoqUn2010
 
OCamlAPISearchの紹介
OCamlAPISearchの紹介OCamlAPISearchの紹介
OCamlAPISearchの紹介
 

CoqによるMsgPackの証明

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