VisualStudio 技術解説 – 動的生成

コードの動的生成技法とは、Visual Studioにおいては、T4テンプレートでソースコードを自動生成したり、IL命令からアセンブリを動的に自動生成したりする、コードでコードを生成して利用する技法の事です。動的生成を行うと、人力で延々と似たようなコードを書かざるを得ない状況を自動処理する事が出来るため、適切に使えば強力な開発技法となります。

例えば、似たような、しかし厳密には異なるクラスを大量に生成する必要があったとします。System.Reflection.Emitの各クラスを使用すると、実行時に動的にアセンブリを生成する事が出来ます。また、式木(Expression-Tree)を使用すると、もう少し論理的な整合性のある環境で、動的にコードを生成することが出来ます。.NETでは、本来は、オブジェクト指向設計等の、静的な(コンパイル時に解決可能な)手法でこれを回避すべきですが、不可能なケースも存在します。そのような場合には一考の価値があります。

また、動的生成を行う過程で、ほぼ必ず動的な解析も実施する必要があります。.NETでは「リフレクション」の機構を使用して、コードを動的に解析する事が出来ます。本来、技術的な順序は逆で、動的解析→動的生成ですが、ここではこれらもひっくるめた技術全般を扱います。


山椒の味は大人の味

このプレゼンは、名古屋合同懇親会2013BのLTで登壇した時のスライドです。この懇親会はいわゆる「忘年会」なので、思いっきりネタですが、CLRやILの興味深い面を披露出来たと思います。

技術レベル:300

オリジナルスライド:山椒の味は大人の味.pptx

なお、ここで示した内容は、つい最近になって、標準ライブラリに「RuntimeHelpers.GetHashCode」なるメソッドがある事に気が付き、ネタとして微妙な事が判明しました (;´Д`)


Advent LINQ 2013 (後半)

Advent LINQ 2013の後半の記事は、IQueryableインターフェイスで実現されるLINQプロバイダーの実装に焦点を置いて解説しています。LINQプロバイダーがLINQクエリを動的に解析(式木を使います)し、外部のデータサービスに論理的な要求を送信する過程は、式木を使う動的生成技術としての参考になると思います。

技術レベル:400~500

Advent LINQ (12): リファクタリング可能なメンバ名
Advent LINQ (13): ExpressionとLINQ
Advent LINQ (14): 条件式が実行される場所
Advent LINQ (15): SQL表現可能な式
Advent LINQ (16): 表形式と構造化形式
Advent LINQ (17) : Expressionの評価
Advent LINQ (18) : Expressionの探索
Advent LINQ (19) : Expressionのコンパイルと独立性
Advent LINQ (20) : IEnumerableとIQueryableの相互変換
Advent LINQ (21) : LINQプロバイダー
Advent LINQ (22) : 解釈するクエリの範囲
Advent LINQ (23) : 事前評価可能な式
Advent LINQ (24) : The Provider Core
Advent LINQ (25) : LINQプロバイダーの仕上げ


メタプログラミングでEXCEL仕様書よ、さらば!

「メタプログラミングでEXCEL仕様書よ、さらば!」は、.NETのメタプログラミング技法を使用して、俗にいう「EXCEL仕様書」から如何に脱却するか、を解説したプレゼンです。Center CLR勉強会で解説しました。

技術レベル:300~400

オリジナルスライド:メタプログラミングでEXCEL仕様書よさらば10.pptx
サンプルコード:GitHub


抽象太郎ものがたり そして伝説へ

このプレゼンは、名古屋合同懇親会2014BのLTで登壇した時のスライドです。この懇親会はいわゆる「忘年会」なので、思いっきりネタですが、CLRやILの興味深い面を披露出来たと思います。

技術レベル:300

オリジナルスライド:抽象太郎ものがたり_e.pptx
GitHub: CenterCLR.StaticMethodInInterface


Hello! Intermediate Language

このプレゼンは、第一回三重合同懇親会のLTで、ILについて超高速プレゼンした時の物です。スライドにはスタックマシンの解説が(ほんの少しだけ)載っています。あとはかなり無理ゲーなライブデモを行いました。デモはここでは再現出来ません (;´Д`) が、GitHubにコードが上げてあるので参考にどうぞ。

技術レベル:300

オリジナルスライド:Hello_Intermediate_Language.pptx
GitHub:CenterCLR.EmitLiveDemo


Roslyn for Scriptingで、あなたのアプリケーションにもC#スクリプトを!!

この記事は、間もなく正式リリースとなるVisual Studioのコンパイラ基盤である「Roslyn」を使って、C#のスクリプト実行環境を、きわめて簡単に実現しようという解説です。

技術レベル:200~300

Roslyn for Scriptingで、あなたのアプリケーションにもC#スクリプトを!!
真・Roslyn for Scriptingで、あなたのアプリケーションにもC#スクリプトを!!


ChalkTalk CLR – 動的コード生成技術(式木・IL等)

ChalkTalkという、Center CLR勉強会の派生勉強会での、ディスカッションのまとめです。
小規模で開催しました。ILの基礎と式木の基礎の話を、参加者全員でディスカッションして理解を深めた話です。

技術レベル:200~350

ChalkTalk CLR – 動的コード生成技術(式木・IL等)


式の体を成して無い式を式の体を成すように式と式木で何とかする式

.NET 3.5での式木サポートで足りない部分をどうやって補うのか、を考えたネタです。
NGK2015Bで登壇した際のスライドと、後で改めて詳しく解説したものです。

技術レベル:350~450

オリジナルスライド:式の体を成して無い式を式の体を成すように式と式木で何とかする式.pptx

後日、改めて詳しく解説した記事:真・式の体を成して無い式を式の体を成すように式と式木で何とかする式


ILのキホン

IL (Intermediate Language – 中間言語)についてのワークショップ形式の勉強会の資料です。初回と仕切り直しの計2回実施しました。詳細は各ページを参照して下さい。

技術レベル:250~350

ILのキホン – 第五回Center CLR年末会
真・ILのキホン – 第六回 Center CLR 勉強会

以下のスライドは仕切り直しの版です。


Beachhead implements new opcode on CLR JIT

.NET Core 1.0が公開された記念に、coreclrの実装に自分で考えた新しいOpCodeを加える方法について解説しました。.NET Fringe JAPAN 2016にて登壇して発表しました。

技術レベル:500

.NET Fringe JAPAN 2016も絡めた記事はこちら


Nespのコード生成

Lisp-likeな関数型プログラミング言語を.NET上で実装した話です。NespのパーザーからExpressionクラスを使用してコードを生成する際の型推論の問題についての考察を発表しました。
ML勉強会 #2 https://ml-lang.connpass.com/event/58151/
Nesp – A Lisp-like lightweight functional language on .NET

技術レベル:400


Making archive IL2C

IL2Cをフルスクラッチで設計していくビデオシリーズです。現在進行形です。

Making archive IL2C #6-4で、一番ミニマムなIL2Cが出来ました。まだ非常に限定されたILしかサポートしていませんが、このシリーズでリフレクションの使い方・ILについての洞察・C言語によるソースコードとの整合性・極限までコンパクトなコード生成を行うための考慮点など、非常に雑多でDeepなメタプログラミングの技術を一から紹介します。

技術レベル:300-600

Making archive IL2C – Center CLR YouTube playlist

GitHub IL2C repository

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください