.NET Framework 4.0 世代の Expression Trees

Slides:



Advertisements
Similar presentations
内部ドメイン専用言語支援のため の 型に連動した字句・構文ルールの 変更機構 理学部 情報科学科 千葉研究室 07_02363 市川 和央 指導教員 千葉 滋 教授 1.
Advertisements

ユーザ定義演算子による 内部 DSL の構成法 市川 和央 千葉 滋 東京工業大学大学院 1. Domain Specific Language (DSL) 用途に応じたミニ言語 select name from register where age < 30 SQL hello : hello.c.
本プレゼンテーション ( 以下、本書 ) で提供されている情報は、本書が 発表された時点における Microsoft の見解を述べたものです。市場 ニーズの変化に対応する必要があるため、本書は記載された内容の実 現に関する Microsoft の確約とはみなされないものとします。また本 書に記載された情報の正確さについて、保証するものではありません。
IIS 4.0で開発をするコツ Webアプリケーション構築.
情報理工学部 情報システム工学科 3年 H 井奈波 和也
JPAを利用した RESTful Webサービスの開発
.NET テクノロジー を利用した SAP ソリューションの拡張 (3階層化) (評価環境構築ガイド)
プログラミング言語としてのR 情報知能学科 白井 英俊.
Visual Studio 2005による XML Web サービス入門
背景 我々の研究室で開発しているJavaプログラム解析フレ ームワークでは,解析情報はメモリ上に保持される 問題点
Javaのための暗黙的に型定義される構造体
C# 3.0をはじめよう!!.
プログラミングパラダイム さまざまな計算のモデルにもとづく、 プログラミングの方法論 手続き型 関数型 オブジェクト指向 代数 幾何.
コンポーネントの再利用に必要な情報 えムナウ (児玉宏之)
コンポーネントの再利用に必要な情報 えムナウ (児玉宏之)
アルゴリズムとデータ構造1 2007年6月12日
Biac /10/25 DI コンテナの本懐 ~ IoC の実装も楽々! biac
ASP.NET開発標準化を考えてみよう! わんくま同盟 東京勉強会# /03/15 mxb & 片桐継.
haXeでオリジナルコンポーネント作り WCAN mini Vol 小笠原
T-SQL の Parse と Generate
はじめてのASP.NET 楽しいアプリ制作の会 #1 TWorks.
C# の現在・過去・未来 えムナウ (児玉宏之)
C#とC++とオブジェクト指向 上甲 健史.
.NET テクノロジー を利用した SAP ソリューションの拡張 (3階層化) (評価環境構築ガイド)
Biac /10/ /10/25 DI コンテナの本懐 ~ IoC の実装も楽々! biac
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
プログラミング言語入門 手続き型言語としてのJava
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
Windows Azure (CTP) 触ってみた
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
静的型付きオブジェクト指向言語 のための 暗黙的に型定義されるレコード
暗黙的に型付けされる構造体の Java言語への導入
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也.
R流・C#マルチスレッドの復讐 2009年05月16日 R・田中一郎
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
C# の現在・過去・未来 えムナウ (児玉宏之)
インラインスクリプトに対するデータフロー 解析を用いた XHTML 文書の構文検証
プログラミング言語入門.
.NET Framework 3.0 概要 (旧称 : WinFX)
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
COM コンポーネント・オブジェクト・モデル.
Windows Azure (CTP) 触ってみた
もっと詳しくArrayクラスについて調べるには → キーワード検索
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
NGK2013B – 名古屋合同懇親会 2013忘年会 – Kouji
EntityManager と EJB QL EJB 3.0 コース 第8回 2006年8月5日.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
C#プログラミング実習 第3回.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
アルゴリズムとデータ構造1 2009年6月15日
メンバとメソッド C言語の構造体 変数の集まり C#言語のクラス + それを処理する関数の集まり フィールド または メンバ変数 メンバ
統合開発環境のための プログラミング言語拡張 フレームワーク
JAVA入門⑥ クラスとインスタンス.
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
cp-1. クラスとメソッド (C++ オブジェクト指向プログラミング入門)
アルゴリズムとデータ構造 2010年6月17日
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
C#プログラミング実習 第1回.
1.2 言語処理の諸観点 (1)言語処理の利用分野
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
Presentation transcript:

.NET Framework 4.0 世代の Expression Trees September 26th, 2009 渋木宏明(ひどり) Microsoft MVP for C#

自己紹介

プロフィール 名前 出身地 職業 技術分野 渋木宏明(ひどり) 東京都 フリーランスの開発者 Visual C#, Windows.Forms

コミュニティ活動 ホームページ ブログ Twitter その他 http://hidori.jp/ http://hidori.jp/blog/ Twitter http://twitter.com/hidori その他 Microsoft MVP for Visual C# VSUG ボードリーダー 「C++/CLI その他掲示板」

アジェンダ はじめに .NET Framework 3.5 SP1 世代の Expression Trees .NET Framework 4.0 Beta1 世代の Expression Trees まとめ

はじめに

Expression Trees とは? 式 を木構造で表わしたモノ 一般的には「式木」と訳されているハズ MSDN ライブラリでは、Expression Trees の訳語として「式ツリー」が採用されている

(例)式を木構造で表わす * + a 1 - b 3 (a + 1) * (b - 3) ※ 木構造は、演算子の優先度などを反映している。

.NET Framework 3.5SP1 世代の Expression Trees

.NET Framework 3.5SP1 における Expression Trees LINQ の超重要な基盤技術の1つ System.Linq.Expressions 名前空間が新設され、「式ツリー」を扱うためのクラス・列挙子などが追加された

System.Linq.Expressions 名前空間の メンバによる「式ツリー」の特徴 「式ツリー」の各ノードは、Epxression クラスの派生型で表わす 「式ツリー」は、Epxression クラスの静的メソッドを利用して構築する 「式ツリー」は、実行時に匿名デリゲートに変換することができる → いわゆる「数学的な関数」を動的に作成することが可能

LINQ? 統合言語クエリ(Language Integrated Query) VB, C# などのソースコード中に、SQL 似の構文でデータ操作を記述するための仕組み 「LINQ プロバイダ」が提供されている様々なデータソースを、ほぼ同じような記述で操作することができる 標準で以下のデータソースが利用可能( .NET Framework 3.5SP1 リリース当初) LINQ to Object (一般的なデータクラスを操作) LINQ to SQL (SQL Server 上のデータを操作) LINQ to XML (XML 文書のデータを操作)

こんな風にデータ操作 // LINQ によるクエリ var query = from x in table where x.Age > 30 select x; // クエリ結果を表示 foreach (var person in query) { Console.Out.WriteLine(person.Name); }

こんな風に検索することが出来る var query =

LINQ の基盤技術 クエリ構文 SQL 似の構文でデータ操作を記述 拡張メソッド 既存の型に対してメソッドを追加(見掛け上) 匿名型 型宣言なしでデータクラスを使用 暗黙的に型指定されるローカル変数 var キーワードによる、型名の記述を省いた変数宣言 ラムダ式 名前の無い計算式を記述 ラムダ式を書いただけでは、計算は実行されない 式ツリー 条件式などの内部表現

LINQ のココが式ツリー ココ ココとか var query = from x in table where 30 > x.Age select x; ココ ココとか var query = table .Where(x => 30 > x.Age);

条件式・選択式、ラムダ式 → 式ツリー or 匿名デリゲート コンパイラ x.Age > 30 x => x.Age > 30 匿名デリゲート 式ツリー

式ツリーの応用 条件式を動的に作成、クエリを実行 計算式を動的に作成、実行 式木そのものを処理対象とする チェックボックス、コンボボックスなどで与えられる複合条件から式木を作成して、クエリを実行 計算式を動的に作成、実行 業務系ではあまりそういうニーズは無い? 式木そのものを処理対象とする 岩永(ufcpp)さんのホームページで紹介されている「式木を微分」のサンプル http://ufcpp.net/study/csharp/sp3_expressionsample.html

こんなデータがあるとして… /// <summary> /// 「名前」と「年齢」を格納するデータクラス class Person { public string Name { get; set; } public int Age { get; set; } } // テストデータ var table = new[] new Person { Name = "ailight", Age = 30}, new Person { Name = "hidori", Age = 29}, new Person { Name = "kazuk", Age = 35}, };

条件式を動的に作成 // ラムダ式 ‘_ => _.Age > 30’ と等価な式ツリーを作成 static Expression<Func<Person, bool>> BuildExpression() { // ラムダ式のパラメータ '_‘ var param = Expression.Parameter(typeof(Person), "_"); // 比較式 '_.Age > 30‘ var left = Expression.Property(param, "Age"); var right = Expression.Constant(30); var body = Expression.GreaterThan(left, right); // ラムダ式を返す return (Expression<Func<Person, bool>>)Expression.Lambda(body, new[] { param }); }

動的に作成した条件式でクエリを実行 // ラムダ式を動的に生成 var lambda = BuildExpression(); // ラムダ式から匿名デリゲートを作成 var del = lambda.Compile(); // クエリに、動的に作成された条件式を与える // LINQ to SQL の場合は直接 lambda を与える var query = table.Where(del); // クエリ結果を表示 foreach (var person in query) { Console.Out.WriteLine(person.Name); }

計算式を動的に作成 // ラムダ式 ‘x => x * x’ と等価な式ツリーを作成 static Expression<Func<int,int>> BuildExpression() { // ラムダ式のパラメータ 'x‘ var param = Expression.Parameter(typeof(int), "x"); // 乗算式 'x * x‘ var body = Expression.Multiply(param, param); // ラムダ式を返す return (Expression<Func<int, int>>)Expression.Lambda(body, new[] { param }); }

動的に作成した計算式を実行 // ラムダ式を動的に生成 var lambda = BuildExpression(); // ラムダ式から匿名デリゲートを作成 var del = lambda.Compile(); // 計算式を実行 var result = del(7); // 計算結果を表示 Console.Out.WriteLine(result);

.NET Framework 4.0 世代の Expression Trees

.NET Framework 4.0 における Expression Trees DLR の超重要な基盤技術の1つ System.Linq.Expressions 名前空間のメンバが追加・拡張され、「構文木(Abstraction Syntax Trees)」を扱うことができるようになった (後方互換性は保たれている)

DLR? 各言語でバラバラに実装されている構文木やデータ型を統合、.NET での動的言語実装を強力に支援 動的言語ランタイム(Dynamic Language Runtime) 各言語でバラバラに実装されている構文木やデータ型を統合、.NET での動的言語実装を強力に支援 現在、DLR を利用して実装された、以下の動的言語が CodePlex で公開されている IronPython IronRuby

DLR の基盤技術 ※ 正式な発表がまだ行われていないので、上図はかなりアバウトなものです。 動的オブジェクト型 実行時にプロパティやメソッドを追加・削除することが可能 名前によるメンバアクセスを簡素化 名前管理 各言語間の名前(変数名、クラス名などなど)の相互運用を助ける辞書的な機構 式ツリー (拡張版) 条件式などの内部表現 条件判断やループなどの制御構造が追加された ※ 正式な発表がまだ行われていないので、上図はかなりアバウトなものです。

「よくある」 プログラミング言語の処理フロー 構文木 { } var result for = i <= 10 ++ += var result = 0; for (i = 1; i <= x; i++) { result += i; } その場で解釈実行 →動的言語 実行形式を生成 → 静的言語(コンパイラ)

DLR 登場以前 各言語で実装 Python で記述された プログラム Python 独自の構文木 実行 Ruby で記述された プログラム

DLR 登場以後 各言語で実装 DLR CLR ※ 少し大げさに表現しています。 Python で記述された プログラム 実行 Ruby で記述された プログラム Ruby 独自の構文木 実行 ※ 少し大げさに表現しています。

System.Linq.Expressions 名前空間 に対する拡張 「構文木」は、実行時に匿名デリゲートに変換することができる →制御構造を含んだ、いわゆる「メソッド」を動的に作成することが可能

構文木(拡張された式ツリー)の応用 制御構造を含む計算式を動的に作成、実行 おれおれスクリプト言語の作成基盤 再帰ではマズイような場合? おれおれスクリプト言語の作成基盤 他言語との相互運用を考えなければ、DLR のすべての機能を使わなくてもおk? アプリケーションの「ふるまい」を動的に変更 ちょっと漠然としてる??

デモ おれおれスクリプト言語的なモノを作ってみた。

まとめ

渋木宏明(ひどり)の結論 .NET Framework 4.0 世代の Expression Trees は、メタプログラミングのための強力なツール DLR の下請けとして埋もれさせるのはモッタイナイ! アプリケーション上層で頻繁に使うものではないが、「ハマった」時の効果は絶大なものがある(かもしれない) Visual Studio 2010 Beta2 リリースの噂が囁かれているので、余裕のある人は是非お試しを

リソース MSDN ライブラリ 岩永(ufcpp)さんのブログ 湯川(NyaRuRu)さんのブログ System.Linq.Expressions 名前空間 (3.5SP1) http://msdn.microsoft.com/ja-jp/library/system.linq.expressions.aspx System.Linq.Expressions 名前空間 (4.0Beta1) http://msdn.microsoft.com/en-us/library/system.linq.expressions(VS.100).aspx 岩永(ufcpp)さんのブログ 式木 http://ufcpp.net/study/csharp/sp3_expression.html 湯川(NyaRuRu)さんのブログ 全てが式になる,全てが木になる,全てが式木になるhttp://d.hatena.ne.jp/NyaRuRu/20071230/p1

そろそろ起きる時間ですよ (^o^) Q&A

fin. ご静聴ありがとうございました