スライド 1

Similar documents
とても使いやすい Boost の serialization

PowerPoint プレゼンテーション

このルールをそのまま正規表現として書くと 下記のようになります ^A[0-9]{2}00[0-9]{3}([0-9]{2})?$ ちょっと難しく見えるかもしれませんが 下記のような対応になっています 最初 固定 年度 固定 通番 ( 枝番 ) 最後 ルール "A" 数字 2 桁 0 を 2 桁 数字

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

第12回 モナドパーサ

JavaプログラミングⅠ

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

ソフトウェア基礎 Ⅰ Report#2 提出日 : 2009 年 8 月 11 日 所属 : 工学部情報工学科 学籍番号 : K 氏名 : 當銘孔太

Slide 1

PowerPoint Presentation

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

文字列操作と正規表現

Microsoft PowerPoint - 12.ppt [互換モード]

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

8 / 0 1 i++ i 1 i-- i C !!! C 2

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Prog2_12th

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

ソフトゼミC 第二回 C++の基礎

Microsoft Word - C言語研修 C++編 3.doc

文法と言語 ー文脈自由文法とLR構文解析2ー

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

メソッドのまとめ

Microsoft PowerPoint - ep_cpp04.ppt

PowerPoint プレゼンテーション

Boost.Preprocessor でプログラミングしましょう DigitalGhost

Microsoft PowerPoint - 08LR-conflicts.ppt [互換モード]

Microsoft Word - Javacc.docx

概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要.

PowerPoint プレゼンテーション

Java講座

基礎計算機演習 実習課題No6

Microsoft PowerPoint - class2-OperatorOverLoad.pptx

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

Javaプログラムの実行手順

4-3- 基 C++ に関する知識 オープンソースシステムのソースを解読する上で C++ の知識は必須であるといえる 本カリキュラムでは まずオブジェクト指向に関する Ⅰ. 概要理解を深め クラスの扱い方について学習し STL を使用してアルゴリズムとデータ構造を実装する方法を学習する Ⅱ. 対象専

基礎プログラミング2015

Prog1_10th

Microsoft PowerPoint - C++_第1回.pptx

PowerPoint プレゼンテーション

JavaプログラミングⅠ

Microsoft PowerPoint - 12.ppt [互換モード]

オブジェクト指向プログラミング・同演習 5月21日演習課題

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

プログラミング入門1

スライド 1


PowerPoint プレゼンテーション

プログラミング基礎I(再)

プログラミング実習I

02: 変数と標準入出力

プログラミング言語処理系論 (4) Design and Implementation of Programming Language Processors

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 条件判断文 3 switch 文 switch 文式が case の値と一致した場合 そこから直後の break; までを処理し どれにも一致しない場合 default; から直後の break; までを処理する 但し 式や値 1

Microsoft PowerPoint - 13.ppt [互換モード]

2 概要 市場で不具合が発生にした時 修正箇所は正常に動作するようにしたけど将来のことを考えるとメンテナンス性を向上させたいと考えた リファクタリングを実施して改善しようと考えた レガシーコードなのでどこから手をつけて良いものかわからない メトリクスを使ってリファクタリング対象を自動抽出する仕組みを

Microsoft PowerPoint - kougi9.ppt

PowerPoint プレゼンテーション

Prog1_2nd

プログラミング入門1

講習No.12

Method(C 言語では関数と呼ぶ ) メソッドを使うと 処理を纏めて管理することができる 処理 ( メソッド ) の再実行 ( 再利用 ) が簡単にできる y 元々はC 言語の関数であり 入力値に対する値を 定義するもの 数学では F(x) = 2x + 1 など F(x)=2x+1 入力値 (

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

IronPython による柔軟なゲーム開発 筑波大学 AmusementCreators

Microsoft PowerPoint - CproNt02.ppt [互換モード]

PowerPoint Template

Microsoft PowerPoint pptx

関数の動作 / printhw(); 7 printf(" n"); printhw(); printf("############ n"); 4 printhw(); 5 関数の作り方 ( 関数名 ) 戻り値 ( 後述 ) void である. 関数名 (

Prog1_6th

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

PowerPoint プレゼンテーション

Microsoft PowerPoint - 04.pptx

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

PowerPoint プレゼンテーション

02: 変数と標準入出力

program7app.ppt

Microsoft Word - no15.docx

POSIXスレッド

デジタル表現論・第6回

JavaプログラミングⅠ

02: 変数と標準入出力

Prog1_6th

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

Microsoft Word - 3new.doc

PowerPoint プレゼンテーション

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

Microsoft PowerPoint - 3.ppt [互換モード]

Microsoft PowerPoint - handout07.ppt [互換モード]

二分木の実装

プログラミング実習I

Microsoft PowerPoint - 03BNFScanner.ppt [互換モード]

Microsoft PowerPoint - prog03.ppt

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

* ライブラリ関数 islower(),toupper() を使ったプログラム 1 /* 2 Program : trupper.c 3 Student-ID : K 4 Author : TOUME, Kouta 5 Comments : Used Library function i

Prog1_3rd

Microsoft Word - no202.docx

Javaによるアルゴリズムとデータ構造

デザインパターン第一章「生成《

Microsoft PowerPoint - prog04.ppt

Transcription:

Boost とその実装技術 ~Boost の薄い話から濃い話まで ~

自己紹介 C++ スキー Boost スキー D&E 未読 猫スキー 吉田秀彦モドキ

アジェンダ Boost について Boost.SharedPtr Boost.SharedPtr の実装技術 Boost.Spirit Boost.Spirit の実装技術

Boost について Boost とは Wikipedia C++ の先駆的な開発者のコミュニティ 及びそのコミュニティによって公開されているオープンソースライブラリのこと 便利な C++ のライブラリ Boost の一部が C++0x に入る

Boost.SharedPtr

Boost.SharedPtr とは Boost.SharedPtr インスタンスの所有権を共有したポインタ誰も所有しなくなれば自動的に解放される { boost::shared_ptr<hoge> p(new Hoge); { boost::shared_ptr<hoge> p2(new Hoge); p = p2;

Boost.SharedPtr インスタンスが所有されている限り解放されない 誰がインスタンスを所有しているか気にする必要が無い 責任を明確にしなくて良い 上手に使えばリソースリークが無くなる

内部実装

Boost.SharedPtr 内部でインスタンスの参照数をカウントしている 参照数が 0 になったら解放 コピーするたびに参照数を増やす デストラクタが呼ばれるたびに参照数を減らす

Boost.SharedPtr template<class T> class shared_ptr { T* p_; int* count_; void release() { if (--*count_ == 0) { delete p_; delete count_; public: explicit shared_ptr(t* p) : p_(p), count_(new int(1)) { shared_ptr<t>& operator=(const shared_ptr<t>& s) { release(); p_ = s.p_; count_ = s.count_; ++*count_; return *this; ~shared_ptr() { release(); ;

delete p_; Boost.SharedPtr デフォルトでは delete で解放される 自作のアロケータでも対応可能 Hoge* AllocHoge(); void DeallocHoge(Hoge* p); struct HogeDeleter { void operator()(hoge* p) { DeallocateHoge(p); ; { boost::shared_ptr<hoge> hoge(allochoge(), DeallocHoge); boost::shared_ptr<hoge> hoge2(allochoge(), HogeDeleter());

Boost.SharedPtr template<class T> class shared_ptr { T* p_; Deleter d_; public: template<class Deleter> shared_ptr(t* p, Deleter d) : p_(p), d_(d) { ~shared_ptr() { d_(p_); ; Deleter をメンバに持てないので不可 Type Erasure

Boost.SharedPtr struct placeholder { virtual ~placeholder() { virtual void destroy() = 0; ; template<class T, class Deleter> struct holder : public placeholder { T* p_; Deleter d_; holder(t* p, Deleter d) : p_(p), d_(d) { virtual void destroy() { d_(p_); ; Hoge* p; HogeDeleter d; placeholder* holder( new holder<hoge, HogeDeleter>(p, d));... holder->destroy();

Boost.SharedPtr template<class T> class shared_ptr { T* p_; int* count_; placeholder* holder_; public: template<class Deleter> shared_ptr(t* p, Deleter d) : p_(p), count_(new int(1)), holder_(new holder<t, Deleter>(p, d)) {... ~shared_ptr() { if (--*count_ == 0) { holder_->destroy(); delete holder_; delete count_; ;

Boost.SharedPtr Boost.SharedPtr まとめ 参照カウント方式 コピーコンストラクタ 代入演算子やデストラクタを使ってカウントしている 任意の削除方法を指定可能 Type Erasure という技法を使っている Boost.SharedPtr おまけ boost::shared_ptr 同士のキャストが可能 ポインタと同程度にスレッドセーフ 例外安全の保証

Boost.Spirit

Boost.Spirit とは Boost.Spirit C++ で書くことのできる構文解析器 構文解析とは Wikipedia ある文章の文法的な関係を説明すること k.inaba プログラミング言語や設定ファイルなどの構造を持ったテキストデータを ただの文字列として与えられた状態から 言語の文法などにしたがって構造を取り出す作業 (Boost C++ Libraries 第 2 版より引用 )

文法 例 )XML タグの文法 Boost.Spirit <tag attr1="value" attr2="value" > (1) 最初に '<' が来る必要がある (2) その次にタグ名が来る必要がある (3) 次に [ 空白属性 ] というパターンが0 回以上連続する (4) 次には空白があっても無くても良くて (5) 最後は '>' で終わる という感じで定義されている こういう規則のことを文法という

文法の表現方法日本語 Boost.Spirit a の次に B が続き その次は d になる ただし B は b または b の次に c が続くという意味である BNF <rule> ::= a<b>d <B> ::= b bc 正規右辺文法 ( 正規表現 ) a(b (bc))d Boost.Spirit rule = ch_p('a') >> B >> 'd'; B = ch_p('b') (ch_p('b') >> 'c');

デモ

内部実装

Boost.Spirit 式の構造を記憶している ch_p('a') >> B a と B が >> で繋がれたことを覚えている a の次に B が来るかどうか という解析が出来る ch_p('a') B a と B が で繋がれたことを覚えている a になるか B になるか という解析ができる B = ch_p('b') (ch_p('b') >> 'c'); B も式になっている 再帰的な構造になっている

Boost.Spirit 再帰的な構造をクラスで定義するパターン Composite パターン 代表的な例 ディレクトリ構造

Boost.Spirit class parser { virtual bool parse(input in) = 0; ; parser* rule; parser* B; rule = ch_p('a') >> B >> ch_p('d'); B = ch_p('b') (ch_p('b') >> ch_p('c')); bool result = rule->parse(input("abcd"));

Boost.Spirit class chlit : public parser { char c_; public: chlit(char c) : c_(c) { virtual bool parse(input in) { returm in.read() == c_; ; parser* ch_p(char c) { return new chlit(c);

Boost.Spirit class sequence : public parser { parser* left_; parser* right_; public: sequence(parser* l, parser* r) : left_(l), right_(r) { virtual bool parse(input in) { if (!left_->parse(in)) return false; if (!right_->parse(in)) return false; return true; ; parser* operator>>(parser* left, parser* right) { return new sequence(left, right);

Boost.Spirit class alternative : public parser { virtual bool parse(input in) { Input save(in); if (l_->parse(in)) return true; in = save; if (r_->parse(in)) return true; return false; ; parser* operator (parser* left, parser* right) { return new alternative(left, right);

Boost.Spirit 式の構造をインスタンスで表現する方法 仮想関数経由なので遅い型情報が消える Expression Template

class chlit { char c_; public: chlit(char c) : c_(c) { bool parse(input in) { returm in.read() == c_; ; Boost.Spirit chlit ch_p(char c) { return chlit(c);

Boost.Spirit template<class Left, class Right> class sequence { Left left_; Right right_; public: sequence(left l, Right r) : left_(l), right_(r) { bool parse(input in) { if (!l_.parse(in)) return false; if (!r_.parse(in)) return false; return true; ; template<class Left, class Right> sequence<left, Right> operator>>(left left, Right right) { return sequence<left, Right>(left, right);

Boost.Spirit template<class Left, class Right> class alternative {... bool parse(input in) { Input save(in); if (l_.parse(in)) return true; in = save; if (r_.parse(in)) return true; return false; ; template<class Left, Right> alternative<left, Right> operator (Left left, Right right) { return alternative<left, Right>(left, right);

Boost.Spirit bool result = (ch_p('b') (ch_p('b') >> ch_p('c'))).parse(input("bc")); alternative<chlit, sequence<chlit, chlit> > 式の構造を型で表現している Expression Template

Boost.Spirit?? B = (ch_p('b') (ch_p('b') >> ch_p('c'))); 戻り値の型が難しくて代入できない Type Erasure を使う 仮想関数経由になるから遅くなる ケースバイケース

Boost.Spirit まとめ Boost.Spirit 式の構造を型で表現している Expression Template 複雑になる型 Type Erasure Boost.Spirit おまけ 実際は CRTP(Curiously Recurring Template Pattern) が使われていたりしてもっと複雑 Boost.Spirit は LL(k) の構文解析器

時間が余った時用 構文解析の手法下降型ルートのルールを展開していって 入力した文字列と一番下のルールの文字が一致するかどうかを調べる 上昇型入力の文字列がルールに変換できるかを調べ 最終的にルートのルール になるかどうかを調べる Boost.Spirit は下降型 R abd B b bc

Boost 本家 http://www.boost.org/ Boost.SharedPtr ( 日本語 ) 参考 http://boost.cppll.jp/head/libs/smart_ptr/shared_ptr.htm Boost.Spirit ( ちょっとだけ日本語 ) http://boost.cppll.jp/head/libs/spirit/ Boost C++ Libraries プログラミング第 2 版 http://www.kmonos.net/pub/boostbook/ コンパイラの構成と最適化 http://www.k.hosei.ac.jp/~nakata/acompiler/acompiler.html

おわり