51
Modern C++ Programming and New C++ International Standard (C++11) 1 ES松浦 twitter:@matu_ani 20111130日水曜日

boost and c++11

Embed Size (px)

Citation preview

Page 1: boost and c++11

Modern C++ Programmingand

New C++ International Standard (C++11)

1

ES松浦 twitter:@matu_ani

2011年11月30日水曜日

Page 2: boost and c++11

自己紹介?

•やっとでました!!•2011年 8月 発売 •怒涛の1200ページ! •通称:鈍器w•8,190円 たけーっ!

2

『ストラウストラップのプログラミング入門』

いや、いち監修メンバーでしかないんですが...つれー、3回通しで読んだからつれー。最後の2ヶ月で2回読んだもんな、つれー。原著もなー

2011年11月30日水曜日

Page 3: boost and c++11

Agenda

•今こそC++の魅力をお伝えしたい。•改めてC++の紹介をして、•C++がサポートするプログラミングパラダイムについて、少しkwsk

• boostや新しい国際標準(通称C++11)について軽く紹介

32011年11月30日水曜日

Page 4: boost and c++11

Content•歴史•C++の使われどころ•プログラミング・パラダイム•boost おさわりだけ•C++11ソフトタッチだけ

42011年11月30日水曜日

Page 5: boost and c++11

歴史history

52011年11月30日水曜日

Page 6: boost and c++11

62011年11月30日水曜日

Page 7: boost and c++11

Common History• 1979:C with Classes• 1990:『The Annotated C++ Reference Manual

(ARM)』• 1998:初の国際標準規格(C++98)• 2003:マイナーバージョンアップ(C++03)• 2011:初のメジャーバージョンアップ(C++11)

72011年11月30日水曜日

Page 8: boost and c++11

Common History• 1979:C with Classes• 1990:『The Annotated C++ Reference Manual

(ARM)』• 1998:初の国際標準規格(C++98)• 2003:マイナーバージョンアップ(C++03)• 2011:初のメジャーバージョンアップ(C++11)

7

C++98以降、boostという拡張ライブラリ開発を通してC++は成長していた。そして、C++11にて別言語?というくらいの大胆な進化を遂げた。

2011年11月30日水曜日

Page 9: boost and c++11

C++の使われどころ

What is Product that isusing C++

82011年11月30日水曜日

Page 11: boost and c++11

The Programming Languages Beacon• http://www.lextrait.com/vincent/implementations.html

9

OS/ブラウザ/GUI/オフィス/DBMS/コンパイラ/Game/JavaVM/Webプラットフォーム/などなど、主要なソフトウェアプロダクトはC++で書かれている。

2011年11月30日水曜日

Page 12: boost and c++11

Why C++ is not popular?• 『C++はなぜ人気がないのか』

• http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20050215/156201/

• 「日本でC++の評価が低いのは,こうしたソフトの大部分が海外製であることの裏返しではないか,とまで思える」

102011年11月30日水曜日

Page 13: boost and c++11

Why C++ is not popular?• 『C++はなぜ人気がないのか』

• http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20050215/156201/

• 「日本でC++の評価が低いのは,こうしたソフトの大部分が海外製であることの裏返しではないか,とまで思える」

10

• 個人的には逆に、• 「C++大好きなヤツが少ないから、こうした(大切な)ソフトの大部分が海外製」なんじゃね?とか思いますです、ハイ。

2011年11月30日水曜日

Page 14: boost and c++11

C++ is むずい??その全てをマスターしようとすると一人の人間の限界を軽く超えるw(私感)

しかしながら、C++が備える言語機能、プログラミングパラダイム、イディオムにより、安全で効率のよいプログラムを簡単に記述することが可能。→ VBやSQLのような書き方が可能(EDSLとか言います)→ ただし、ライブラリアンには高度なスキルが要求される→ だからこそ?Geek達を惹きつけてやまない

112011年11月30日水曜日

Page 15: boost and c++11

プログラミング・パラダイム

Programming Paradigm

122011年11月30日水曜日

Page 16: boost and c++11

C++ has Multi Programming Paradigm

132011年11月30日水曜日

Page 17: boost and c++11

C++ has Multi Programming Paradigm

手続き型

132011年11月30日水曜日

Page 18: boost and c++11

C++ has Multi Programming Paradigm

手続き型オブジェクト指向

132011年11月30日水曜日

Page 19: boost and c++11

C++ has Multi Programming Paradigm

手続き型オブジェクト指向ジェネリック

132011年11月30日水曜日

Page 20: boost and c++11

C++ has Multi Programming Paradigm

手続き型オブジェクト指向ジェネリックメタプログラミング

132011年11月30日水曜日

Page 21: boost and c++11

C++ has Multi Programming Paradigm

手続き型オブジェクト指向ジェネリックメタプログラミング関数型

132011年11月30日水曜日

Page 22: boost and c++11

復習:ジェネリックC#やJavaも備えている機能ですが、、、??

List<T> lst ;

ジェネリックは、単なる Parameterized Type による汎用データ構造だけを指すわけではない。

142011年11月30日水曜日

Page 23: boost and c++11

復習:ジェネリックC#やJavaも備えている機能ですが、、、??

List<T> lst ;

ジェネリックは、単なる Parameterized Type による汎用データ構造だけを指すわけではない。

14

真の意味はデータと処理の分離である

2011年11月30日水曜日

Page 24: boost and c++11

復習:オブジェクト指向オブジェクト命! で、オブジェクトってなんだっけ?• データと処理(操作)が一緒になったもの• データが主役で処理はそれに付随するもの• モノとその振る舞い:オブジェクト

152011年11月30日水曜日

Page 25: boost and c++11

復習:オブジェクト指向オブジェクト命! で、オブジェクトってなんだっけ?• データと処理(操作)が一緒になったもの• データが主役で処理はそれに付随するもの• モノとその振る舞い:オブジェクト

15

ソフトウェアではそれが常に真だろうか?つーか、現実世界でどーなの?

2011年11月30日水曜日

Page 26: boost and c++11

例:探す

• 探す条件例 : a == b• 要素をたどる: ++a• 要素を参照する: *a;• 上記さえ満たせばあらゆる型に適用可能

16

template<typename Iterator, typename Tp>Iterator find(Iterator first, Iterator last, const Tp& val){ while (first != last && !(*first == val)) ++first; return first;}

2011年11月30日水曜日

Page 27: boost and c++11

例:探す

• 探す条件例 : a == b• 要素をたどる: ++a• 要素を参照する: *a;• 上記さえ満たせばあらゆる型に適用可能

16

template<typename Iterator, typename Tp>Iterator find(Iterator first, Iterator last, const Tp& val){ while (first != last && !(*first == val)) ++first; return first;}

「探す」とは、ある条件に合致する要素を見つけること。それはデータ型には依存しない。# 「探す」の場合、データ構造には依存する事に注意

2011年11月30日水曜日

Page 28: boost and c++11

いろいろ探す

17

// svから"X"を探すvector<string> sv;・・・vector<string>::iterator i = find(sv.begin(), sv.end(), "X");

// arから5を探すint ar[10];・・・int* pi = find( ar, ar+10, 5);

2011年11月30日水曜日

Page 29: boost and c++11

いろいろ探す

17

// svから"X"を探すvector<string> sv;・・・vector<string>::iterator i = find(sv.begin(), sv.end(), "X");

// arから5を探すint ar[10];・・・int* pi = find( ar, ar+10, 5);

2011年11月30日水曜日

Page 30: boost and c++11

いろいろ探す

17

// svから"X"を探すvector<string> sv;・・・vector<string>::iterator i = find(sv.begin(), sv.end(), "X");

// arから5を探すint ar[10];・・・int* pi = find( ar, ar+10, 5);

2011年11月30日水曜日

Page 31: boost and c++11

いろいろ探す

17

// svから"X"を探すvector<string> sv;・・・vector<string>::iterator i = find(sv.begin(), sv.end(), "X");

// arから5を探すint ar[10];・・・int* pi = find( ar, ar+10, 5);

findは一回だけ書けば使い回し可能「探す」は、データ型が変わっても不変である。

2011年11月30日水曜日

Page 32: boost and c++11

Generic Programing

•それはC++98のSTLで示された。•オブジェクト指向に対するアンチテーゼ• オブジェクト指向は少なくとも銀の弾ではない

• 事実、現代のプログラミングモデルは継承を積極的には採用しない。むしろダック・タイピングを重視する方向にある。

•使いたいアルゴリズムを決めよ。様々な型、データ構造を操作対象にできるよう、それらをパラメータ化せよ。• Bjame Stroustrup

182011年11月30日水曜日

Page 33: boost and c++11

その他のパラダイム•メタプログラミング• プログラム内にプログラムを生成する(言語内言

語)。これは闇の世界に突入するので次の機会にでも

•関数型• 並列プログラミングの発展と共に非常に重要なパ

ラダイムとなった。 関数型自体は池田くんのプレゼン参照。C++はラムダやfunction型でそれをサポートする。今日はあとで、チョットだけ。

192011年11月30日水曜日

Page 34: boost and c++11

boostC++98以降の、C++の進化

202011年11月30日水曜日

Page 35: boost and c++11

boost• C++の先駆的な開発者のコミュニティ、及びそのコ

ミュニティによって公開されているオープンソースライブラリのことを指す。コミュニティとしてのBoostはC++標準化委員会の委員により設立されており、現在でもその多くが構成員として留まっている。このような経緯もあってBoostコミュニティはC++の標準化に対してかなりの影響力を有している。実際に標準化委員会の発表した「TR1」の2/3以上がBoostライブラリを基にしている。• Boostはテンプレートなどを活用して積極的にメタプログラミングやジェネリックプログラミングを取り入れていこうという傾向がある。

212011年11月30日水曜日

Page 36: boost and c++11

matzのC++紹介• 「Boost C++ ライブラリは古典的な C++ 観からは想像もできないような総称型プログラミングの世界を見せてくれています。」

• 「オブジェクト指向機能もある総称型プログラミング言語。これがこれからの C++ の立ち位置になるのかもしれません」

• http://jp.rubyist.net/magazine/?0018-Legwork

222011年11月30日水曜日

Page 37: boost and c++11

一枚でboost (笑)• メモリ管理• scoped_ptr, scoped_array, shared_ptr, shared_array, weak_ptr

• 入出力• asio, filesystem, iostreams, serialization

• 小道具• foreach, scoped_exit,

• 関数型:• function, lambda, signals2

• 文字列系:• format, regex, tokenizer

• 並列・並行• interprocess, thread

• 他に、数学、メタプログラミング、などなど、膨大なライブラリです• https://sites.google.com/site/boostjp/

232011年11月30日水曜日

Page 38: boost and c++11

C++112011年、新国際標準

242011年11月30日水曜日

Page 39: boost and c++11

C++11

• ISO/IEC 14882:2011 は、2011年時点で最新のプログラミング言語C++のISO標準である。省略して C++11 と呼ばれる。規格の策定中は2009年中の標準化を目指していたため、C++0xという仮称で呼ばれていた。• ISO/IEC 14882:2003 (C++03) に代わるものとして、2011年8月12日にISOによって承認された。

252011年11月30日水曜日

Page 40: boost and c++11

抜粋• 右辺値参照、Moveセマンティクス• Range-base for• lambda• 型推論• nullptr• decltype• char16_t, char_32_t, raw string literal• constexpr• 可変引数テンプレート• メンバー初期化子• initializer_list• ガベージコレクションと到達可能性ベースリーク検知の最小支援• スマートポインタ、thread、時間、などboostからたくさん

262011年11月30日水曜日

Page 41: boost and c++11

nullptr

27

これまで、NULLマクロ、0リテラル等でヌルポインタを表現していた。しかし、NULLマクロと0リテラルは、テンプレートで使用するとint型に推論されてしまうという問題ががが。→ nullリテラル導入されますた。

int* p = nullptr;

2011年11月30日水曜日

Page 42: boost and c++11

右辺値参照、Moveセマンティクス•個人的にはC++11最大のトピック•ポインタ、参照に次ぐ、第三の文法、&& アンパサを二個

28

struct X{ X(std::vector<int>&& v){...} };

2011年11月30日水曜日

Page 43: boost and c++11

右辺値参照、Moveセマンティクス•個人的にはC++11最大のトピック•ポインタ、参照に次ぐ、第三の文法、&& アンパサを二個

28

struct X{ X(std::vector<int>&& v){...} };

説明すると何時間もかかるからこのへんでやめとく(笑)

2011年11月30日水曜日

Page 44: boost and c++11

Range-base for

29

// コンテナvector<int> v={1,2,3};for(int value : v) {cout << value << endl;}// 1// 2// 3

// 配列にもint ar[]={1,2,3};for(int value : ar) {cout << value << endl;}// 1// 2// 3

2011年11月30日水曜日

Page 45: boost and c++11

型推論

30

vector<int> v; vector<int>::iterator it = v.begin();

かなりうざかっった

vector<int> v;auto it = begin(v); // v.begin(); と同じ

これからは

•従来のauto は廃止された。•動的言語の要求の多くは型推論で解決する。# と言われている

2011年11月30日水曜日

Page 46: boost and c++11

lambda

31

vector<int> v;find_if(v.begin(), v.end(), [](int x) -> bool { return x % 2 == 0; });

•ラムダの外の変数を参照可能•コピーでもリファレンスでも

•クロージャも書ける

2011年11月30日水曜日

Page 47: boost and c++11

ラムダと関数型

32

auto f = [](){};最小のラムダ式

// 関数型を明示function<int(int,int)> mul = [](int x,int y)->int{return x*y;};mul(3,3) // 9

// 戻り値省略:これと同じ解釈// auto add = [](int x, int y) ->decltype(x+y){return x+y;};auto add = [](int x, int y){return x+y;};add(3,3) // 6

// キャプチャとクロージャint v = 100auto add2 = [=](int x){return v+y;};add2(3) // 103

2011年11月30日水曜日

Page 48: boost and c++11

関数型ふう遅延評価

33

double div( int x, function<int()>& f){ if(x== 0) return NaN; return f()/x; // この時点ではじめてfが評価される}int x = ...auto result = div( x, [](){ int ret; /*重い処理*/ return ret; } );

2011年11月30日水曜日

Page 49: boost and c++11

Smart Pointer

34

{ shared_ptr<A> x(new A); x->func(); // ポインタと同じように使える shared_ptr<A> y = x; // 代入(所有権) } // スコープから抜けると自動でdelete // make_sharedというヘルパ shared_ptr<A> x = make_shared<A>();

// make_sharedなら型推論も auto x = make_shared<A>();

scoped_ptr、week_ptrとかもあり。auto_ptrはdeprecatedです。unique_ptr使ってね。

2011年11月30日水曜日

Page 50: boost and c++11

まとめ• C++は世の中を支えている。(個人的に一番面白いドメイン)• boostは基本使う。つか、使え• C++11は主要ベンダーがサポートし始めたけど、実用レベルは?•組み込みもC++普通(話してない)•並列プログラミングも大事(話してない)

352011年11月30日水曜日

Page 51: boost and c++11

おつかれさま!!

362011年11月30日水曜日