Upload
akihiko-matuura
View
608
Download
3
Embed Size (px)
Citation preview
Modern C++ Programmingand
New C++ International Standard (C++11)
1
ES松浦 twitter:@matu_ani
2011年11月30日水曜日
自己紹介?
•やっとでました!!•2011年 8月 発売 •怒涛の1200ページ! •通称:鈍器w•8,190円 たけーっ!
2
『ストラウストラップのプログラミング入門』
いや、いち監修メンバーでしかないんですが...つれー、3回通しで読んだからつれー。最後の2ヶ月で2回読んだもんな、つれー。原著もなー
2011年11月30日水曜日
Agenda
•今こそC++の魅力をお伝えしたい。•改めてC++の紹介をして、•C++がサポートするプログラミングパラダイムについて、少しkwsk
• boostや新しい国際標準(通称C++11)について軽く紹介
32011年11月30日水曜日
Content•歴史•C++の使われどころ•プログラミング・パラダイム•boost おさわりだけ•C++11ソフトタッチだけ
42011年11月30日水曜日
歴史history
52011年11月30日水曜日
62011年11月30日水曜日
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日水曜日
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日水曜日
C++の使われどころ
What is Product that isusing C++
82011年11月30日水曜日
The Programming Languages Beacon• http://www.lextrait.com/vincent/implementations.html
92011年11月30日水曜日
The Programming Languages Beacon• http://www.lextrait.com/vincent/implementations.html
9
OS/ブラウザ/GUI/オフィス/DBMS/コンパイラ/Game/JavaVM/Webプラットフォーム/などなど、主要なソフトウェアプロダクトはC++で書かれている。
2011年11月30日水曜日
Why C++ is not popular?• 『C++はなぜ人気がないのか』
• http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20050215/156201/
• 「日本でC++の評価が低いのは,こうしたソフトの大部分が海外製であることの裏返しではないか,とまで思える」
102011年11月30日水曜日
Why C++ is not popular?• 『C++はなぜ人気がないのか』
• http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20050215/156201/
• 「日本でC++の評価が低いのは,こうしたソフトの大部分が海外製であることの裏返しではないか,とまで思える」
10
• 個人的には逆に、• 「C++大好きなヤツが少ないから、こうした(大切な)ソフトの大部分が海外製」なんじゃね?とか思いますです、ハイ。
2011年11月30日水曜日
C++ is むずい??その全てをマスターしようとすると一人の人間の限界を軽く超えるw(私感)
しかしながら、C++が備える言語機能、プログラミングパラダイム、イディオムにより、安全で効率のよいプログラムを簡単に記述することが可能。→ VBやSQLのような書き方が可能(EDSLとか言います)→ ただし、ライブラリアンには高度なスキルが要求される→ だからこそ?Geek達を惹きつけてやまない
112011年11月30日水曜日
プログラミング・パラダイム
Programming Paradigm
122011年11月30日水曜日
C++ has Multi Programming Paradigm
132011年11月30日水曜日
C++ has Multi Programming Paradigm
手続き型
132011年11月30日水曜日
C++ has Multi Programming Paradigm
手続き型オブジェクト指向
132011年11月30日水曜日
C++ has Multi Programming Paradigm
手続き型オブジェクト指向ジェネリック
132011年11月30日水曜日
C++ has Multi Programming Paradigm
手続き型オブジェクト指向ジェネリックメタプログラミング
132011年11月30日水曜日
C++ has Multi Programming Paradigm
手続き型オブジェクト指向ジェネリックメタプログラミング関数型
132011年11月30日水曜日
復習:ジェネリックC#やJavaも備えている機能ですが、、、??
List<T> lst ;
ジェネリックは、単なる Parameterized Type による汎用データ構造だけを指すわけではない。
142011年11月30日水曜日
復習:ジェネリックC#やJavaも備えている機能ですが、、、??
List<T> lst ;
ジェネリックは、単なる Parameterized Type による汎用データ構造だけを指すわけではない。
14
真の意味はデータと処理の分離である
2011年11月30日水曜日
復習:オブジェクト指向オブジェクト命! で、オブジェクトってなんだっけ?• データと処理(操作)が一緒になったもの• データが主役で処理はそれに付随するもの• モノとその振る舞い:オブジェクト
152011年11月30日水曜日
復習:オブジェクト指向オブジェクト命! で、オブジェクトってなんだっけ?• データと処理(操作)が一緒になったもの• データが主役で処理はそれに付随するもの• モノとその振る舞い:オブジェクト
15
ソフトウェアではそれが常に真だろうか?つーか、現実世界でどーなの?
2011年11月30日水曜日
例:探す
• 探す条件例 : 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日水曜日
例:探す
• 探す条件例 : 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日水曜日
いろいろ探す
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日水曜日
いろいろ探す
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日水曜日
いろいろ探す
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日水曜日
いろいろ探す
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日水曜日
Generic Programing
•それはC++98のSTLで示された。•オブジェクト指向に対するアンチテーゼ• オブジェクト指向は少なくとも銀の弾ではない
• 事実、現代のプログラミングモデルは継承を積極的には採用しない。むしろダック・タイピングを重視する方向にある。
•使いたいアルゴリズムを決めよ。様々な型、データ構造を操作対象にできるよう、それらをパラメータ化せよ。• Bjame Stroustrup
182011年11月30日水曜日
その他のパラダイム•メタプログラミング• プログラム内にプログラムを生成する(言語内言
語)。これは闇の世界に突入するので次の機会にでも
•関数型• 並列プログラミングの発展と共に非常に重要なパ
ラダイムとなった。 関数型自体は池田くんのプレゼン参照。C++はラムダやfunction型でそれをサポートする。今日はあとで、チョットだけ。
192011年11月30日水曜日
boostC++98以降の、C++の進化
202011年11月30日水曜日
boost• C++の先駆的な開発者のコミュニティ、及びそのコ
ミュニティによって公開されているオープンソースライブラリのことを指す。コミュニティとしてのBoostはC++標準化委員会の委員により設立されており、現在でもその多くが構成員として留まっている。このような経緯もあってBoostコミュニティはC++の標準化に対してかなりの影響力を有している。実際に標準化委員会の発表した「TR1」の2/3以上がBoostライブラリを基にしている。• Boostはテンプレートなどを活用して積極的にメタプログラミングやジェネリックプログラミングを取り入れていこうという傾向がある。
212011年11月30日水曜日
matzのC++紹介• 「Boost C++ ライブラリは古典的な C++ 観からは想像もできないような総称型プログラミングの世界を見せてくれています。」
• 「オブジェクト指向機能もある総称型プログラミング言語。これがこれからの C++ の立ち位置になるのかもしれません」
• http://jp.rubyist.net/magazine/?0018-Legwork
222011年11月30日水曜日
一枚で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日水曜日
C++112011年、新国際標準
242011年11月30日水曜日
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日水曜日
抜粋• 右辺値参照、Moveセマンティクス• Range-base for• lambda• 型推論• nullptr• decltype• char16_t, char_32_t, raw string literal• constexpr• 可変引数テンプレート• メンバー初期化子• initializer_list• ガベージコレクションと到達可能性ベースリーク検知の最小支援• スマートポインタ、thread、時間、などboostからたくさん
262011年11月30日水曜日
nullptr
27
これまで、NULLマクロ、0リテラル等でヌルポインタを表現していた。しかし、NULLマクロと0リテラルは、テンプレートで使用するとint型に推論されてしまうという問題ががが。→ nullリテラル導入されますた。
int* p = nullptr;
2011年11月30日水曜日
右辺値参照、Moveセマンティクス•個人的にはC++11最大のトピック•ポインタ、参照に次ぐ、第三の文法、&& アンパサを二個
28
struct X{ X(std::vector<int>&& v){...} };
2011年11月30日水曜日
右辺値参照、Moveセマンティクス•個人的にはC++11最大のトピック•ポインタ、参照に次ぐ、第三の文法、&& アンパサを二個
28
struct X{ X(std::vector<int>&& v){...} };
説明すると何時間もかかるからこのへんでやめとく(笑)
2011年11月30日水曜日
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日水曜日
型推論
30
vector<int> v; vector<int>::iterator it = v.begin();
かなりうざかっった
vector<int> v;auto it = begin(v); // v.begin(); と同じ
これからは
•従来のauto は廃止された。•動的言語の要求の多くは型推論で解決する。# と言われている
2011年11月30日水曜日
lambda
31
vector<int> v;find_if(v.begin(), v.end(), [](int x) -> bool { return x % 2 == 0; });
•ラムダの外の変数を参照可能•コピーでもリファレンスでも
•クロージャも書ける
2011年11月30日水曜日
ラムダと関数型
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日水曜日
関数型ふう遅延評価
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日水曜日
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日水曜日
まとめ• C++は世の中を支えている。(個人的に一番面白いドメイン)• boostは基本使う。つか、使え• C++11は主要ベンダーがサポートし始めたけど、実用レベルは?•組み込みもC++普通(話してない)•並列プログラミングも大事(話してない)
352011年11月30日水曜日
おつかれさま!!
362011年11月30日水曜日