狠狠撸

狠狠撸Share a Scribd company logo
C#でもメタプロがしたい!!
@thayamizu

わんくま同盟 大阪勉強会 #57
おしながき

?
?
?
?

イントロダクション
メタプログラミング
C++におけるメタプログラミング
C#におけるメタプログラミング

わんくま同盟 大阪勉強会 #57
イントロダクション

わんくま同盟 大阪勉強会 #57
自己紹介

? H.N:Crest
– Twitter @thayamizu
– Blog http://d.hatena.ne.jp/Crest
– 博士(情報学)

? 職業:PG
? 趣味:カラオケ?プログラミング?イラスト?読書
? よく使う言語:C++/VC++, C#

わんくま同盟 大阪勉強会 #57
自己紹介

? 勉強会?読書会やってます
– Effective C++ 読書会 (終了)
– Exceptional C++読書会(開催中)
– 型システム入門読書会 (開催中)
– 来年はVisualStudioハッカソン倶楽部で
playgroundハッカソンやります

わんくま同盟 大阪勉強会 #57
諸注意

このセッションにおける発言は個
人のものであり特定の組織に帰属
するものではありません

わんくま同盟 大阪勉強会 #57
諸注意

ツッコミ歓迎です

わんくま同盟 大阪勉強会 #57
メタプログラミングとは

わんくま同盟 大阪勉強会 #57
メタって?

? メタ(meta - )
– 語源はギリシャ語のmeta – から
– 高次の~,超~,~の間などの意味がある

? レベルの変化を示すのに使われる
– 物理学(physics)→形而上学(meta-physics)
– 心理学(psychology)→超心理学(metapsychology)

わんくま同盟 大阪勉強会 #57
メタプログラムとメタプログラミング

? メタプログラム
– 他のプログラムや自分自身を記述したり操作する
プログラム
– プログラムからプログラムを生成したり加工する
ようなプログラム

? メタプログラミング
– 上のようなプログラムを作成する行為
– メタプラグラムをプログラミングすること
わんくま同盟 大阪勉強会 #57
メタプログラムの例

? メタプログラムの例
– プログラムジェネレータ
– コンパイラ,インタプリタ
– マクロ
– オプティマイザ
– リファクタリングツール

わんくま同盟 大阪勉強会 #57
なんだか難しそう?? (??ω?`)

わんくま同盟 大阪勉強会 #57
そもそもメタプログラミングの
何が嬉しいの?

わんくま同盟 大阪勉強会 #57
モチベーション

? 個別のソフトウェアコンポーネントを自動的に
構成したり,個別に構成されたコンポーネント
を自動的に組み合わせたい

わんくま同盟 大阪勉強会 #57
モチベーション

? システムの環境変化に合わせて調整したい
– システムの負荷に合わせたスケジューリングや
キャッシュシステムの自動的な修正
– 新しい環境へデプロイする前に必要なアダプタを
自動生成する能力

わんくま同盟 大阪勉強会 #57
メタプログラミングの利点

? システムが環境に合わせて適応できる能力を
順応性(Adaptivity)という
– 興味深いことに,システムの順応性は実行時限
定されません
– プログラムのビルド時に環境に適合するようなラ
イブラリコードは実現可能

? メタプログラミングは,このような順応性
(Adaptivity)の高いシステムを作るための手
段の一つ
わんくま同盟 大阪勉強会 #57
メタプログラミングのための機能

? 実行時型情報(RunTime Type Information, RTTI)
– GetType,typeof

? Template, Generics
– 型をパラメタライズするメカニズム
– 型に依存しないコンテナやアルゴリズムの実装が可能

? マクロ
– C++のマクロはテキスト置換なので結構なんでもできる
– C#ではプリプロセッサは用意されているものの,マクロ機
能は言語的に存在してない
わんくま同盟 大阪勉強会 #57
メタプログラミングのための機能

? リフレクション(reflection)
– プログラムが実行中にその状態を表現するデー
タとして自分自身を操作できる機能
? 型名の取得,メソッド?フィールド情報の取得?設定

? イントロスペクション(introspection)
– プログラム自身の状態を解析するメカニズム

? リアフィケーション(reification)
– プログラム自身の状態をデータとして符号化する
メカニズム
わんくま同盟 大阪勉強会 #57
まとめ

? メタプログラミングとはプログラムを編集?加工
するプログラムを作成する行為
? これにより,移植性?順応性が高く,環境の変
化に応じて動的に修正可能なプログラム
– 実際の事例も幾つか存在する(GMCLなど)
– しかし,あくまで理論上であって実際のビジネスに
応用するにはかなり難度が高い

わんくま同盟 大阪勉強会 #57
C++におけるメタプログラミング

わんくま同盟 大阪勉強会 #57
C++におけるメタプログラミング

? C++で行われるメタプログラミング手法は現
在主に3つある
– CPP( C PreProcessor ) を使ったプリプロセス時
メタプログラミング
– Templateを使ったコンパイル時メタプログラミン
グ
– Constexprを使ったコンパイル時メタプログラミン
グ

わんくま同盟 大阪勉強会 #57
CPPメタプログラミング

? C プリプロセッサを用いた技法
– 現在も使われている
– やっていることはテキスト置換による強引な置換
処理
– その昔,Generic.hというのがあって今で言う
std::stack,std::vector相等のコンテナとかが提
供されていたらしい

わんくま同盟 大阪勉強会 #57
Template メタプログラミング

? Templateを使ったメタプログラミング技法が
主流
– 特殊化?部分特殊化を活用して,コンパイル時の
型情報を基にメタプログラミング
– この技法をtemplate metaprogrammingという

? チューリング完全である
– すべての制御構造を表現できる
– 繰り返しは再帰
– 条件分岐はtemplateの特殊化で実現可能
わんくま同盟 大阪勉強会 #57
Constexpr メタプログラミング

? constexprはコンパイル時定数を明示するキー
ワード
– const = readonly
– constexpr = const

? C++11から導入されたconstexprを使ったメタプ
ログラミグ技法
– GCC,CLANGではサポート済み
– 残念ながらVisual Studio 2013ではまだ提供されて
いない.Visual Studio 2013 CTPで提供予定らしい
– C++14では制限が緩和されるので,また新しく技法が
出てくるかも
わんくま同盟 大阪勉強会 #57
Template メタプログラミングの例

? templateを使った制御構造の実装例
– Template再帰による繰り返し構造
– 特殊化による分岐制御

? メタ関数の例
– コンパイル時定数に基づく型の選択
– コンパイル時計算

わんくま同盟 大阪勉強会 #57
まとめ

? コンパイル時/プリプロセス時におけるパラ
メータを使った,静的な多態性に基づくメタプ
ログラミング

? 再帰上限など翻訳単位などいくつかの制限は
あるもののかなり高度なことが実現可能
– コンパイル時にほとんどのアルゴリズムが解ける

わんくま同盟 大阪勉強会 #57
C#におけるメタプログラミング

わんくま同盟 大阪勉強会 #57
C#におけるメタプログラミング

? 言語機能で提供されている機能はC++に比
べると貧弱
? しかし,BCLや外部ツールでメタプログラミン
グするためのツールが用意されている
– Reflection,dynamic
– Expression Tree, CodeDom
– T4, Roslyn

わんくま同盟 大阪勉強会 #57
リフレクション

? .NET のプログラムには
– コード?データ以外に,「プログラムの情報を表現
する」メタデータが含まれている

? メタデータとは
– プログラム自身を表すデータ
? 型,メソッド,アセンブリなどの情報

– NET Framework 自体が自己記述的であるため,
豊富なメタデータが付与できる
わんくま同盟 大阪勉強会 #57
リフレクションでできること

? Reflectionでできること=メタデータの操作
– 任意の型の列挙
– アセンブリの動的ロード
– メソッド,カスタム属性,フィールドの操作
– Etc.

わんくま同盟 大阪勉強会 #57
dynamic

? 動的型付けのキーワード
– コンパイル時にメンバー情報がわからない型への
メンバーアクセスが可能
– 変数宣言の型のところに dynamic キーワード
– dynamic keyword は context sensitive
keywordであるため,変数宣言のステートメントで
のみ有効

? var キーワードと似ているが,型解決されるタ
イミングが違う
– varはコンパイル時,dynamicは実行時
わんくま同盟 大阪勉強会 #57
dynamic

? 遅延バインド(late binding)
– DLR との連携で有効

? ダックタイピング(duck typing)
– XML や JSON などスキーマの緩いデータとの連
携で有効

? ジェネリクス利用時の静的メソッド呼び出し
? 多重ディスパッチ
? Etc.
わんくま同盟 大阪勉強会 #57
Dynamicのメカニズム

? C# の dynamic は、「型が動的」というより「静的
な型を動的に生成」と言った方が正確
– 実行時の動的コード生成を使って実現されている
– ILを確認するとわかりやすい

? dynamic 型の変数に格納されたインスタンスの
型に応じて、以下のいずれかのコードが生成さ
れる
– .NETオブジェクト
– COM オブジェクト
– 動的にカスタマイズされるオブジェクト
わんくま同盟 大阪勉強会 #57
動的なアセンブリのロード

? アセンブリを動的にロードして呼び出す
? 後からモジュールの挿入が可能
– 機能追加?拡張しやすい

? 同じアプリケーション ドメインに相手がいれば、
通信のオーバーヘッドは無くすことができる

? サンプル

わんくま同盟 大阪勉強会 #57
リフレクションによる型の列挙

? 該当する型のみを列挙
? 実行時に動的にメンバを操作する
? サンプル

わんくま同盟 大阪勉強会 #57
T4 Text Template

? コード生成ツール
– VisualStudio Professional 以上は標準でサポー
トされている
– テキストテンプレート(*.tt)

? ASP.NETと似た構造のテンプレートファイル
に書かれた内容からテキストファイルを生成
せることができる
– 設定ファイルやテストデータの生成
– プログラムコードの生成
わんくま同盟 大阪勉強会 #57
<#@ 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
Roslyn

? Compiler as a Service
– 2008年のMS Developer ConferenceでAnders
HelsbergがC#の将来について述べた
– コンパイラのブラックボックス機能を外部デベロッ
パに提供する
– コンパイラのAPIを公開したもの

? 安定してきてるらしい→近いうちに正式リリー
ス?

わんくま同盟 大阪勉強会 #57
Roslyn

? Compilers, Scripting Layer
? Service Layers
? Editor Service Layers

わんくま同盟 大阪勉強会 #57
NuGetからインストールできます

わんくま同盟 大阪勉強会 #57
Conclusion

? 言語機能ではC++に劣るものの,Reflection
を使ってメタデータを操作することができる
? T4やRoslynなどの補助ツールが存在するた
め大抵のことができるみたいです
? 今回紹介したのは,本当にごくごく一部です.
是非研究してみてください

わんくま同盟 大阪勉強会 #57
Reference

?
?
?
?
?
?

ジェネレーティブプログラミング
メタプログラミング .NET
プログラミング.NET Framework
プログラミング C#
計算機プログラムの構造と解釈
MSDN

わんくま同盟 大阪勉強会 #57
ご清聴ありがとうございました

わんくま同盟 大阪勉強会 #57

More Related Content

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