Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
Preferred Networks
3,477 views
Pfi Seminar 2010 1 7
Read more
6
Save
Share
Embed
Embed presentation
Download
Downloaded 43 times
1
/ 60
2
/ 60
3
/ 60
4
/ 60
5
/ 60
6
/ 60
7
/ 60
8
/ 60
9
/ 60
10
/ 60
11
/ 60
12
/ 60
13
/ 60
14
/ 60
15
/ 60
16
/ 60
17
/ 60
18
/ 60
19
/ 60
20
/ 60
21
/ 60
22
/ 60
23
/ 60
24
/ 60
25
/ 60
26
/ 60
27
/ 60
28
/ 60
29
/ 60
30
/ 60
31
/ 60
32
/ 60
33
/ 60
34
/ 60
35
/ 60
36
/ 60
37
/ 60
38
/ 60
39
/ 60
40
/ 60
41
/ 60
42
/ 60
43
/ 60
44
/ 60
45
/ 60
46
/ 60
47
/ 60
48
/ 60
49
/ 60
50
/ 60
51
/ 60
52
/ 60
53
/ 60
54
/ 60
55
/ 60
56
/ 60
57
/ 60
58
/ 60
59
/ 60
60
/ 60
More Related Content
PDF
組み込みでこそC++を使う10の理由
by
kikairoya
PDF
C++コミュニティーの中心でC++をDISる
by
Hideyuki Tanaka
PDF
C++11概要 ライブラリ編
by
egtra
PPTX
Map
by
kikairoya
PDF
ゲーム開発者のための C++11/C++14
by
Ryo Suzuki
PDF
C++ ポインタ ブートキャンプ
by
Kohsuke Yuasa
PDF
不遇の標準ライブラリ - valarray
by
Ryosuke839
PDF
C++ Template Meta Programming の紹介@社内勉強会
by
Akihiko Matuura
組み込みでこそC++を使う10の理由
by
kikairoya
C++コミュニティーの中心でC++をDISる
by
Hideyuki Tanaka
C++11概要 ライブラリ編
by
egtra
Map
by
kikairoya
ゲーム開発者のための C++11/C++14
by
Ryo Suzuki
C++ ポインタ ブートキャンプ
by
Kohsuke Yuasa
不遇の標準ライブラリ - valarray
by
Ryosuke839
C++ Template Meta Programming の紹介@社内勉強会
by
Akihiko Matuura
What's hot
PDF
中3女子が狂える本当に気持ちのいい constexpr
by
Genya Murakami
PDF
クロージャデザインパターン
by
Moriharu Ohzu
PPTX
Visual C++で使えるC++11
by
nekko1119
PPTX
競技プログラミングのためのC++入門
by
natrium11321
PDF
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
by
Hiro H.
PDF
F#入門 ~関数プログラミングとは何か~
by
Nobuhisa Koizumi
PPTX
最新C++事情 C++14-C++20 (2018年10月)
by
Akihiko Matuura
PDF
今から始める Lens/Prism
by
Naoki Aoyama
PDF
Emcpp item31
by
mitsutaka_takeda
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか
by
Yuki Miyatake
PDF
Van laarhoven lens
by
Naoki Aoyama
PDF
闇魔術を触ってみた
by
Satoshi Sato
ODP
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
by
勝成 鈴江
PDF
関数型プログラミング入門 with OCaml
by
Haruka Oikawa
ODP
Real World OCamlを読んでLispと協調してみた
by
blackenedgold
ODP
(define)なしで再帰関数を定義する
by
blackenedgold
PDF
Unity2015_No10_~UGUI&Audio~
by
CHY72
PDF
Emcjp item21
by
MITSUNARI Shigeo
PDF
これからの「言語」の話をしよう ―― 未来を生きるためのツール
by
Nobuhisa Koizumi
PDF
C++入門?
by
tsudaa
中3女子が狂える本当に気持ちのいい constexpr
by
Genya Murakami
クロージャデザインパターン
by
Moriharu Ohzu
Visual C++で使えるC++11
by
nekko1119
競技プログラミングのためのC++入門
by
natrium11321
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
by
Hiro H.
F#入門 ~関数プログラミングとは何か~
by
Nobuhisa Koizumi
最新C++事情 C++14-C++20 (2018年10月)
by
Akihiko Matuura
今から始める Lens/Prism
by
Naoki Aoyama
Emcpp item31
by
mitsutaka_takeda
BoostAsioで可読性を求めるのは間違っているだろうか
by
Yuki Miyatake
Van laarhoven lens
by
Naoki Aoyama
闇魔術を触ってみた
by
Satoshi Sato
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
by
勝成 鈴江
関数型プログラミング入門 with OCaml
by
Haruka Oikawa
Real World OCamlを読んでLispと協調してみた
by
blackenedgold
(define)なしで再帰関数を定義する
by
blackenedgold
Unity2015_No10_~UGUI&Audio~
by
CHY72
Emcjp item21
by
MITSUNARI Shigeo
これからの「言語」の話をしよう ―― 未来を生きるためのツール
by
Nobuhisa Koizumi
C++入門?
by
tsudaa
Viewers also liked
PPTX
IdrisでWebアプリを書く
by
Hideyuki Tanaka
PDF
関数プログラミング入門
by
Hideyuki Tanaka
PPT
C++でHello worldを書いてみた
by
firewood
PDF
できる!並列・並行プログラミング
by
Preferred Networks
PDF
Monad tutorial
by
Hideyuki Tanaka
PPTX
Icfp2009
by
Hideyuki Tanaka
PDF
手書きスライド
by
Hideyuki Tanaka
PDF
Xpath in-lens
by
Hideyuki Tanaka
IdrisでWebアプリを書く
by
Hideyuki Tanaka
関数プログラミング入門
by
Hideyuki Tanaka
C++でHello worldを書いてみた
by
firewood
できる!並列・並行プログラミング
by
Preferred Networks
Monad tutorial
by
Hideyuki Tanaka
Icfp2009
by
Hideyuki Tanaka
手書きスライド
by
Hideyuki Tanaka
Xpath in-lens
by
Hideyuki Tanaka
Similar to Pfi Seminar 2010 1 7
PDF
Continuation with Boost.Context
by
Akira Takahashi
PDF
Boost.Flyweight
by
gintenlabo
PDF
C++14 Overview
by
Akira Takahashi
PDF
Boost Tour 1.50.0 All
by
Akira Takahashi
PDF
C++0x in programming competition
by
yak1ex
PDF
Boost Fusion Library
by
Akira Takahashi
PDF
Processing
by
Akifumi Nambu
PDF
中3女子でもわかる constexpr
by
Genya Murakami
PDF
オブジェクト指向できていますか?
by
Moriharu Ohzu
PDF
Boost Tour 1_58_0 merge
by
Akira Takahashi
PDF
マーク&スイープ勉強会
by
7shi
PPTX
ぱっと見でわかるC++11
by
えぴ 福田
PDF
研究生のためのC++ no.2
by
Tomohiro Namba
PDF
C++ lecture-0
by
sunaemon
PDF
boost tour 1.48.0 all
by
Akira Takahashi
PDF
初めてのSTL
by
HCPC: 北海道大学競技プログラミングサークル
PDF
Boost tour 1_40_0
by
Akira Takahashi
PDF
Boost Tour 1.53.0 merge
by
Akira Takahashi
PDF
最近のC++ @ Sapporo.cpp #5
by
Kohsuke Yuasa
PDF
BNN CAMP vol.3 インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2
by
Atsushi Tadokoro
Continuation with Boost.Context
by
Akira Takahashi
Boost.Flyweight
by
gintenlabo
C++14 Overview
by
Akira Takahashi
Boost Tour 1.50.0 All
by
Akira Takahashi
C++0x in programming competition
by
yak1ex
Boost Fusion Library
by
Akira Takahashi
Processing
by
Akifumi Nambu
中3女子でもわかる constexpr
by
Genya Murakami
オブジェクト指向できていますか?
by
Moriharu Ohzu
Boost Tour 1_58_0 merge
by
Akira Takahashi
マーク&スイープ勉強会
by
7shi
ぱっと見でわかるC++11
by
えぴ 福田
研究生のためのC++ no.2
by
Tomohiro Namba
C++ lecture-0
by
sunaemon
boost tour 1.48.0 all
by
Akira Takahashi
初めてのSTL
by
HCPC: 北海道大学競技プログラミングサークル
Boost tour 1_40_0
by
Akira Takahashi
Boost Tour 1.53.0 merge
by
Akira Takahashi
最近のC++ @ Sapporo.cpp #5
by
Kohsuke Yuasa
BNN CAMP vol.3 インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2
by
Atsushi Tadokoro
More from Preferred Networks
PDF
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
by
Preferred Networks
PDF
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
by
Preferred Networks
PDF
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
by
Preferred Networks
PDF
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
by
Preferred Networks
PDF
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
by
Preferred Networks
PDF
PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57
by
Preferred Networks
PDF
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
by
Preferred Networks
PDF
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
by
Preferred Networks
PDF
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
by
Preferred Networks
PDF
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
by
Preferred Networks
PDF
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
by
Preferred Networks
PDF
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
by
Preferred Networks
PDF
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
by
Preferred Networks
PDF
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
by
Preferred Networks
PDF
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
by
Preferred Networks
PPTX
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
by
Preferred Networks
PDF
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
by
Preferred Networks
PDF
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
by
Preferred Networks
PPTX
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
by
Preferred Networks
PDF
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
by
Preferred Networks
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
by
Preferred Networks
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
by
Preferred Networks
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
by
Preferred Networks
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
by
Preferred Networks
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
by
Preferred Networks
PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57
by
Preferred Networks
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
by
Preferred Networks
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
by
Preferred Networks
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
by
Preferred Networks
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
by
Preferred Networks
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
by
Preferred Networks
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
by
Preferred Networks
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
by
Preferred Networks
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
by
Preferred Networks
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
by
Preferred Networks
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
by
Preferred Networks
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
by
Preferred Networks
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
by
Preferred Networks
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
by
Preferred Networks
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
by
Preferred Networks
Pfi Seminar 2010 1 7
3.
Caution!
本発表には次のものは含まれません C++の有用なプログラミング技法 広くつかわれるべきテクニック その他なにか視聴者に役立つもの そういうのを期待された方はあしからず
4.
自己紹介 田中英行 (@tanakh,
id:tanakh) Haskell愛好家 C++歴 1998年 ~ 2005年ぐらいまでは漫然と使っていました 社内用C++ライブラリ(pficommon)を作成 C++のきもさを再認識 その辺で得られた知見を話します ○ ※実際に使われているわけではないです
5.
pficommon Boostの広く利用できる部分(tr1) データ構造いろいろ
サーバー書く向け機能 マルチスレッド 各種プロトコル RPC ウェブアプリ向け機能 DSL
6.
本日の内容 ユーザー定義構文 Serializable万能説
Stream Fusion の三本立て
8.
概要
C++の構文のように扱える構文を 定義してみようとすると、 それがどういう意味を持つのだろうか、 というお話
9.
ユーザー定義構文 ユーザー定義する組み込み構文のように
扱えるもの 例えば synchronized (Java) using (C#) actor (Scala) のようなものがC++でも書けると嬉しい ですね
10.
ほかの言語の例
Lisp マクロ・高階関数 Haskell 高階関数・モナドを引数にとる関数 Ruby ブロックをとる関数 Scala 最後の引数にラムダ式をとる関数を書くと それっぽく見える
11.
例:foreach (for-each (lambda (x)
forM_ [1..5] $ ¥x -> (display x) print x ‘(1 2 3 4 5)) (1..5).each{|x| List(1,2,3,4,5).foreach{ x => p x println(x) } }
12.
C++でのユーザー定義構文(1)
statementを引数に取るマクロを書き、 組み込みの構文要素に置換する #define foreach(v, c, s) ¥ for(typeof(c.begin()) it=c.begin(); it!=c.end(); it++){ ¥ v = *it; ¥ s ¥ } … vector<int> v; v.push_back(1); … foreach(int x, v, { cout<<x<<endl; })
13.
問題点
簡単に書けて、扱いやすいが、 かっこ悪い foreach(, , {}) ↑ 括弧の中に{}があるのが耐えられない }) って… foreach(int x, v) { cout<<x<<endl; } のように書きたい
14.
C++でのユーザー定義構文(2)
statementが後ろに来て整合性が取れる ようなマクロを書く #define foreach(v, c) ¥ for (bool b=true; b; ) ¥ for (v; b; b=false) ¥ for(typeof(c.begin()) it=c.begin(); it!=c.end() && (v=*it, true); it++) … vector<int> v; v.push_back(1); … foreach(int x, v){ cout<<x<<endl; }
15.
C++でのユーザー定義構文(2) この書き方は美しいが、
記述力を制限される 既存の制御構文の後ろに文を置けるだけ
16.
後処理
synchronized(v){ … } のようなことを実 現するには、{ … } の後に処理をさせな ければならない
17.
forを使う方法 後続の文より後に処理をさせる方法 forを使う
#define synchronized(v) ¥ for (bool b=true; ¥ b && (v.lock(), true); ¥ b=false, v.unlock()) #define synchronized(v) ¥ for (bool b=true; b; ) ¥ for (scoped_lock lk(v); b; b=false) break, continueが食われてしまう
18.
ifを使う方法
ifの中で変数を宣言すれば、 後続の文の後にデストラクタを動かせる #define synchronized(v) ¥ if (scoped_lock lk=scoped_lock(v))
19.
ifを使う方法(2) コピー可能なクラスを定義する trueを返すoperator
bool() を定義する デストラクタを定義する class hoge { … }; if (hoge h=hoge()) stat; 処理の流れ hoge::hoge() hoge::operator bool() stat hoge::~hoge()
20.
改良
operator bool() はfalseを返したほうがいい #define synchronized(v) ¥ if (scoped_lock lk=scoped_lock(v)); ¥ else
21.
活用例:CGI DSL class
my_cgi : public cgi{ public: void run(){ html__{ head__{ title__{ text__("タイトル"); } } body__{ a__{ href__ = "http://kzk9.net/blog/"; text__("super blog!"); } br__; } } } };
22.
議論 hoge(…){ …
} の形で、 前処理→処理→後処理 の形のユーザー 定義構文が書けることが分かった だがそれだけだろうか? こういうことができるということは、 つまりどういうことなのだろうか
23.
見えざる継続
継続とは ある計算過程のある瞬間における、その過 程の未来全体を表すもの、あるいは計算過 程の実行スナップショットと説明される。 (Wikipedia) Schemeなどでは言語レベルでサポート 継続は、実行中のどんな計算機プログラ ムにも存在する
24.
関数呼び出しと継続 関数呼び出しとはすなわち、継続をとも
なう手続きへのジャンプ 関数が呼ばれた= 関数から返った後の継続が手に入る int foo(){ return 1; } foo()が呼ばれる際に渡される継続 ・返された値に2を書けて void bar() ・それを表示する { cout<<foo()*2<<endl; 実際のところC++では、 } ・スタック ・リターンアドレス の対として表現される
25.
ユーザー定義構文では
hoge::operator bool() が呼ばれた瞬間の 継続に注目する class hoge { … }; if (hoge h=hoge()) stat; 処理の流れ hoge::hoge() hoge::operator bool() ← trueを返せば stat → hoge::~hoge() → … stat falseを返せば hoge::~hoge() → … hoge::~hoge() なる継続
26.
継続を取り出す
callee save レジスタ、スタック、リター ンアドレスを取り出す cont get_ret_cont(){ regs=get_callee_save_regs(); stack=get_stack(); ret=get_ret_addr(); return (regs, stack, ret); }
27.
継続が取り出せるなら
operator bool()にて、継続を取り出し、 さらに文実行後の継続を設定し、stat後 の処理の流れを決められる hoge::operator bool() { cont c=get_ret_cont(); next=…; c(true); } hoge::~hoge() { next(); }
28.
文を後ろに置く=継続を渡す つまるところ、if (hoge
h=hoge()) { … } は 後ろの文を引数に関数を呼び出しているの と同じである Schemeの高階関数や、Rubyのブロック構 文と同じことができる
29.
例:スレッド
thread{ … } でスレッドを立てる 後続の文が終了するとスレッド終了 mutex m; int n; int main() { thread{ for (int i=0; i<10; i++) synchronized(m) n++; } for (int i=0; i<10; i++) synchronized(m) n--; }
30.
実装 class thread_forker{ …
}; thread_forker::operator bool(){ cont c=get_ret_cont(); pthread_create(&tid, NULL, bind(apply_cont, c, true)); c(false); } thread_forker::~thread_forker(){ pthread_exit(NULL); }
31.
別スレッドでの継続の起動 スタックを別のスタックにコピーする ポインタの張り替えなどめんどい
ret ret ret frame frame frame ret ret ret frame frame frame
32.
まとめ C++でユーザー定義構文は意外ときれい
に作れるんじゃなかろうか ポータブルな実装ができるかどうか
34.
概要 シリアライザというものがあります シリアライザが意外と色々なところに使
えるという話
35.
シリアライザとは データをバイト列に変換したり(シリアラ
イズ)、バイト列からデータに変換したり (デシリアライズ)するもの クラスやコンテナの内容をファイルに保存 したり、ネットワーク越しに転送したりす るのにとても便利
36.
boost::serialization
Boostに入っているシリアライズライブ ラリ class hoge{ private: string a; vector<int> b; friend class boost::serialization::access; template <class Archive> void serialize(Archive &ar){ ar & a & b; } };
37.
boost::serializationの特徴 シリアライズとデシリアライズを
共通のコードで記述 テンプレートでディスパッチ hoge h; text_oarchive oa(cout); oa << h; // text_oarchiveを引数にserializeが呼ばれる hoge g; text_iarchive ia(cin); ia >> h; // text_iarchiveを引数にserializeが呼ばれる
38.
仕組み
serialize()関数をオーバーロード template <class Archive> Archive &operator &(Archive &ar, T &v){ serialize(ar, v); return ar; } void serialize(text_iarchive &ar, int n){ ar.read_int(n); } void serialize(text_oarchive &ar, int n){ ar.write_int(n); }
39.
シリアライズするというのはどうい うことか?
クラスのシリアライズ メンバの列挙 コンテナのシリアライズ データの列挙
40.
テンプレートでのシリアライズ serializeがテンプレートメンバ関数 シリアライズ・デシリアライズを
共通化 色々なシリアライザ(text, binary)に適用 可能 拡張可能 → シリアライザじゃなくてもいいので は?
41.
型を書きだす
データの代わりに、型を書きだしてみる class type_oarchive{ … }; template <class T> void serialize(type_oarchive &oa, T &v){ // デフォルト oa.enter_struct(); serialize(oa, v); oa.leave_struct(); } void serialize(type_oarchive &oa, int &n){ // 特殊化 oa.add(new int_type(true, sizeof(int))); } …
42.
型を書きだす(2)
コンテナ型は特殊化する template <class T> void serialize(type_oarchive &oa, vector<T> &v){ oa.add(new array_type(get_type<T>()); } template <class K, class V> void serialize(type_oarchive &oa, map<K, V> &v){ oa.add(new map_type(get_type<K>(), get_type<V>()); }
43.
型を書きだす(3)
型情報取得関数 template <class T> type_info *get_type() { T v; type_oarchive oa; oa << v; return oa.get(); }
44.
Serializable = Reflectable
値の代わりに型を書きだすことにより、 Serializableなクラスは(部分的には) Reflectableなクラスとなる Reflectableなクラスは明らかに Serializableに出来るのでこれはそう おかしな話ではない つまり、(部分的には)Serializableと Reflectableは等価である
45.
応用例:RPC // シグニチャ RPC_PROC(add, int(int,
int)) // メソッド定義 RPC_GEN(calc, add) // クラス定義 // サーバ // クライアント int add(int x, int y){ return x+y; } hoge_client cli(“localhost”, 12345); int main(){ cout<<cli.call_add(1,2)<<endl; hoge_server serv; // ↑ 3が返ってくるはず serv.set_add(&add); serv.serv(12345, 10); }
46.
RPC説明 適当に関数のシグニチャを定義して、
それに合う関数をセットする 関数の引数、返り値はソケットでやり取 りされる → シリアライズ可能でなけれ ばならない
47.
RPC:クライアントコード生成
言語bindingを自動で生成 C++ソースを読み込む パーズするのは大変すぎる g++にやらせる リフレクションする RPCの型情報が取れる 好きなコード生成できる RPCでやり取りするデータはすべてSerializable でなければならないはずなので、すべて何もし なくてもリフレクション出来るはずである for
48.
RPC:テスト生成
おなじ原理でRPCテスト用のWebサー バーをC++コードから自動で生成
49.
まとめ
Serializableなデータ構造は思ったより 有用だ
51.
概要
ストリームを扱う計算が テンプレートで速くなるという話
52.
ストリーム
(ここでは)何かデータの列 配列とか 外部メモリ上のデータとか ストリームに対する演算 map filter fold sort merge など…
53.
例
ストリームに対する演算の繰り返し vector<int> v, w, x; for (int i=0; i<100; i++) v.push_back(i); remove_copy_if(v.begin(), v.end(), back_inserter(w), is_even()); transform(w.begin(), w.end(), back_inserter(x), div2()); 中間配列ができる 配列を二回なめる 外部メモリを扱う時に特に顕著 for
54.
1パスでやるには
一か所に書けばいい vector<int> v, x; for (int i=0; i<100; i++) v.push_back(i); for (int i=0; i<v.size(); i++) if (v[i]%2==0) x.push_back(v[i]/2); モジュラリティが低い さっきのように書いて、こうなってほしい
55.
遅延ストリーム
それぞれの処理で一気に配列を舐めるのが いけない → 遅延させてやればいい template <class T> class stream{ … }; template <class S, class F> class filter_stream{ public: typedef S::elem_type elem_type; filter_stream(S &s, F f=F()): s(s), f(f) {} elem_type get(){ for (;;){ elem_type r=s.get(); if (f(r)) return r; } } };
56.
遅延ストリーム(2) template <class
S, class F> class map_stream{ public: typedef S::elem_type elem_type; map_stream(S &s, F f=F()): s(s), f(f) {} elem_type get(){ elem_type r=s.get(); return f(r); } }; stream<int> s; filter_stream<typeof(s), is_even> t(s); map_stream<typeof(t), div2> u(t); while(!u.empty()) cout<<u.get()<<endl;
57.
インライン化 テンプレートで書かれているので
インライン化できる 1パスでできる stream<int> s; filter_stream<typeof(s), is_even> t(s); map_stream<typeof(t), div2> u(t); u.get(); // => r=t.get(); return div2(r); // => int r; for (;;){ r=s.get(); if (!is_even(r)) break; } // return div2(r);
58.
yieldとの対比
C#でのyield class FilterStream{ public FilterStream( … ) { … } public IEnumerator<int> GetEnumerator(){ foreach (int t in s) if (!f(t)) yield return i; } … ループを回すだけのようなことなら 同じようにできる
59.
コルーチン=遅延評価 yield=コルーチンで遅延評価はできる 遅延評価でyieldのようなこともできる
列挙のようなときにはうまくいく
60.
まとめ
C++の謎テクをいくつか紹介 ブロック=継続 Serializable=Reflectable コルーチン=遅延評価 pficommon近日リリース予定
Download