Your SlideShare is downloading. ×
0
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

C#でもメタプログラミングがしたい!!

3,488

Published on

わんくま同盟大阪勉強会#57 セッション資料

わんくま同盟大阪勉強会#57 セッション資料

0 Comments
9 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,488
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
14
Comments
0
Likes
9
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. C#でもメタプロがしたい!! @thayamizu わんくま同盟 大阪勉強会 #57
  • 2. おしながき • • • • イントロダクション メタプログラミング C++におけるメタプログラミング C#におけるメタプログラミング わんくま同盟 大阪勉強会 #57
  • 3. イントロダクション わんくま同盟 大阪勉強会 #57
  • 4. 自己紹介 • H.N:Crest – Twitter @thayamizu – Blog http://d.hatena.ne.jp/Crest – 博士(情報学) • 職業:PG • 趣味:カラオケ・プログラミング・イラスト・読書 • よく使う言語:C++/VC++, C# わんくま同盟 大阪勉強会 #57
  • 5. 自己紹介 • 勉強会・読書会やってます – Effective C++ 読書会 (終了) – Exceptional C++読書会(開催中) – 型システム入門読書会 (開催中) – 来年はVisualStudioハッカソン倶楽部で playgroundハッカソンやります わんくま同盟 大阪勉強会 #57
  • 6. 諸注意 このセッションにおける発言は個 人のものであり特定の組織に帰属 するものではありません わんくま同盟 大阪勉強会 #57
  • 7. 諸注意 ツッコミ歓迎です わんくま同盟 大阪勉強会 #57
  • 8. メタプログラミングとは わんくま同盟 大阪勉強会 #57
  • 9. メタって? • メタ(meta - ) – 語源はギリシャ語のmeta – から – 高次の~,超~,~の間などの意味がある • レベルの変化を示すのに使われる – 物理学(physics)→形而上学(meta-physics) – 心理学(psychology)→超心理学(metapsychology) わんくま同盟 大阪勉強会 #57
  • 10. メタプログラムとメタプログラミング • メタプログラム – 他のプログラムや自分自身を記述したり操作する プログラム – プログラムからプログラムを生成したり加工する ようなプログラム • メタプログラミング – 上のようなプログラムを作成する行為 – メタプラグラムをプログラミングすること わんくま同盟 大阪勉強会 #57
  • 11. メタプログラムの例 • メタプログラムの例 – プログラムジェネレータ – コンパイラ,インタプリタ – マクロ – オプティマイザ – リファクタリングツール わんくま同盟 大阪勉強会 #57
  • 12. なんだか難しそう・・ (´・ω・`) わんくま同盟 大阪勉強会 #57
  • 13. そもそもメタプログラミングの 何が嬉しいの? わんくま同盟 大阪勉強会 #57
  • 14. モチベーション • 個別のソフトウェアコンポーネントを自動的に 構成したり,個別に構成されたコンポーネント を自動的に組み合わせたい わんくま同盟 大阪勉強会 #57
  • 15. モチベーション • システムの環境変化に合わせて調整したい – システムの負荷に合わせたスケジューリングや キャッシュシステムの自動的な修正 – 新しい環境へデプロイする前に必要なアダプタを 自動生成する能力 わんくま同盟 大阪勉強会 #57
  • 16. メタプログラミングの利点 • システムが環境に合わせて適応できる能力を 順応性(Adaptivity)という – 興味深いことに,システムの順応性は実行時限 定されません – プログラムのビルド時に環境に適合するようなラ イブラリコードは実現可能 • メタプログラミングは,このような順応性 (Adaptivity)の高いシステムを作るための手 段の一つ わんくま同盟 大阪勉強会 #57
  • 17. メタプログラミングのための機能 • 実行時型情報(RunTime Type Information, RTTI) – GetType,typeof • Template, Generics – 型をパラメタライズするメカニズム – 型に依存しないコンテナやアルゴリズムの実装が可能 • マクロ – C++のマクロはテキスト置換なので結構なんでもできる – C#ではプリプロセッサは用意されているものの,マクロ機 能は言語的に存在してない わんくま同盟 大阪勉強会 #57
  • 18. メタプログラミングのための機能 • リフレクション(reflection) – プログラムが実行中にその状態を表現するデー タとして自分自身を操作できる機能 • 型名の取得,メソッド・フィールド情報の取得・設定 • イントロスペクション(introspection) – プログラム自身の状態を解析するメカニズム • リアフィケーション(reification) – プログラム自身の状態をデータとして符号化する メカニズム わんくま同盟 大阪勉強会 #57
  • 19. まとめ • メタプログラミングとはプログラムを編集・加工 するプログラムを作成する行為 • これにより,移植性・順応性が高く,環境の変 化に応じて動的に修正可能なプログラム – 実際の事例も幾つか存在する(GMCLなど) – しかし,あくまで理論上であって実際のビジネスに 応用するにはかなり難度が高い わんくま同盟 大阪勉強会 #57
  • 20. C++におけるメタプログラミング わんくま同盟 大阪勉強会 #57
  • 21. C++におけるメタプログラミング • C++で行われるメタプログラミング手法は現 在主に3つある – CPP( C PreProcessor ) を使ったプリプロセス時 メタプログラミング – Templateを使ったコンパイル時メタプログラミン グ – Constexprを使ったコンパイル時メタプログラミン グ わんくま同盟 大阪勉強会 #57
  • 22. CPPメタプログラミング • C プリプロセッサを用いた技法 – 現在も使われている – やっていることはテキスト置換による強引な置換 処理 – その昔,Generic.hというのがあって今で言う std::stack,std::vector相等のコンテナとかが提 供されていたらしい わんくま同盟 大阪勉強会 #57
  • 23. Template メタプログラミング • Templateを使ったメタプログラミング技法が 主流 – 特殊化・部分特殊化を活用して,コンパイル時の 型情報を基にメタプログラミング – この技法をtemplate metaprogrammingという • チューリング完全である – すべての制御構造を表現できる – 繰り返しは再帰 – 条件分岐はtemplateの特殊化で実現可能 わんくま同盟 大阪勉強会 #57
  • 24. Constexpr メタプログラミング • constexprはコンパイル時定数を明示するキー ワード – const = readonly – constexpr = const • C++11から導入されたconstexprを使ったメタプ ログラミグ技法 – GCC,CLANGではサポート済み – 残念ながらVisual Studio 2013ではまだ提供されて いない.Visual Studio 2013 CTPで提供予定らしい – C++14では制限が緩和されるので,また新しく技法が 出てくるかも わんくま同盟 大阪勉強会 #57
  • 25. Template メタプログラミングの例 • templateを使った制御構造の実装例 – Template再帰による繰り返し構造 – 特殊化による分岐制御 • メタ関数の例 – コンパイル時定数に基づく型の選択 – コンパイル時計算 わんくま同盟 大阪勉強会 #57
  • 26. まとめ • コンパイル時/プリプロセス時におけるパラ メータを使った,静的な多態性に基づくメタプ ログラミング • 再帰上限など翻訳単位などいくつかの制限は あるもののかなり高度なことが実現可能 – コンパイル時にほとんどのアルゴリズムが解ける わんくま同盟 大阪勉強会 #57
  • 27. C#におけるメタプログラミング わんくま同盟 大阪勉強会 #57
  • 28. C#におけるメタプログラミング • 言語機能で提供されている機能はC++に比 べると貧弱 • しかし,BCLや外部ツールでメタプログラミン グするためのツールが用意されている – Reflection,dynamic – Expression Tree, CodeDom – T4, Roslyn わんくま同盟 大阪勉強会 #57
  • 29. リフレクション • .NET のプログラムには – コード・データ以外に,「プログラムの情報を表現 する」メタデータが含まれている • メタデータとは – プログラム自身を表すデータ • 型,メソッド,アセンブリなどの情報 – NET Framework 自体が自己記述的であるため, 豊富なメタデータが付与できる わんくま同盟 大阪勉強会 #57
  • 30. リフレクションでできること • Reflectionでできること=メタデータの操作 – 任意の型の列挙 – アセンブリの動的ロード – メソッド,カスタム属性,フィールドの操作 – Etc. わんくま同盟 大阪勉強会 #57
  • 31. dynamic • 動的型付けのキーワード – コンパイル時にメンバー情報がわからない型への メンバーアクセスが可能 – 変数宣言の型のところに dynamic キーワード – dynamic keyword は context sensitive keywordであるため,変数宣言のステートメントで のみ有効 • var キーワードと似ているが,型解決されるタ イミングが違う – varはコンパイル時,dynamicは実行時 わんくま同盟 大阪勉強会 #57
  • 32. dynamic • 遅延バインド(late binding) – DLR との連携で有効 • ダックタイピング(duck typing) – XML や JSON などスキーマの緩いデータとの連 携で有効 • ジェネリクス利用時の静的メソッド呼び出し • 多重ディスパッチ • Etc. わんくま同盟 大阪勉強会 #57
  • 33. Dynamicのメカニズム • C# の dynamic は、「型が動的」というより「静的 な型を動的に生成」と言った方が正確 – 実行時の動的コード生成を使って実現されている – ILを確認するとわかりやすい • dynamic 型の変数に格納されたインスタンスの 型に応じて、以下のいずれかのコードが生成さ れる – .NETオブジェクト – COM オブジェクト – 動的にカスタマイズされるオブジェクト わんくま同盟 大阪勉強会 #57
  • 34. 動的なアセンブリのロード • アセンブリを動的にロードして呼び出す • 後からモジュールの挿入が可能 – 機能追加・拡張しやすい • 同じアプリケーション ドメインに相手がいれば、 通信のオーバーヘッドは無くすことができる • サンプル わんくま同盟 大阪勉強会 #57
  • 35. リフレクションによる型の列挙 • 該当する型のみを列挙 • 実行時に動的にメンバを操作する • サンプル わんくま同盟 大阪勉強会 #57
  • 36. T4 Text Template • コード生成ツール – VisualStudio Professional 以上は標準でサポー トされている – テキストテンプレート(*.tt) • ASP.NETと似た構造のテンプレートファイル に書かれた内容からテキストファイルを生成 せることができる – 設定ファイルやテストデータの生成 – プログラムコードの生成 わんくま同盟 大阪勉強会 #57
  • 37. <#@ template debug="false" hostspecific="false" language="C#" #> <#@ assembly name="System.Core" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> <#@ output extension=".txt" #> <# for(int i = 0; i < 4; i++) { #> The square of <#= i #> is <#= Square(i+1) #>. <# } #> That is the end of the list. <#+ private int Square(int i) { return i*i; } わんくま同盟 大阪勉強会 #57
  • 38. Roslyn • Compiler as a Service – 2008年のMS Developer ConferenceでAnders HelsbergがC#の将来について述べた – コンパイラのブラックボックス機能を外部デベロッ パに提供する – コンパイラのAPIを公開したもの • 安定してきてるらしい→近いうちに正式リリー ス? わんくま同盟 大阪勉強会 #57
  • 39. Roslyn • Compilers, Scripting Layer • Service Layers • Editor Service Layers わんくま同盟 大阪勉強会 #57
  • 40. NuGetからインストールできます わんくま同盟 大阪勉強会 #57
  • 41. Conclusion • 言語機能ではC++に劣るものの,Reflection を使ってメタデータを操作することができる • T4やRoslynなどの補助ツールが存在するた め大抵のことができるみたいです • 今回紹介したのは,本当にごくごく一部です. 是非研究してみてください わんくま同盟 大阪勉強会 #57
  • 42. Reference • • • • • • ジェネレーティブプログラミング メタプログラミング .NET プログラミング.NET Framework プログラミング C# 計算機プログラムの構造と解釈 MSDN わんくま同盟 大阪勉強会 #57
  • 43. ご清聴ありがとうございました わんくま同盟 大阪勉強会 #57

×