帰ってきた C++ CommunityOpenDay /5/11 Sat Room metro 大阪 遥佐保
はじめに
@hr_sao 名前と経歴を言う 出没コミュニティ Room metro (大阪) ExceptionalC++ 読書会(大阪) SQLWorld (大阪) 自己紹介
VisualStudio2012 の C++ 関連の 理解度を深める 本日の目的
0. C++ とその周りの歴史 1. C++ separate programing categories 2. Windows application – UI 3. How can you use Visual Studio 2012? 4. Windows store apps – C++/CX 5. How to learn C++/CX -. Welcome back to Windows Phone Topics
0. C++ とその周りの歴史
‘00 ~ ‘90 ~ ‘80 ~ ‘70 ~ ‘60 ~ C/C++ の歴史
より上位の高級言語を目指した Java と C# Web 系言語の登場 …> どうみても押され気味 ? 90 年代以降をよく見て見る ‘00 ~ ‘90 ~
‘00 ~ iOS と Android が登場 ナローバンドでの利用前提 Web 画面遷移の操作感の限界 クライアント側に情報を! 2000 年後半にスマートフォンの登場
Recently Published: C++11 (2011)
いったん Web に走ったみんなの気持ちが クライアントサイド ( ネイティブ ) に戻ってきた … ! C++11 規格をひっさげて VisualStudio2012 が 通りますよっ Welcome back to C++
1. Portability Linux と Windows で同じコードを動かす 2. Reusability 既存ライブラリ使いたい 3. Performance.NET がリッチすぎる Now… use cases for C++
1. C++ separate programing categories
プログラミングのカテゴリが 3 つある C 言語を使う Class を使う Template を使う C++ Primer Plus (6th Edition) Day 1 Keynote - Bjarne Stroustrup: C++11 Style /Keynote-Bjarne-Stroustrup-Cpp11-Stylehttp://channel9.msdn.com/Events/GoingNative/GoingNative- 2012/Keynote-Bjarne-Stroustrup-Cpp11-Style C++ の世界
手続き型言語 開発効率が高いとは言えないがシンプル 実行速度が速く、サイズも小さい ↑↑↑ もちろん作り方に依存するが、普通はそうなる function と struct の世界 macros / void* / casts の多用スキルが身についてしまう C 言語の世界
C 言語にプラスされたオブジェクト指向言語 struct にもっと機能を入れたなどなど private / operator overload / inheritance / interface / exception / virtual functions … C 言語よりは開発効率は上がる ↑↑↑ もちろん作り方に依存するが、普通はそうなる C++85 style ( C with Classes) class の世界
ジェネリック / メタプログラミングが可能 データの型には依存せず 任意 Object を格納できるコンテナ クラス・関数テンプレート / 特殊化 / テンプレートパラメータ … 型・数値の差し替え、型推論でコーディング量 の減少が可能に その他応用例も多数 template の世界 いつでもどこでも Template(^^)
sample: C style and C++11 // for-loop sum = 0; for( vector size_type i = 0; i < v.size(); i ++ ){ sum += v [ i ]; } // for_each + lambda sum = 0; for_each( v.begin(), v.end(), [&sum]( int x ) { sum += x; });
例えば、 C 言語を使う人の本音は マクロだけで頑張るのはホントは辛い ポインタを安全に使いたい、頑張ってるけどさ エラー処理を確実にしたい、頑張ってるけどさ もっと便利な機能を使いたい! そこでCの拡張です! Why Language Extensions?
例えば、 Windows で C++ を使う人の本音は ファイルの操作、もっと楽に出来ないのかなぁ 表示といえば、 MFC/DirectX/GDI… なんでこんなにコーディ ング量多いの …(  ̄ д  ̄ ) エー いつも「それ C# がよしなにやってくれるよ」と言われる Java/C# 使いたくない!! そこでC++の拡張です! Why Language Extensions? part2
C++ 言語の拡張 Visual C++ コンポーネント拡張のことを指す Windows ストアアプリの作成用 ※ストアアプリ以外でも利用可能 C++/CX
2. Windows application - UI
Programing model Desktop apps C C++ Win32 C# VB.NET SL HTML JavaScript Internet Explorer Windows store apps Windows Kernel Services Communication & Data Devices & Printing WinRT APIs Graphics & Media Application Model XAML JavaScript HTML / CSS C C++ C# VB DirectX
C#/VB.NET での UI の表現 Windows apps - C#/VB.NET XAML C#/VB.NET -.netframework XNA WinForm
JavaScript UI Windows apps - JavaScript JavaScript HTML JSIL Enchant Moon PhoneGap
C++ から見ると簡単に表現する方法が増えた! Windows apps - C++ XAML C/C++ DirectX GDI MFC WTL OpenGL
3. How can you use Visual Studio 2012?
Store appsDesktop Visual Studio 2012 の C++ の世界 Windows8 DirectX Windows Phone8 DirectX apps for phone XAML for C++ WRLWTL MFC
Windows ストアアプリで COM コンポーネントなど ローレベルアクセスを行う Template Library → WindowsRuntime は使わず ATL で記述された COM コンポーネントを簡単に移 植、操作可能 WTL:Windows Template Library – ATL:Active Template Library という COM プログラミングを簡単にする ためのテンプレートベースのライブラリ、ダイアログ、フレーム、 GDI などなど,MFC より軽い Windows Runtime C++ Template Library (WRL)
DirectX 機能レベル ShaderModel D3D_FEATURE_LEVEL_9_12.0 D3D_FEATURE_LEVEL_9_22.0 D3D_FEATURE_LEVEL_9_32.0 D3D_FEATURE_LEVEL_10_04.0 D3D_FEATURE_LEVEL_10_14.1 D3D_FEATURE_LEVEL_11_05.0 D3D_FEATURE_LEVEL_11_15.0 RT なら Feature Level は 「 D3D_FEATURE_LEVE L_9_1 」ベース Windows 環境にビデオやサウンドなどのマルチメ ディア機能を提供するための API Windows ストアアプリは、 DirectX11.1 の書き方のみ
C++/CX C#/VB.NET と同様の UI 表現 -XAML が利用可能 XML ベースで UI を表現する XAML for C++
4. Windows store apps – C++/CX
Build の流れ – C++ 編 WinRT : Windows ストア Apps の プロジェクトファイル なんとなく触れそうなファイルは3つ MainPage.xaml MainPage.cpp MainPage.h
Windows store apps – C++ build Auto Generated 見慣れないソースコードが しれっと自動生成されます
XAML Obj を利用可能な pointer に void ::StoreApp1::MainPage::InitializeComponent() { … btn00 = safe_cast (static_cast (this)->FindName(L"btn00")); … }
WinRT C++ Build process
.winmd ファイルのおかげ WinRT のクラス名やメソッド名などの メタデータが入っているファイル.NET, C++, javaScript が共通で理解できる → *.lib ファイルに似てます! →.NET アセンブリと同じ (binary format) *.winmd ファイルが VisualStudio でコンパイルする時に WinRT の DLL の場所を教えてくれる
Windows meta data.winmd ファイル C:\Windows\System32\WinMetadata フォルダ
C:\Windows\System32 の下にあるよ Windows. ○○○.dll WinRT の実体 実体は DLL だったんですね!!
良い感じにマップしてくれる例 Windows::Foundation の HSTRING ハンドルは … C++/CX が Windows メタデータ (.winmd) ファイルを読み取ると … 言語 HSTRING のマップ C++/CXPlatform::String class JavaScriptString object C#/VB.NETSystem.String class
WinRT は API 単なるインタフェース 実体は DLL Desktop apps C C++ Win32 C# VB.NET SL HTML JavaScript Internet Explorer Windows store apps Windows Kernel Services Communication & Data Devices & Printing WinRT APIs Graphics & Media Application Model XAML JavaScript HTML / CSS C C++ C# VB DirectX デスクトップ C++ からも呼べるよ ※ XAML/HTML 系以外
Windows Runtime C#, VB, C++ に提供されている API UI 関係は Windows.UI.Xaml (★) Windows Library for JavaScript JavaScript API ( 各種コントロール、 CSS ) (★)に相当するのは WinJS 名前空間 Windows ストアアプリの WindowsAPI
デスクトップアプリからも WindowsRuntime 利用可能 Win32 コンソールアプリケーション作成 int main( Platform::Array ^ argv ) コンパイルオプション /ZW つける、 /Gm- を外す.winmd ファイルを 2 つ参照追加 Windows.winmd - C:\Program Files (x86)\Windows Kits\8.0\References\CommonConfiguration\Natural Platform.winmd - C:\Program Files (x86)\Microsoft SDKs\Windows\8.0\ExtensionsSDKs\Microsoft.VCLibs\11.0\References\CommonConfiguration\natural
5. How to learn C++/CX
C++/CX を学習する WinRT API が利用可能 → ネイティブライブラリ、 XAML が利用可能 DirectX の利用可能 純粋にネイティブアプリ – WRL 利用可能 XAML からの DirectX 利用可能 → 最初はいいと思ったけど後で良いかも XAML オブジェクトの 中が DirectX の世界
今、 C#/VB.net で作っている人 そのまま、 C# で書けばいいよ! C++ や DLL を呼び出す部分は完備されてます l Why do we use C++? でも、勘違いしないで!!
今までは C#/VB.NET でしかできなかった (仕方ない) XAML 系での最終表現の形態がそれしかなかった Why do we use C++? でも、今は違います!!
WinRT における C++ の土俵 C# が出来ることと全く同じことが可能 C# で出来るから C# を利用する時代ではない Why do we use C++? 表現出来る土表は全て整っている
C++ プログラマに C++/CX つまり Windows ストアアプリを 作るための情報が必要に行きわたっていないこと 正しい C++ での Windows ストアアプリの使い方を 伝えていないことにある (だって XAML 系の使い方に慣れてるのは C#/VB.NET 系 ユーザなんだから、仕方ないでしょ) 問題は …
MSDN : C++ を使った Windows ストア アプリの ためのロードマップ Windows ストアアプリのための C++ 情報まとめ concurrency::create_async … task – then(), when_all() … casablanca – C++ REST SDK bindings to HTTP, JSON, and URIs ストアアプリで C++ を選択したら …
C++ と XAML を利用するための実践的サンプル Hilo Windows7 の時は DirectX でした 今は C++/XAML 版と、 JavaScript 版があるよ
Windows 8 Microsoft Visual Studio 2012 C++ と XAML のプログラミングに対する関心 → C++ と異なり、 XAML は UI を宣言型で書ける Hilo 利用の前提条件
UX の設計 非同期プログラミング パターンとヒント タイルとスプラッシュ画面の操作 Model-View-ViewModel (MVVM) パターン使用 リポジトリ パターンの使用 ページの作成とページ間の移動 コントロールの使用 タッチの使用 Hilo で学べること 中断、再開、アクティブ化の処理 パフォーマンスの向上 Windows ストア アプリのテストと展開
初心者向け表記 巨大なリンク集&プログラム解説
C++/CX プログラミングノウハウ Hilo
task チェーン – 処理流れ、チェーンの取り消し Hilo
Hilo で Windows ストアアプリの作り方を覚えたら、 次は通信がしたくなる Casablanca – C++ REST SDK
REST サービス (Windows Vista/7/8, Linux) VS2010/2012, クラウドベースの通信サポート 非同期処理、ストリームバッファ HTTP Client C++11 base Apache オープンソース Casablanca とは Azure など
-. Welcome back to Windows Phone
Windows Phone8 の C++ サポート VC Windows8 と同じコードで OK C++11 ベース DirectX ( XAML は利用できない ) Using C++ in your Windows Phoen Apps
summary
クライアントサイドアプリケーション復権 C++ ネイティブコード C++11 規格 拡張 C++/CX XAML での表現力 Windows Runtime は API XAML × C++ の学習 Hilo / Casablanca まとめ
これからも C++ でアプリケーションを作りましょう そのための道は マイクロソフトが全て用意してくれています