cppcon2016 report and boost.sml
TRANSCRIPT
CppCon2016 参加報告急速に進化する Boost.SML
Takatoshi Kondo
05/03/2023 1
発表内容
05/03/2023 2
• CppCon2016 参加報告• Boost.SML ( msm-lite )
自己紹介
05/03/2023 3
• 近藤 貴俊• ハンドルネーム redboltz• msgpack-c コミッタ– https://github.com/msgpack/msgpack-c
• MQTT の C++ クライアント mqtt_client_cpp 開発– https://github.com/redboltz/mqtt_client_cpp
• MQTT を拡張したスケーラブルなbroker を仕事で開発中
• C++Now(BoostCon) 、 CppCon 2016 など海外カンファレンスに参加、発表
CppCon2016 参加報告
05/03/2023 4
2 大 C++ カンファレンス
05/03/2023 5
• C++Now (旧名 BoostCon )
• CppCon
2 大 C++ カンファレンス
05/03/2023 6
C++Now CppCon
開始年 多分 2007 2014
場所 コロラド州アスペン ワシントン州ベルビュー
キャパシティ
約 200 約 900
開催時期 5 月中旬 9 月下旬開催期間 約 1 週間 約 1 週間参加費用 約 $700 (早期登録 early bi r d 価
格)約 $880 (早期登録 early bird 価格)
日本からの所要時間
約 15 時間( 2 回乗り換え) 約 9 時間(直行)
2 大 C++ カンファレンス
05/03/2023 7
• CppCon2016 に初めて参加– プロによる運営( C++Now はコミュニティ的)– 並行して 5 つくらいのセッション• Keynote は単独開催• 今回はあまり迷わなかった• C++Now では 2 ~ 3 セッション
– 動画の公開が早い!– カメラワークがプロ!– 行くのが楽!– 飯がうまい!
CppCon2016 セッション
05/03/2023 8
• https://www.youtube.com/user/CppCon– Jason Turner
• コモドール 64 と最新 C++ のコンボ– https://www.youtube.com/watch?v=zBkNBP00wJE
• パフォーマンス向上のための practice– https://www.youtube.com/watch?v=uzF4u9KgUWI
– Herb Sutter• pointer like オブジェクトの選択指針
– https://www.youtube.com/watch?v=JfmTagWcqoE
– Nicholas Ormrod• facebook の string
– https://www.youtube.com/watch?v=kPR8h4-qZdk
– David Watson• facebook の folly の経験
– https://www.youtube.com/watch?v=GDxb21kEthM
– 日本人 2 人の LT• https://www.youtube.com/watch?v=rXVg07rtSiI• https://www.youtube.com/watch?v=N1cWgqmWSio
急速に進化する Boost.SML
05/03/2023 9
msm と sml の違い
05/03/2023 10
Boost.MSM ( Meta State Machine )は、コンパイルタイムにステートマシンを構築するライブラリ。https://www.amazon.co.jp/dp/4798120391/
書籍 C++ テンプレートメタプログラミングで紹介された Dave Abrahams のアプローチに基づく。C++03 で使える。
msm と sml の違い
05/03/2023 11
https://boost-experimental.github.io/msm-lite/cppnow-2016/#/
Boost.Experimental.SML (State Machine Lite?) は元々、msm-lite と呼ばれていた。C++Now 2016 で作者の Kris Jusiak により紹介された。C++14 が必要
https://www.youtube.com/watch?v=j0J33BnIjnUhttps://boost-experimental.github.io/msm-lite/cppnow-2016/#/2/40
Simple State Machine
05/03/2023 12
http://melpon.org/wandbox/permlink/rUGxwncK43oxh1lH
Simple
State1entry / on_entryexit / on_exit
Event1
" 状態名 "_s + event< イベントクラス名 > / アクション = 遷移先状態
X は predefined
トリガとなったイベント任意のイベントで
状態に entry / exit
初期状態マーク
InitAction
05/03/2023 13
http://melpon.org/wandbox/permlink/dLABZnhwYYSF40Jk
InitAction
State1entry / on_entryexit / on_exit
Event1
/InitAction
初期遷移によるentry のみに反応
その他の entry に反応
internal / self transition
05/03/2023 14
http://melpon.org/wandbox/permlink/Qg8ClxJeqtzcjvop
Internal and self
State1entry / on_entryexit / on_exitEvent2 / Action2
Event1/Action1
遷移先に自身を記述
遷移先を書かない
junction pseudo state
05/03/2023 15
http://melpon.org/wandbox/permlink/QVSVShg20bB9gWjT
Junction pseudo state
State1
[val == 1]/Action1
Event1(val)
[val == 2]/Action2
Junction pseudo state
State1
Event1(val)[val == 2]/Action2 Event1(val)[val == 1]/Action1
このように分割して記述
ガードは [] で記述。ラムダ式は [[](){}] と書きたいが、[[ が使えないため、 [([ と括弧を追加
if else branch
05/03/2023 16
http://melpon.org/wandbox/permlink/aNHaQ95nE8PAwAZ8
Junction pseudo state
State1
[val == 1]/Action1
Event1(val)
[else]/Action2
評価順序は上から下へ
ガードは [] で記述。ラムダ式は [[](){}] と書きたいが、[[ が使えないため、 [([ と括弧を追加
choice pseudo state
05/03/2023 17
Choice pseudo state
State1
[val == 2]/Val1Branch
Event1/++val
[else]/ElseBranch
val=0
http://melpon.org/wandbox/permlink/djTylkI5aOItxCUX
イベント発生時にアクションも処理され、その結果を次のガードに反映できる
かならず、どれかのガードにマッチするように書かねばならない( UML 的には)
任意のオブジェクトを参照としてぶら下げられる任意のオブジェクトを参照としてぶら下げられる
defer event
05/03/2023 18
http://melpon.org/wandbox/permlink/NxKOXEq65uWT5tVR
Defer event
State1
Event2
Event1/defer
State2
Event1/defer
State3 State4
Event2
Event1
State5
Event1
State6
Event1
遅延
キューイングされる
状態確認
SubMachineState
05/03/2023 19
Sm
State1:Sub State2Event1
Sub
State1 Event2 State2
Event3
http://melpon.org/wandbox/permlink/NfeN0TUiAvdvn33j
サブマシン指定サブマシン指定サブマシン指定サブマシン指定
サブマシンの状態確認
まだサポートされていない要素
05/03/2023 20
Sm
State1:Sub State2:SubEvent1
Sub
State1 Event2 State2
Event3
同じ Sub を複数の state で使う同じ Sub を複数の state で使う
現状では、 notation が無い
ここに state 名をつけられない 。"State1"_s とか。 こっちを state<Sub> にすると区別がつかない
まだサポートされていない要素
05/03/2023 21
Sm
State1:Sub State2
Sub
State1 Event2
現状では、すぐに親の transition が発動してしまう
Sub の終了まで、親の anonymous transition を行わないSub の終了まで、親の anonymous transition を行わない
まだサポートされていない要素
05/03/2023 22
Register finger print
RightScanning:ScanFinger
ScanOnly
Waiting
Start Button Pressed / “Right hand please”
Exit1
LeftScanning:ScanFinger
entry / “Press Start Button”
Completed(result)[result == OK]/ “Register Completed”
Exit1completed(result)[result == NG]/ “Register Failed”
completed(result)[result == NG]/ “Register Failed”
ScanOnlyCompleted(result)[result == OK]/ “Left hand please”
ScanFinger
AliveChecking
Exit1
ScanninngScanSucceeded / ConvertEvent:Completed(OK)
ScanFailed / ConvertEvent:Completed(NG)
ScanOnly
CheckSucceeded
CheckFailed / ConvertEvent:Completed(NG)
entry point pseudo stateexit point pseudo state
その他情報
05/03/2023 23
• ロギングサポート– http://melpon.org/wandbox/permlink/8SKlNUGGt
Kru2r72• マルチスレッドサポート– http://
melpon.org/wandbox/permlink/XmhmVdFOmbNP0xRM
まとめ
05/03/2023 24
• Boost.SML は軽量で、可読性の高いステートマシン表現が可能• sub machine 周辺がまだ実装中• デバッグが比較的容易• マルチスレッド対応