狠狠撸
Submit Search
颁#でもメタプログラミングがしたい!!
?
12 likes
?
16,774 views
T
TATSUYA HAYAMIZU
Follow
わんくま同盟大阪勉強会#57 セッション資料
Read less
Read more
1 of 43
Download now
Downloaded 26 times
More Related Content
颁#でもメタプログラミングがしたい!!
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
Download