Suche senden
Hochladen
CoqによるMsgPackの証明
•
7 gefällt mir
•
2,160 views
Hiroki Mizuno
Folgen
ProofSummit2011 http://partake.in/events/ac41261d-6026-4d09-8814-5ad3e58446e8 における発表
Weniger lesen
Mehr lesen
Technologie
Melden
Teilen
Melden
Teilen
1 von 44
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
xv6から始めるSPIN入門
xv6から始めるSPIN入門
Ryousei Takano
Lockfree Queue
Lockfree Queue
Kumazaki Hiroki
JVM-Reading-ParalleGC
JVM-Reading-ParalleGC
Minoru Nakamura
ループその3
ループその3
TENTO_slide
冬のLock free祭り safe
冬のLock free祭り safe
Kumazaki Hiroki
Jvm reading-synchronization
Jvm reading-synchronization
Minoru Nakamura
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
Taku Miyakawa
Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68
Appresso Engineering Team
Empfohlen
xv6から始めるSPIN入門
xv6から始めるSPIN入門
Ryousei Takano
Lockfree Queue
Lockfree Queue
Kumazaki Hiroki
JVM-Reading-ParalleGC
JVM-Reading-ParalleGC
Minoru Nakamura
ループその3
ループその3
TENTO_slide
冬のLock free祭り safe
冬のLock free祭り safe
Kumazaki Hiroki
Jvm reading-synchronization
Jvm reading-synchronization
Minoru Nakamura
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
Taku Miyakawa
Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68
Appresso Engineering Team
JVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweep
Minoru Nakamura
Effective Java 輪読会 項目71-73
Effective Java 輪読会 項目71-73
Appresso Engineering Team
new Objctive-C literal syntax
new Objctive-C literal syntax
Wataru Kimura
PRML10.6 変分ロジスティック回帰
PRML10.6 変分ロジスティック回帰
Yo Ehara
Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方
Kazuki Ohta
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
Kotlinのlet/run/applyのよもやま話
Kotlinのlet/run/applyのよもやま話
Masaya Yashiro
Rubyでつくるスレッド
Rubyでつくるスレッド
Shugo Maeda
Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法
yhara
非同期処理の基礎
非同期処理の基礎
信之 岩永
6.2 reconciling amortization and persistence
6.2 reconciling amortization and persistence
Hironobu Kinugawa
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
Ransui Iso
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
Iwana Chan
Varnishのログの眺め方
Varnishのログの眺め方
Iwana Chan
20130215 fluentd esper_2
20130215 fluentd esper_2
Ogibayashi
18166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi2009
Muhammad Ali
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
洋史 東平
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
株式会社ランチェスター
SIerアーキテクト視点でみたKotlinの紹介
SIerアーキテクト視点でみたKotlinの紹介
Shinichi Kozake
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
shigeki_ohtsu
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
啓 小笠原
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
keki3
Weitere ähnliche Inhalte
Was ist angesagt?
JVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweep
Minoru Nakamura
Effective Java 輪読会 項目71-73
Effective Java 輪読会 項目71-73
Appresso Engineering Team
new Objctive-C literal syntax
new Objctive-C literal syntax
Wataru Kimura
PRML10.6 変分ロジスティック回帰
PRML10.6 変分ロジスティック回帰
Yo Ehara
Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方
Kazuki Ohta
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
Kotlinのlet/run/applyのよもやま話
Kotlinのlet/run/applyのよもやま話
Masaya Yashiro
Rubyでつくるスレッド
Rubyでつくるスレッド
Shugo Maeda
Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法
yhara
非同期処理の基礎
非同期処理の基礎
信之 岩永
6.2 reconciling amortization and persistence
6.2 reconciling amortization and persistence
Hironobu Kinugawa
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
Ransui Iso
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
Iwana Chan
Varnishのログの眺め方
Varnishのログの眺め方
Iwana Chan
20130215 fluentd esper_2
20130215 fluentd esper_2
Ogibayashi
18166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi2009
Muhammad Ali
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
洋史 東平
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
株式会社ランチェスター
SIerアーキテクト視点でみたKotlinの紹介
SIerアーキテクト視点でみたKotlinの紹介
Shinichi Kozake
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
shigeki_ohtsu
Was ist angesagt?
(20)
JVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweep
Effective Java 輪読会 項目71-73
Effective Java 輪読会 項目71-73
new Objctive-C literal syntax
new Objctive-C literal syntax
PRML10.6 変分ロジスティック回帰
PRML10.6 変分ロジスティック回帰
Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方
C++ マルチスレッド 入門
C++ マルチスレッド 入門
Kotlinのlet/run/applyのよもやま話
Kotlinのlet/run/applyのよもやま話
Rubyでつくるスレッド
Rubyでつくるスレッド
Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法
非同期処理の基礎
非同期処理の基礎
6.2 reconciling amortization and persistence
6.2 reconciling amortization and persistence
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
Varnishのログの眺め方
Varnishのログの眺め方
20130215 fluentd esper_2
20130215 fluentd esper_2
18166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi2009
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
SIerアーキテクト視点でみたKotlinの紹介
SIerアーキテクト視点でみたKotlinの紹介
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
Ähnlich wie CoqによるMsgPackの証明
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
啓 小笠原
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
keki3
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
infinite_loop
BLS署名の実装とその応用
BLS署名の実装とその応用
MITSUNARI Shigeo
Mk network programmability-03
Mk network programmability-03
Miya Kohno
「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態
npsg
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Koichi Sasada
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
Kiyoshi Ogawa
Cobolでもやりたいテスト自動化
Cobolでもやりたいテスト自動化
daisukhayash
about Perl5.10
about Perl5.10
Kazuki KOMORI
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
MITSUNARI Shigeo
Network Programmability and the statefulness/transactionality
Network Programmability and the statefulness/transactionality
Miya Kohno
Mk state in-programming-01
Mk state in-programming-01
Miya Kohno
述語ロックの歴史 r2
述語ロックの歴史 r2
Sho Nakazono
Clojure
Clojure
Uehara Junji
C# design note sep 2014
C# design note sep 2014
信之 岩永
OpenStack + Common Lisp
OpenStack + Common Lisp
irix_jp
本当にあった怖い話し Db編
本当にあった怖い話し Db編
Oda Shinsuke
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
Ryota Watabe
130329 04
130329 04
openrtm
Ähnlich wie CoqによるMsgPackの証明
(20)
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
BLS署名の実装とその応用
BLS署名の実装とその応用
Mk network programmability-03
Mk network programmability-03
「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
Cobolでもやりたいテスト自動化
Cobolでもやりたいテスト自動化
about Perl5.10
about Perl5.10
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
Network Programmability and the statefulness/transactionality
Network Programmability and the statefulness/transactionality
Mk state in-programming-01
Mk state in-programming-01
述語ロックの歴史 r2
述語ロックの歴史 r2
Clojure
Clojure
C# design note sep 2014
C# design note sep 2014
OpenStack + Common Lisp
OpenStack + Common Lisp
本当にあった怖い話し Db編
本当にあった怖い話し Db編
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
130329 04
130329 04
Mehr von Hiroki Mizuno
TypeSafe OSの試み
TypeSafe OSの試み
Hiroki Mizuno
OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法
Hiroki Mizuno
#NGK2012B Excelによる設計書について
#NGK2012B Excelによる設計書について
Hiroki Mizuno
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Hiroki Mizuno
Java基礎
Java基礎
Hiroki Mizuno
Sml#探検隊
Sml#探検隊
Hiroki Mizuno
どこでもCoq
どこでもCoq
Hiroki Mizuno
Coq for Moblie Phone @ ML名古屋
Coq for Moblie Phone @ ML名古屋
Hiroki Mizuno
Darcs紹介@20120423-scmbc
Darcs紹介@20120423-scmbc
Hiroki Mizuno
Gallinaによる証明駆動開発の魅力
Gallinaによる証明駆動開発の魅力
Hiroki Mizuno
「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)
Hiroki Mizuno
20110424 action scriptを使わないflash勉強会
20110424 action scriptを使わないflash勉強会
Hiroki Mizuno
Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Hiroki Mizuno
証明駆動開発のたのしみ@名古屋reject会議
証明駆動開発のたのしみ@名古屋reject会議
Hiroki Mizuno
Coqによる証明駆動開発
Coqによる証明駆動開発
Hiroki Mizuno
NGK忘年会 2010 / CoqからRubyへ
NGK忘年会 2010 / CoqからRubyへ
Hiroki Mizuno
From Coq to Ruby / CoqからRubyへ
From Coq to Ruby / CoqからRubyへ
Hiroki Mizuno
SacalaZa #1
SacalaZa #1
Hiroki Mizuno
CoqUn2010
CoqUn2010
Hiroki Mizuno
OCamlAPISearchの紹介
OCamlAPISearchの紹介
Hiroki Mizuno
Mehr von Hiroki Mizuno
(20)
TypeSafe OSの試み
TypeSafe OSの試み
OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法
#NGK2012B Excelによる設計書について
#NGK2012B Excelによる設計書について
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Java基礎
Java基礎
Sml#探検隊
Sml#探検隊
どこでもCoq
どこでもCoq
Coq for Moblie Phone @ ML名古屋
Coq for Moblie Phone @ ML名古屋
Darcs紹介@20120423-scmbc
Darcs紹介@20120423-scmbc
Gallinaによる証明駆動開発の魅力
Gallinaによる証明駆動開発の魅力
「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)
20110424 action scriptを使わないflash勉強会
20110424 action scriptを使わないflash勉強会
Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Coq to Rubyによる証明駆動開発@名古屋ruby会議02
証明駆動開発のたのしみ@名古屋reject会議
証明駆動開発のたのしみ@名古屋reject会議
Coqによる証明駆動開発
Coqによる証明駆動開発
NGK忘年会 2010 / CoqからRubyへ
NGK忘年会 2010 / CoqからRubyへ
From Coq to Ruby / CoqからRubyへ
From Coq to Ruby / CoqからRubyへ
SacalaZa #1
SacalaZa #1
CoqUn2010
CoqUn2010
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
7.
MsgPackライブラリ一覧
7 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
13.
証明の流れ 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
24.
オブジェクトの定義
23 11 9 25
25.
変換ルールの定義
24 11 9 25
26.
↓これを証明する
25 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
35.
まがまがしいコード
34 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
Jetzt herunterladen