SlideShare une entreprise Scribd logo
1  sur  36
Télécharger pour lire hors ligne
動的なILの生成/編集
terurou
2013/07/20
目次
• 自己紹介
• IL生成の予備知識
• ILの生成方法
• Windows Store AppsでのIL生成
• まとめ
自己紹介
7月から無職してます。
技術領域
• Haxe/JavaScriptとかWindows Store Appsとか
WPFとかSilverlightとかできます。
• Haxe/JavaScriptは「なごやまつり」で話す予定です。
• ギョーム系DataGridの実装に定評があります。
• たぶんシステムアーキテクチャ設計が本業です。
• 最近はF#でWebSocketサーバを試作してました。
コミュニティ活動 - DSTokaiとNGK
• DSTokai : 東海地方のメタコミュニティ
• IT系イベントカレンダーとコミュニティ連絡用ML
• http://go.dstokai.info/
• NGK : なごや ごうどう こんしんかい
• 毎年忘年会を開催しています
• 一昨年は100人、去年は120人
• ちなみに今年は12/7に開催予定
• 花見はここ数年サボってます
ILと私
• IronPythonとSilverlight2でR&D(3年前)
• Silverlight上でScalaアプリを実行(2年前)
• Silverlightアプリを動的生成(1年半前)
• Store AppsからDesktop用EXE生成(1年前)
• その他、.NETのお仕事で仕方なく…
IL生成の予備知識
photo: http://www.flickr.com/photos/seditiouscanary/1279041211/, CC BY-NC-ND 2.0
ILとは
• .NETのアセンブリ言語
• IL = Intermediate Language = 中間言語
.assembly extern mscorlib {
.publickeytoken = (b7 7a 5c 56 19 34 e0 89)
.ver 4:0:0:0
}
.assembly Test {
.hash algorithm 0x00008004
.ver 1:0:0:0
}
.module Test.exe
.class auto ansi Test.Program extends [mscorlib]System.Object {
.method static void Main (string[] args) cil managed {
.maxstack 8
.entrypoint
IL_0000: ldstr "Hello World"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret
}
}
.NETとILの関係図
Compiler
ilasm
ildasm
CLR
icons: http://www.gentleface.com/, CC BY-NC 3.0
C#, VB,
F#, ...
IL
Assembly Native
実行
Assembly(PE:Portable Executable)
.NETの実行バイナリ(EXE, DLL)
ilasm
ILアセンブラ
.NET Frameworkに標準付属
ildasm
IL逆アセンブラ
.NET Frameworkに標準付属
動的なILの生成
.NETにはILを動的(アプリ実行時)に生成するAPIが
標準で備わっています。
• 静的な型やメソッドの作成
• 生成したILの即時実行
• Assembly(EXE, DLL)の生成・保存
• 既存APIの編集(Monkey Patching)は不可能
• 別の手段を使えば編集することも可能
IL生成の利用例
• 処理の高速化
• 動的メソッドコール(Reflection)
• シリアライザ(動的に静的型を生成)
• 透過プロキシやMockの内部実装
• アスペクト指向/Weaving
• 自作コンパイラのバックエンド
本当にIL生成が必要か?
• IL生成は黒魔術
• 利用例で紹介した通り、必要な個所は限定される
• 問題点も多い
• 低レベルAPI
• 可読性やメンテナンス性の低下
• プログラミング言語の型制約の無視できる
• 型安全ではなくなり、品質保証にコストがかかる
IL生成の前に検討すべきもの
• デザインパターンやIoC Container
• コードの書き方で逃げられないか?
• T4テンプレート(自動コード生成)
• コンパイル前にどうにかならないか?
• System.Dynamic(C# 4.0のdynamic型)
• 動的プロパティや動的メソッドコール等で利用
• 内部的には実行時に自動でILを生成している
• 下手に手書きでILを生成するよりも高速
• F#(高度な型システム, TypeProvider)
• C#やVBの型システムが貧弱だからなのでは??
ILの生成方法
IL生成の基本的な手順
1. C#でひな形コードを書いてビルド
2. Assemblyを逆アセンブリ
• ildasmやILSpy等を利用する
3. 逆アセンブリした結果を見ながらコードを書く
逆アセンブリツール
• ILSpy http://ilspy.net/
• 無償で使えておすすめ
• IL以外にもC#やVBへ逆アセンブリ可能
• ildasm
• .NET SDK標準ツール
• C:¥Program Files¥Microsoft SDKs¥Windows¥... に入っている
• .NET Reflector
• 有償($95)
API
• 標準API
• System.Reflectoin.Emit(.NET 2.0/1.1~)
• Sysytem.CodeDom(.NET 2.0/1.1~)
• System.Linq.Expressions(実質.NET 4.0~)
• 外部ライブラリ
• Mono.Cecil
• IKVM.Reflection
• CLR Profiling API
System.Reflection.Emit(.NET 2.0/1.1~)
• IL生成の基本的なAPI
• 動的に生成したILコードは即座に実行可能
• 低レベルAPIなのでプログラムが煩雑になる
• OpCodeを1つずつ埋め込むことが必要
• .NET 3.5までの環境ではこれを使うことになる
System.Reflection.Emitのコード例
Hello Worldを表示するだけのEXEを生成
var appDomain = AppDomain.CurrentDomain;
var assemblyBuilder = appDomain.DefineDynamicAssembly(
new AssemblyName("Test"),
AssemblyBuilderAccess.RunAndSave);
var moduleBuilder = assemblyBuilder.DefineDynamicModule("Test.exe");
var typeBuilder = moduleBuilder.DefineType("Program", TypeAttributes.Class);
var methodBuilder = typeBuilder.DefineMethod("Main", MethodAttributes.Static);
methodBuilder.SetParameters(typeof(string[]));
var il = methodBuilder.GetILGenerator();
var write = typeof(Console).GetMethod("WriteLine", new[] { typeof(object) });
il.Emit(OpCodes.Ldstr, "Hello World");
il.Emit(OpCodes.Call, write);
il.Emit(OpCodes.Ret);
typeBuilder.CreateType();
assemblyBuilder.SetEntryPoint(methodBuilder);
assemblyBuilder.Save("Test.exe");
System.CodeDom(.NET 2.0/1.1~)
• C#やVBのコンパイラAPI
• 即時実行可能(スクリプト的に利用できる)
• Assemblyの出力可能
• System.Reflection.Emitの置き換えにはらなない
• コンパイル時にオーバーヘッドが発生する
• 生成するILを動的に変更したい場合、文字列として
ソースコードを組み立てる必要がある
System.Linq.Expressions(実質.NET 4.0~)
• Expression Tree(式木)
• 式木とはいうものの、構文木(if文, for文など)もカバー
• System.Reflection.Emitよりも簡単
• ラムダ式からExpression Treeを構築できる
• Expression Treeを走査したり改変もできる
• .NET 4.0以降でIL生成といえばこれ
Expression<Action> exp =
() => { Console.WriteLine("Hello World"); }
System.Linq.Expressionsのコード例
Hello Worldを表示するだけのEXEを生成
var appDomain = AppDomain.CurrentDomain;
var assemblyBuilder = appDomain.DefineDynamicAssembly(
new AssemblyName("Test"),
AssemblyBuilderAccess.RunAndSave);
var moduleBuilder = assemblyBuilder.DefineDynamicModule("Test.exe");
var typeBuilder = moduleBuilder.DefineType("Program", TypeAttributes.Class);
var methodBuilder = typeBuilder.DefineMethod("Main", MethodAttributes.Static);
methodBuilder.SetParameters(typeof(string[]));
Expression<Action> exp = () => Console.WriteLine("Hello World");
exp.CompileToMethod(methodBuilder);
typeBuilder.CreateType();
assemblyBuilder.SetEntryPoint(methodBuilder);
assemblyBuilder.Save("Test.exe");
System.Linq.Expressionsのコード例
ラムダの書き換え(メッセージ出力を追加)
class SampleVisitor : ExpressionVisitor
{
protected override Expression VisitLambda<T>(Expression<T> node)
{
Expression<Action> post = () => Console.WriteLine("post");
return Expression.Lambda<Action>(Expression.Block(new Expression[] {
Expression.Invoke(node),
Expression.Invoke(post)
}));
}
}
var visitor = new SampleVisitor();
var result = visitor.Visit(exp);
var func = ((Expression<Action>)result).Compile();
func.Invoke();
Mono.Cecil
• Assembly(EXE, DLL)のRead/Write
• 生成時にデバッグシンボルの出力も可能
• Assemblyの解析、処理の挿入や改変
• リソースの挿入、差し替え
• 生成したILの即時実行は不可能
• Assembly保存→DLLとして読み込みなら可能
• コンパイラ, AOP, IL to JavaScript, ...
Mono.Cecilのコード例
Hello Worldを表示するだけのEXEを生成
var assembly = AssemblyDefinition.CreateAssembly(
new AssemblyNameDefinition("Test", new Version()),
"Test.exe",
ModuleKind.Console);
var module = assembly.MainModule;
var type = module.Types.First();
var method = new MethodDefinition(
"Main",
MethodAttributes.Static, module.Import(typeof(void)));
var il = method.Body.GetILProcessor();
var write = typeof(Console).GetMethod("WriteLine", new[] { typeof(object) });
il.Emit(OpCodes.Ldstr, "HelloWorld");
il.Emit(OpCodes.Call, module.Import(write));
il.Emit(OpCodes.Ret);
type.Methods.Add(method);
assembly.EntryPoint = method;
assembly.Write("Test.exe");
Mono.Cecilのコード例
全メソッドの末尾(retの前)にメッセージ出力を追加
var assembly = AssemblyDefinition.ReadAssembly("Test.exe");
var write = typeof(Console).GetMethod("WriteLine", new[] { typeof(string) });
assembly.Modules
.SelectMany(x => x.Types)
.SelectMany(x => x.Methods)
.ToList()
.ForEach(method => {
var il = method.Body.GetILProcessor();
var ldstr = il.Create(OpCodes.Ldstr, "Finish");
var call = il.Create(OpCodes.Call, method.Module.Import(write));
method.Body.Instructions
.Where(x => x.OpCode == OpCodes.Ret)
.ToList()
.ForEach(x => {
il.InsertBefore(x, ldstr);
il.InsertBefore(x, call);
});
});
assembly.Write("Test-Mod.exe");
Assembly内の全メソッドを取得
Console.WriteLine("Finish");を
挿入
IKVM.Reflection
• Assembly(EXE, DLL)のRead/Write
• 生成時にデバッグシンボルの出力も可能
• System.Reflectionに似たAPI
• 生成したILの即時実行は不可能
• Assembly保存→DLLとして読み込みなら可能
• Mono C#コンパイラのバックエンドで採用
CLR Profiling API
• .NET界でも最上級レベルの黒魔術
• 実行中に全APIをフックして処理の差し替えが可能
• 私は使ったことはありません
• 参考資料
• C# 動的メソッド入れ替え - Apply a monkey patch to
any static languages on CLR -
http://urasandesu.blogspot.jp/2011/10/c-apply-monkey-patch-to-any-static.html
Windows Store Appsでの
IL生成
photo: http://www.flickr.com/photos/mr_o/8028197750/, CC BY-NC-SA 2.0
.NET for Windows Store Apps
同じ.NETでも、Windows Store AppsとDesktopの
APIは大きく異なる
• 名前空間の整理、スリム化
• 非同期前提
• セキュリティ的に危険なAPIを徹底削除
IL関連のAPI
• System.Linq.Expressionsのみが存在
• System.Reflection.Emitは削除
• Assemblyを生成/ロードするAPIは削除
• ILを生成してもローカルキャッシュできない
• Assemblyは所詮バイト列なのでどうにかなる
• ロードできないので、生成しても自分で使えない
• Windows RTで自作.NETアプリが動作すれば…
まとめ
photo: http://www.flickr.com/photos/johncline/108863343/, CC BY-NC-ND 2.0
まとめ
極力、IL生成は避ける。
どうしてもIL生成したいのなら
• とりあえずSystem.Linq.Expressions
• 自由度が高く、APIもわかりやすい
• Mono.Cecilを使えばAssemblyの改変が捗る
• 採用しているOSSも多いので参考にしやすい
ご清聴ありがとうございました

Contenu connexe

Tendances

Tendances (20)

基礎から学ぶ組み込みAndroid
基礎から学ぶ組み込みAndroid基礎から学ぶ組み込みAndroid
基礎から学ぶ組み込みAndroid
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021
 
C++11やemscriptenと付き合って1年間の振り返り
C++11やemscriptenと付き合って1年間の振り返りC++11やemscriptenと付き合って1年間の振り返り
C++11やemscriptenと付き合って1年間の振り返り
 
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
 
Google Cloud のネットワークとロードバランサ
Google Cloud のネットワークとロードバランサGoogle Cloud のネットワークとロードバランサ
Google Cloud のネットワークとロードバランサ
 
ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
 
JavaでCPUを使い倒す! ~Java 9 以降の CPU 最適化を覗いてみる~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
JavaでCPUを使い倒す! ~Java 9 以降の CPU 最適化を覗いてみる~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...JavaでCPUを使い倒す! ~Java 9 以降の CPU 最適化を覗いてみる~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
JavaでCPUを使い倒す! ~Java 9 以降の CPU 最適化を覗いてみる~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
 
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
 
IL2CPPに関する軽い話
IL2CPPに関する軽い話IL2CPPに関する軽い話
IL2CPPに関する軽い話
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
 
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
 
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
 
C++からWebRTC (DataChannel)を利用する
C++からWebRTC (DataChannel)を利用するC++からWebRTC (DataChannel)を利用する
C++からWebRTC (DataChannel)を利用する
 
WFSのゲームエンジンの歴史と今後の戦略
WFSのゲームエンジンの歴史と今後の戦略WFSのゲームエンジンの歴史と今後の戦略
WFSのゲームエンジンの歴史と今後の戦略
 
Panamaを先取り!? JVMCIでJITと遊ぶ
Panamaを先取り!? JVMCIでJITと遊ぶPanamaを先取り!? JVMCIでJITと遊ぶ
Panamaを先取り!? JVMCIでJITと遊ぶ
 
GPU最適化入門
GPU最適化入門GPU最適化入門
GPU最適化入門
 
Unified JVM Logging
Unified JVM LoggingUnified JVM Logging
Unified JVM Logging
 
大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化
 
10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化10GbE時代のネットワークI/O高速化
10GbE時代のネットワークI/O高速化
 

Similaire à 動的なILの生成と編集

関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開
Hideki Takase
 
Intalio japan special cloud workshop
Intalio japan special cloud workshopIntalio japan special cloud workshop
Intalio japan special cloud workshop
Daisuke Sugai
 
「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺
Yusuke Wada
 
Intalio Cloud Workshop
Intalio Cloud Workshop Intalio Cloud Workshop
Intalio Cloud Workshop
Daisuke Sugai
 

Similaire à 動的なILの生成と編集 (20)

関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開
 
Entity Framework(Core)についての概要を学ぼう
Entity Framework(Core)についての概要を学ぼうEntity Framework(Core)についての概要を学ぼう
Entity Framework(Core)についての概要を学ぼう
 
.NET 6の期待の新機能とアップデート
.NET 6の期待の新機能とアップデート.NET 6の期待の新機能とアップデート
.NET 6の期待の新機能とアップデート
 
Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版
 
Getting started MySQL as Document Data Store
Getting started MySQL as Document Data StoreGetting started MySQL as Document Data Store
Getting started MySQL as Document Data Store
 
Intalio japan special cloud workshop
Intalio japan special cloud workshopIntalio japan special cloud workshop
Intalio japan special cloud workshop
 
Eclipse xtext 紹介
Eclipse xtext 紹介Eclipse xtext 紹介
Eclipse xtext 紹介
 
Groovyコンファレンス
GroovyコンファレンスGroovyコンファレンス
Groovyコンファレンス
 
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
 
The seminar of asp.net at 201908 sakurug
The seminar of asp.net at 201908 sakurugThe seminar of asp.net at 201908 sakurug
The seminar of asp.net at 201908 sakurug
 
Windows Phone / iOS / Android アプリ同時開発のススメ
Windows Phone / iOS / Android アプリ同時開発のススメWindows Phone / iOS / Android アプリ同時開発のススメ
Windows Phone / iOS / Android アプリ同時開発のススメ
 
「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺「新しい」を生み出すためのWebアプリ開発とその周辺
「新しい」を生み出すためのWebアプリ開発とその周辺
 
Yesod(at FPM2012)
Yesod(at FPM2012)Yesod(at FPM2012)
Yesod(at FPM2012)
 
Xamarin 紹介:Windows Phone / iOS / Android アプリ同時開発のススメ 2015/8/20 版
Xamarin 紹介:Windows Phone / iOS / Android アプリ同時開発のススメ 2015/8/20 版Xamarin 紹介:Windows Phone / iOS / Android アプリ同時開発のススメ 2015/8/20 版
Xamarin 紹介:Windows Phone / iOS / Android アプリ同時開発のススメ 2015/8/20 版
 
2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料
 
Intalio Cloud Workshop
Intalio Cloud Workshop Intalio Cloud Workshop
Intalio Cloud Workshop
 
OSC2018 hiroshima session slide by OSSC
OSC2018 hiroshima session slide by OSSCOSC2018 hiroshima session slide by OSSC
OSC2018 hiroshima session slide by OSSC
 
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
 
Scalaz-StreamによるFunctional Reactive Programming
Scalaz-StreamによるFunctional Reactive ProgrammingScalaz-StreamによるFunctional Reactive Programming
Scalaz-StreamによるFunctional Reactive Programming
 

Plus de terurou

FIRST STEP to Haxe/JavaScript
FIRST STEP to Haxe/JavaScriptFIRST STEP to Haxe/JavaScript
FIRST STEP to Haxe/JavaScript
terurou
 
大規模なギョームシステムにHaxeを採用してみた話
大規模なギョームシステムにHaxeを採用してみた話大規模なギョームシステムにHaxeを採用してみた話
大規模なギョームシステムにHaxeを採用してみた話
terurou
 
Metro Style AppsでMSIL ver.2012/06/09
Metro Style AppsでMSILver.2012/06/09Metro Style AppsでMSILver.2012/06/09
Metro Style AppsでMSIL ver.2012/06/09
terurou
 
Scala×silverlight
Scala×silverlightScala×silverlight
Scala×silverlight
terurou
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミング
terurou
 

Plus de terurou (20)

Webブラウザ上で動作する帳票エンジンを作る話
Webブラウザ上で動作する帳票エンジンを作る話Webブラウザ上で動作する帳票エンジンを作る話
Webブラウザ上で動作する帳票エンジンを作る話
 
自社サービスでDurable Functionsを採用した話
自社サービスでDurable Functionsを採用した話自社サービスでDurable Functionsを採用した話
自社サービスでDurable Functionsを採用した話
 
Computation Expressions for Haxe
Computation Expressions for HaxeComputation Expressions for Haxe
Computation Expressions for Haxe
 
デンキヤギの採用の考え方
デンキヤギの採用の考え方デンキヤギの採用の考え方
デンキヤギの採用の考え方
 
Vue.jsをhaxeで
Vue.jsをhaxeでVue.jsをhaxeで
Vue.jsをhaxeで
 
MQTTとAMQPと.NET
MQTTとAMQPと.NETMQTTとAMQPと.NET
MQTTとAMQPと.NET
 
altJSの選び方
altJSの選び方altJSの選び方
altJSの選び方
 
DataGridを自前実装する話
DataGridを自前実装する話DataGridを自前実装する話
DataGridを自前実装する話
 
オブジェクト指向の皮をかぶった関数型プログラミング言語 Haxe
オブジェクト指向の皮をかぶった関数型プログラミング言語 Haxeオブジェクト指向の皮をかぶった関数型プログラミング言語 Haxe
オブジェクト指向の皮をかぶった関数型プログラミング言語 Haxe
 
FIRST STEP to Haxe/JavaScript
FIRST STEP to Haxe/JavaScriptFIRST STEP to Haxe/JavaScript
FIRST STEP to Haxe/JavaScript
 
大規模なギョームシステムにHaxeを採用してみた話
大規模なギョームシステムにHaxeを採用してみた話大規模なギョームシステムにHaxeを採用してみた話
大規模なギョームシステムにHaxeを採用してみた話
 
大規模なJavaScript開発の話
大規模なJavaScript開発の話大規模なJavaScript開発の話
大規模なJavaScript開発の話
 
Metro Style AppsでMSIL ver.2012/06/09
Metro Style AppsでMSILver.2012/06/09Metro Style AppsでMSILver.2012/06/09
Metro Style AppsでMSIL ver.2012/06/09
 
Metro Style AppsでMSIL
Metro Style AppsでMSILMetro Style AppsでMSIL
Metro Style AppsでMSIL
 
Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作Yet Another DLR for Silverlightの試作
Yet Another DLR for Silverlightの試作
 
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例
 
CommonJSの話
CommonJSの話CommonJSの話
CommonJSの話
 
Scala×silverlight
Scala×silverlightScala×silverlight
Scala×silverlight
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミング
 
Iron Python / Iron Ruby で .NET Programming
Iron Python / Iron Ruby で .NET ProgrammingIron Python / Iron Ruby で .NET Programming
Iron Python / Iron Ruby で .NET Programming
 

動的なILの生成と編集