メタプログラミング.NET
2,816円 (2,560円+税)
関連サイト
本書の詳細ページが用意されています。
内容紹介
私たちはメタプログラミングが好きだ。アプリケーションに新しいアスペクトを簡単に追加できるすばらしいコードを書きたい。実行時にコードを最適化して、実行速度を上げられるようにしたい。コードを分析してコンパイル前に問題点を見つけられるようにしたい。スキーマに対するテンプレートコードの中身を実行時に作り、さらにその場でコンパイルもして高速に実行できるようにしたい。メタプログラミングは、これらすべての目標を実現するための力になる。そして、みなさんにもメタプログラミングを好きになってもらってより高い目標を達成してほしい。実際、この本を読んだあと、異なる角度から、そしてより抽象的なレベルからコードを見直そうという熱意を持っていただけたらと私たちは思っている。
率直に言って、Rubyなどの言語と比べると、.NETはメタプログラミングしやすい環境ではない。少なくとも、初めてメタプログラミングに取り組んだときはそう感じるだろう。PythonやRubyなどの動的言語はコードを簡単に操作できるように作られており、そのような考え方が言語のなかの主要な特徴として認められている。C#やVisual Basic.NETは、普通はダイナミックだとも柔軟性が高いとも評価されていない。しかし、意外にも、.NETには本物のメタプログラミングをするための方法が多数用意されている。最初は自明ではないし、簡単ではないかもしれないが、メタプログラミング機能は、ほとんどあらゆる場所に隠れている。.NETのメタプログラミング機能の一部は、CLR(共通言語ランタイム)に焼きこまれている。別の一部は、FCL(フレームワーククラスライブラリ)に含まれている。さらに、一部のメタプログラミング機能は、C#やVisualBasic.NETの言語機能の一部として含まれている。これらの機能の仕組みが理解できたら、まったく新しい視点から問題を見られるようになっていく。
(「前書き」より)
書誌情報
- 著者: Kevin Hazzard, Jason Bock, 長尾高弘(翻訳)
- 発行日: 2013-08-30 (紙書籍版発行日: 2013-08-30)
- 最終更新日: 2013-08-30
- バージョン: 1.0.0
- ページ数: 360ページ
- 対応フォーマット: PDF, EPUB
- 出版社: KADOKAWA/アスキー・メディアワークス
対象読者
.NETプログラマ、フレームワークなどの開発に興味のある方
著者について
Kevin Hazzard
Kevin HazzardはCapTech Consultingの取締役である。CapTechは、バージニア州リッチモンドに本社を置き、375名のコンサルタントを抱える経営コンサルティング、ソフトウェア開発会社で、フィラデルフィア、シャーロット、ワシントンDCに支社がある。Kevinは、Windows Azure MVPグループに移る前は、長年にわたってMicrosoft C# MVPだった。最近はかなりクラウドのことを考えることが多くなってきているが、Kevin自身は自分のことを言語屋だと思っており、F#やPythonなどの関数型言語、動的言語に関心を集中させている。
Jason Bock
Jason Bockは、Magenicの主席コンサルタントで、Microsoft C# MVPである。C#、.NET、Javaなど、さまざまなプラットフォーム、言語を使っていくつものビジネス・アプリケーションを作ってきた。『Applied .NET Attributes』(Apress, 2003)、『CIL Programming: Under the Hood of .NET』(Apress, 2002)、『Visual Basic 6 Win32 API Tutorial』(Wrox, 1998)の著者でもある。ソフトウェア開発について無数の論文を書き、さまざまなカンファレンス、ユーザーグループでプレゼンテーションを行っている。Twin Cities Code Campのリーダーでもある。Jasonはマルケット大学から電気工学修士の学位を取得している。
長尾高弘
目次
序文
前書き
謝辞
この本について
- ロードマップ
- 対象とする読者
- 凡例とコードのダウンロード方法
- 著者について
- カバーのイラストについて
第1部 メタプログラミングの秘密のベールをはがす
第1章 メタプログラミングの概念
- 1.1 メタプログラミングの定義
- 1.2 メタプログラミングの実例
- 1.2.1 スクリプティングによるメタプログラミング
- 1.2.2 リフレクションによるメタプログラミング
- 1.2.3 コード生成によるメタプログラミング
- 1.2.4 動的オブジェクトによるメタプログラミング
- 1.3 まとめ
第2章 リフレクションでコードとメタデータを探る
- 2.1 リフレクションが必要な理由
- 2.1.1 拡張可能なアプリケーションを作る
- 2.1.2 実行時にコードメンバーを操作する
- 2.2 メタデータの読み出しとコードの実行
- 2.2.1 出発点を手に入れる
- 2.2.2 メンバー情報を見つける
- 2.2.3 属性データを集める
- 2.2.4 コードを実行する
- 2.3 リフレクションの不適切な使い方
- 2.3.1 リフレクションのパフォーマンス上の問題
- 2.3.2 リフレクションの危うさ
- 2.4 リフレクションの実際的な使い方
- 2.4.1 WCFで既知の型を自動的に登録する
- 2.4.2 ToStringをダイナミックに実装する
- 2.4.3 オブジェクトの任意のメソッドを呼び出す
- 2.4.4 リフレクションサンプルの簡単なまとめ
- 2.5 まとめ
第2部 コード生成のテクニック
第3章 T4(Text Template Transformation Toolkit)
- 3.1 テンプレートとしてのジェネリック
- 3.2 T4入門
- 3.2.1 T4の構文の基礎
- 3.2.2 T4のブロックタイプ
- 3.2.3 T4はどのようにしてテンプレートブロックをつなぎ合わせるのか
- 3.2.4 T4の式制御ブロック
- 3.2.5 T4略史
- 3.3 役に立つT4サンプルをさらに
- 3.3.1 テンプレートは美しくなければならない
- 3.4 T4の基礎知識
- 3.4.1 ディレクティブとテキストブロック
- 3.4.2 制御ブロック
- 3.4.3 インデントの処理
- 3.5 Visual StudioとT4の連携
- 3.5.1 T4は単一ファイルジェネレータ拡張ポイントをどのように使うか
- 3.5.2 Visual StudioからT4テンプレートを作る
- 3.5.3 templateディレクティブについてさらに
- 3.5.4 outputディレクティブの使い方
- 3.5.5 T4を使ってVisual Basicをダイナミックに生成する
- 3.6 まとめ
第4章 CodeDOMを使ったコード生成
- 4.1 CodeDOMとは何か
- 4.1.1 CodeDOMの構成と型
- 4.1.2 文と式はどのようにつながっているのか
- 4.2 コードプロバイダクラス
- 4.2.1 コードプロバイダのインスタンス生成
- 4.2.2 コードジェネレータがサポートできるオプション
- 4.2.3 コードプロバイダのサービス
- 4.3 コードグラフにオブジェクトを追加する
- 4.3.1 インポート付きの名前空間を作る
- 4.3.2 名前空間にクラスを追加する
- 4.3.3 クラスにコンストラクタを追加する
- 4.3.4 メンバーに文を追加する
- 4.3.5 クラスにプロパティを追加する
- 4.4 CodeDOMを使ったメタプログラミング
- 4.4.1 分岐ロジック
- 4.4.2 メンバーを参照する
- 4.4.3 メソッド呼び出し
- 4.4.4 アセンブリのコンパイル
- 4.4.5 ダイナミック起動
- 4.5 まとめ
第5章 Reflection.Emitによるコード生成
- 5.1 なぜEmitterクラスなのか
- 5.1.1 DSLのサポート
- 5.1.2 リフレクションコードをILへ
- 5.1.3 使っている言語がサポートしていない.NETの機能を使う
- 5.2 アセンブリの内部構造の概要
- 5.2.1 高水準言語の変換
- 5.2.2 アセンブリ内のメンバーのレイアウトとキーワード
- 5.3 オペコード弾丸ツアー
- 5.3.1 オペコードのニーモニックパターン
- 5.3.2 ローカル変数の使い方
- 5.3.3 フィールドにアクセスする
- 5.3.4 オブジェクトを作る
- 5.3.5 メソッドを呼び出す
- 5.3.6 フロー制御
- 5.3.7 例外処理
- 5.4 ダイナミックアセンブリを作る
- 5.4.1 ToString()のダイナミックバージョンを作る
- 5.4.2 デバッグサポートを追加する
- 5.4.3 peverifyによる結果のチェック
- 5.4.4 ILDasmを使ってずるをする
- 5.5 ダイナミックメソッドによる軽いコード生成
- 5.5.1 アセンブリを作るのでは負担が重すぎるとき
- 5.5.2 shim メソッドを作る
- 5.5.3 パフォーマンスを上げるキャッシング
- 5.5.4 DynamicMethodの欠点
- 5.6 まとめ
第6章 式によるコード生成
- 6.1 式指向プログラミング
- 6.1.1 データとしてのコード
- 6.1.2 式はメタプログラミングの主流になっている。
- 6.2 LINQ式でダイナミックメソッドを作る
- 6.2.1 LINQ式とは何か
- 6.2.2 実行時に式を生成する
- 6.2.3 DynamicMethodとの比較
- 6.3 式の効果的な使い方
- 6.3.1 式のデバッグ
- 6.3.2 式ツリーを書き換える
- 6.4 式ツリーを進化させる
- 6.4.1 遺伝的プログラミングのエッセンス
- 6.4.2 式にGAを応用する
- 6.5 まとめ
第7章 ILの書き換えによるコード生成
- 7.1 コード注入の利点
- 7.1.1 コードパターンの反復的な実装
- 7.1.2 コードの再構成(コード契約)
- 7.2 注入フレームワークを作る
- 7.2.1 Cecilとは何か
- 7.2.2 Cecilによるコードの書き換え
- 7.2.3 MSBuildタスクを作る
- 7.3 注入されるコードのデバッグ
- 7.3.1 デバッグ時に何が起きるか
- 7.3.2 デバッグ情報をロード、保存する
- 7.3.3 デバッグ情報を追加するときの問題
- 7.3.4 注入されたコードにデバッグ情報を追加する
- 7.4 まとめ
第3部 言語とツール
第8章 DLR
- 8.1 もっとも単純なダイナミッククラス
- 8.1.1 ExpandoObjectクラス
- 8.1.2 DynamicObjectクラス
- 8.1.3 ODataをダイナミックにパースする
- 8.2 DLRホスティングモデル
- 8.2.1 ランタイム、エンジン、スコープ
- 8.2.2 アプリケーションにルールエンジンを追加する
- 8.3 まとめ
第9章 言語とツール
- 9.1 メタプログラミング機能のある言語
- 9.1.1 C#と式の限界
- 9.1.2 Booとメタプログラミング
- 9.1.3 Nemerleとメタプログラミング
- 9.2 メタプログラミングがしやすくなるツール
- 9.2.1 Spring.NETについて
- 9.2.2 Spring.NETでプロパティが使われたときに通知する
- 9.2.3 PostSharpについて
- 9.2.4 PostSharpでオブジェクトの作成プロセスに割り込む
- 9.2.5 Equals()とGetHashCode()を実装する
- 9.2.6 PostSharpの内部構造
- 9.3 まとめ
第10章 .NETコンパイラを管理する
- 10.1 コンパイラを開く
- 10.1.1 現在のコンパイラ:ブラックボックス
- 10.1.2 メタプログラミングに対する障害
- 10.1.3 Roslynが提供するもの:ホワイトボックス
- 10.1.4 CTPには何が含まれているか(そして含まれていないか)
- 10.2 Roslynの基礎
- 10.2.1 スクリプトエンジンで小さなコードを実行する
- 10.2.2 Roslynを使ってダイナミックアセンブリを作る
- 10.2.3 モックとは何か
- 10.2.4 モックコードを生成する
- 10.2.5 モックコードをコンパイルする
- 10.2.6 ツリーを理解するために
- 10.3 Visual Studioにコードを組み込む
- 10.3.1 IsOneWay警告を作る
- 10.3.2 コードイシューを定義する
- 10.3.3 OneWayOperationのコードアクションを定義する
- 10.3.4 コードイシュープロバイダの結果を確かめる
- 10.3.5 コードの自動リファクタリング
- 10.3.6 コードを整形し直すアルゴリズム
- 10.3.7 リファクタリングプロジェクトのコアの部分を定義する
- 10.3.8 コードアクションを作る
- 10.3.9 リファクタリングプロジェクトの結果を確かめる
- 10.4 まとめ
付録A Windows 8でのメタプログラミング
- A.1 コード生成の制限
- A.2 Expression はサポートされている
- A.3 リフレクションに関する変更