Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

0

Share

Download to read offline

真Intermediate languageのキホン

Download to read offline

Intermediate Language Basics - The final.
http://www.kekyo.net/2016/03/22/5710

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all
  • Be the first to like this

真Intermediate languageのキホン

  1. 1. 真 Intermediate Language のキホン 2016.3.19 第六回CENTER CLR勉強会 KOUJI MATSUI (@KEKYO2)
  2. 2. 自己紹介 けきょ (@kekyo2) ロードバイク乗り Microsoft MVP for Visual Studio and Development Technology 認定スクラムマスター・スクラムプロダクトオーナー Center CLRオーガナイザー
  3. 3. ようこそ 最近、VRとか話題に上っておりますね。 私もGAME ONでプレステVR体感してきましたよ。 IBMとかなんちゃってSAOとかやってるようで、気合の入り方 が斜め上ですなぁ。 インサイド: http://www.inside-games.jp/article/2016/03/17/96944.html
  4. 4. 本日は それはさておき、本日はIntermediate Language(中間言語)の お話です。 「よく来たなひよっこどもよ」
  5. 5. 本日は ILは基礎的な学問でいう所の「算数」みたいなもので、とにか くやって理解するのが近しい。応用の事は2の次。 なので、 よく言えばワークショップ 悪く言えば算数ドリル
  6. 6. はじめに
  7. 7. 導入 前回結構大変だったので、今回は最初に少しだけ抑えるべき ところを説明しておきます。 ① ILで覚えておく最初のことは、 「System.Reflection.Emit名前空間」だ。 ◦ MSDNやILSpyで調べる足掛かりにする。
  8. 8. 導入 「System.Reflection.Emit.OpCodesクラス」 ◦ このクラスに「オプコード」の定義が含まれている。 コードから使えるよう にする利便性のため (Meta-programming)
  9. 9. 導入 ②オプコード(OpCode)とは: ◦ CLRが理解できる中間言語(バイトコード) CLR OpCode.Ldarg OpCode.Add OpCode.Ldfld OpCode.Call OpCode.Ret 0x20 0x58 0x7b, &_v 0x28, &ToString 0x2a
  10. 10. 導入 ③ OpCodeにはいくつか種類がある ◦ 定数系: Ldc Ldstr Ldnull Ldtoken ◦ 引数操作系: Ldarg Starg ◦ ローカル変数系: Ldloc Stloc ◦ フィールド操作系: Ldfld Stfld ◦ 配列操作系: Ldelem Stelem Newarr ◦ 計算系: Add Sub Mul Div And Or Xor Not Shl Shr ◦ 生成系: Newobj Dup ◦ 型変換系: Conv Castclass Box Unbox ◦ 遷移系: Br Call Callvirt Ret Throw Rethrow Switch ◦ その他: Ldind Stind Localloc
  11. 11. 導入 ④スタック操作・スタックマシンとは: ◦ CLRがバイトコード由来で動作するための基礎となる構造 CLR 1. Ldarg 3. Add 2. Ldfld CLR Stack 123 456
  12. 12. 導入 ④スタック操作・スタックマシンとは: ◦ CLRがバイトコード由来で動作するための基礎となる構造 CLR 3. Add CLR Stack 123 456 123 456 579
  13. 13. 導入 ④スタック操作・スタックマシンとは: ◦ CLRがバイトコード由来で動作するための基礎となる構造 CLR 3. Add CLR Stack 579 579
  14. 14. いよいよ実践
  15. 15. 準備 適当にチーム分けします。 チームには少なくともVisual Studioが入ったPCを。 GitHub: https://github.com/kekyo/CenterCLR.ReflectionEmitTemplate.git Macの人は、可能ならVisual Studio Codeと.NET Core5をインスコ (あんまりフォローできないけど、ソースはnetcore5で動くよ うにしてあります) ILSpy必須(Bingる)
  16. 16. Part 1 引数の値に1を加算して返すようにする。 ポイント: ◦ 引数の値はどうやって取得するか ◦ 加算するにはどうするか ヒント: ◦ 引数操作系: Ldarg Starg (MSDNのOpCodesクラスを見る) ◦ 計算系: Add Sub Mul Div And Or Xor Not Shl Shr ◦ 戻り値を返すには? 元のコードはどうなっていた?
  17. 17. Part 2 引数を増やして、加算して返す ポイント: ◦ 引数を増やすためには、Emitterも変更する必要がある。 ヒント: ◦ DefineMethodとは
  18. 18. Part 3 引数の文字列を値に変換する ポイント: ◦ Convert.ToInt32メソッドを使う事にする ◦ メソッドを呼び出すにはCallオプコードを使う ◦ 沢山のオーバーロードからどうやって絞り込むか? ヒント: ◦ MethodInfoはType.GetMethodsで取得する
  19. 19. Part 4 二つの引数の値をstring.Formatでフォーマットする ポイント: ◦ String.Formatメソッドのオーバーロードをどうやって特定するか? ◦ 型が違う場合は、変換する必要がある ヒント: ◦ MethodInfoはType.GetMethodで取得する ◦ 型変換のIL命令は2種類ある ◦ object hoge = 123; という式の暗黙変換の事を何て言ったっけ?
  20. 20. Part 5 インスタンスメソッドを作る(仕様はPart4のまま) ポイント: ◦ テンプレートコードはstaticメソッドを作って、そのデリゲートを返す。だか らEmitterを変更する必要がある ◦ インスタンスメソッドを実行するには、インスタンスが必要(インスタンス の生成はILでやらなくて良い) ◦ thisはどこにあるのか ◦ デフォルトコンストラクタを定義する ヒント: ◦ DefineMethodのフラグによって、定義するメソッドの属性が変わる ◦ インスタンスメソッドの第0引数がthis ◦ Activatorクラス
  21. 21. Part 6 フィールドを作り、前回の結果も加えて結果を計算する ポイント: ◦ TypeBuilderを使ってフィールドを定義する ◦ フィールドにアクセスするIL命令 ヒント: ◦ 「フィールドの値を読み書き」と言うより、「フィールドの値をス タックに積んだり出したり」
  22. 22. Part 7 C#で書いたクラスを継承する ポイント: ◦ クラスはpublicでnon-sealedで定義する ◦ クラスのコンストラクタは呼び出し可能でなければならない ヒント: ◦ 「継承するクラス型の指定」は、どこで定義される情報なのか?
  23. 23. Part 8 継承クラスのインスタンスメソッドを呼び出す ポイント: ◦ 継承元のクラスのメソッド定義を入手して呼び出す ◦ 呼び出しにthisが必要 ヒント: ◦ なし
  24. 24. Part 9 継承してオーバーライドされた仮想メソッドを呼び出す ポイント: ◦ 基底クラスのメソッド情報を使う ◦ オーバーライドされたメソッドが呼び出される ヒント: ◦ 仮想メソッドを呼び出すIL命令
  25. 25. Part 10 オーバーライドされた仮想メソッドを無視し、基底メソッド を呼び出す ポイント: ◦ C#では実現できない ヒント: ◦ IL命令は実直
  26. 26. Part 11 クラスのインスタンスを生成する ポイント: ◦ newするには? ◦ コンストラクタとは ヒント: ◦ newに対応するIL命令と、その引数
  27. 27. Part 12 プロパティを読み書きする ポイント: ◦ プロパティ情報を取得する ◦ Getter/Setterメソッドとは ヒント: ◦ なし
  28. 28. Part 13 Windows Formを表示し、タイトルバーに”Hello IL”と表示する ポイント: ◦ Formクラスを使い、インスタンスを生成し、プロパティにアクセスす る ◦ ShowDialogメソッドを呼び出して表示する ヒント: ◦ なし
  29. 29. その他のトピック デリゲートの生成: ◦ Delegate.CreateDelegateとかをいじってからILに望むと吉。 イベント: ◦ プロパティと非常によく似ている。実態はadd/removeメソッド。 仮想メソッドのオーバーライド: ◦ まずDefineMethodでメソッドを定義してから、DefineMethodOverrideで 基底メソッド定義と関連付ける。 インターフェイス型定義と実装:
  30. 30. あとはほとんど応用だ! ILで書く範囲を少なくできるように工夫する。 ◦ 例:基底クラスやユーティリティクラスをC#で書いておき、複雑だがIL 書かなくてもよい処理をオフロードする Emitは色々つらいので、他の方法も理解しておく。 ◦ Emitは実行環境が限られる。Standard CLRやCore5ではサポートされてい るが、UWPとかダメ ◦ Emitでコードを量産しようとしている → T4テンプレートを使うと、似 たようなソースコードをマクロ的に大量生産できる ◦ 動的型定義はなく、単に高速実行可能な動的言語がほしい → 式木を 使う(式木構造について理解が必要だが、不正なILを作ってしまう危険 はない) ◦ サードパーティライブラリを使う(Mono.CecilはCLRに依存しないでバ イナリを生成できる・Emit定義が楽になる各種補助ライブラリとか)
  31. 31. がんばりました!!

Intermediate Language Basics - The final. http://www.kekyo.net/2016/03/22/5710

Views

Total views

7,854

On Slideshare

0

From embeds

0

Number of embeds

6,877

Actions

Downloads

5

Shares

0

Comments

0

Likes

0

×