Contenu connexe
Similaire à C#でもメタプログラミングがしたい!! (20)
Plus de TATSUYA HAYAMIZU (11)
C#でもメタプログラミングがしたい!!
- 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
- 9. メタって?
• メタ(meta - )
– 語源はギリシャ語のmeta – から
– 高次の~,超~,~の間などの意味がある
• レベルの変化を示すのに使われる
– 物理学(physics)→形而上学(meta-physics)
– 心理学(psychology)→超心理学(metapsychology)
わんくま同盟 大阪勉強会 #57
- 17. メタプログラミングのための機能
• 実行時型情報(RunTime Type Information, RTTI)
– GetType,typeof
• Template, Generics
– 型をパラメタライズするメカニズム
– 型に依存しないコンテナやアルゴリズムの実装が可能
• マクロ
– C++のマクロはテキスト置換なので結構なんでもできる
– C#ではプリプロセッサは用意されているものの,マクロ機
能は言語的に存在してない
わんくま同盟 大阪勉強会 #57
- 22. CPPメタプログラミング
• C プリプロセッサを用いた技法
– 現在も使われている
– やっていることはテキスト置換による強引な置換
処理
– その昔,Generic.hというのがあって今で言う
std::stack,std::vector相等のコンテナとかが提
供されていたらしい
わんくま同盟 大阪勉強会 #57
- 24. Constexpr メタプログラミング
• constexprはコンパイル時定数を明示するキー
ワード
– const = readonly
– constexpr = const
• C++11から導入されたconstexprを使ったメタプ
ログラミグ技法
– GCC,CLANGではサポート済み
– 残念ながらVisual Studio 2013ではまだ提供されて
いない.Visual Studio 2013 CTPで提供予定らしい
– C++14では制限が緩和されるので,また新しく技法が
出てくるかも
わんくま同盟 大阪勉強会 #57
- 29. リフレクション
• .NET のプログラムには
– コード・データ以外に,「プログラムの情報を表現
する」メタデータが含まれている
• メタデータとは
– プログラム自身を表すデータ
• 型,メソッド,アセンブリなどの情報
– NET Framework 自体が自己記述的であるため,
豊富なメタデータが付与できる
わんくま同盟 大阪勉強会 #57
- 32. dynamic
• 遅延バインド(late binding)
– DLR との連携で有効
• ダックタイピング(duck typing)
– XML や JSON などスキーマの緩いデータとの連
携で有効
• ジェネリクス利用時の静的メソッド呼び出し
• 多重ディスパッチ
• Etc.
わんくま同盟 大阪勉強会 #57
- 33. Dynamicのメカニズム
• C# の dynamic は、「型が動的」というより「静的
な型を動的に生成」と言った方が正確
– 実行時の動的コード生成を使って実現されている
– ILを確認するとわかりやすい
• dynamic 型の変数に格納されたインスタンスの
型に応じて、以下のいずれかのコードが生成さ
れる
– .NETオブジェクト
– COM オブジェクト
– 動的にカスタマイズされるオブジェクト
わんくま同盟 大阪勉強会 #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