なれる!il

33
なれる!IL Posaune @ Guildworks 2015/07/25 めとべや大阪 1

Upload: hiroshi-maekawa

Post on 14-Aug-2015

439 views

Category:

Engineering


1 download

TRANSCRIPT

なれる!ILPosaune @ Guildworks

2015/07/25 めとべや大阪 1

自己紹介• 前川博志 aka @Posaune

• ギルドワークス株式会社で働いています

• 勝手にALMエンジニアを名乗ってます• Microsoft MVP for Visual Studio ALM

2015/07/25 めとべや大阪 2

ギルドワークス• 現在7名の小さな会社• 設立一年ちょっとのベンチャー企業• ソフトウェアの超上流での見立てから開発、果ては現場改善までやってます

• モットーは「正しいものを正しくつくる!」

2015/07/25 めとべや大阪 3

2015/07/25 めとべや大阪 4

諸々お知らせ!from ギルドワークス

2015/07/25 めとべや大阪 5

Blog やってます!http://blog.guildworks.jp/

2015/07/25 めとべや大阪 6

お悩み・相談募集中• 現場が同しようもないから何とかしたい・・・• アイデアを形にできない・・・• お気軽にご相談を! ⇒ http://guildworks.jp/about/work/

• 開発パートナーも募集中• そろそろXamarinを使っていきたい

2015/07/25 めとべや大阪 7

お知らせ終わり。

2015/07/25 めとべや大阪 8

本日のAgenda• ILとは• ILを読んでみよう!• ILを書いてみよう!• バイトコードを見てみよう!

2015/07/25 めとべや大阪 9

ILとは

2015/07/25 めとべや大阪 10

.NETの基盤 IL• 正式名称はMSIL

• 共通言語基盤、ともいう。• C#だろうがF#だろうがVBだろうかJ#だろうが、最終的には

ILになってる

2015/07/25 めとべや大阪 11

ILの特徴• 言ってしまえば、アセンブリ言語にかなり近い• PICとかで組み込みやってた人には読みやすい• とはいえ、すごい勢いで抽象化されているので、まぁなんとかなる

2015/07/25 めとべや大阪 12

ILを触る場面って?• メタプログラミング

• しかし、Roslyn時代にはちょっと・・・• 究極レベルでの最適化

• だったらC++使えよ• デバッグ時にいきなり見ることがある

• Resharper買えば?• 趣味2015/07/25 めとべや大阪 13

まぁ、低レベルプログラミングの学習基盤として、ひとつ・・・

2015/07/25 めとべや大阪 14

ILを読んでみよう!

2015/07/25 めとべや大阪 15

…読むったって、どこにあるのん?

2015/07/25 めとべや大阪 16

答え:ILDasmで逆コンパイル

2015/07/25 めとべや大阪 17

読めること• ほとんどは定型文• 普通に.netのメソッド使ってる• 一部よー分からんとこがある

2015/07/25 めとべや大阪 18

よーわからんとこ• 謎の呪文 ldstr

• load string です。• callは分かる。• 引数は??• retも分かる

2015/07/25 めとべや大阪 19

ILはスタックマシンなんです• 引数として使うものは、スタックに積んでおく• メソッドは引数分のスタックを消費する• ret でもどってくる

2015/07/25 めとべや大阪 20

戻り値を返したい!• ret の時にスタックに積んでおけばいい

2015/07/25 めとべや大阪 21

ローカル変数の定義• locals. で宣言する• stloc で評価スタックの先頭を書き込む• ldloc で読んで評価スタックの先頭に(ry

2015/07/25 めとべや大阪 22

書いてみよう!

2015/07/25 めとべや大阪 23

ひとまず書く• SharpDevelop / XamarinStudio にはなぜかビルトインされてる

• VSは拡張でエディタは入る• インテリセンス?なにそれおいしいの?

2015/07/25 めとべや大阪 24

数値定義• ldc.i4 => Int32 をロードして評価スタックに

2015/07/25 めとべや大阪 25

算術演算• 足し算: add

• 引き算: sub

• 掛け算: mul

• 割り算: div

2015/07/25 めとべや大阪 26

制御構文• br: ラベルジャンプ!• beq: スタックを2つ比較してジャンプ!• bgt, blt, bge, ble : 大きい時、小さい時、以上、以下

2015/07/25 めとべや大阪 27

制御構文と算術演算があれば・・・• for文作れるよね!• やってみよう!

2015/07/25 めとべや大阪 28

バイトコードを見てみよう

2015/07/25 めとべや大阪 29

バイトコードを見る??• ILからバイトコードはかなり機械的に変換できる• ただし、メソッド呼び出しとか参照型の呼び出しはアドレステーブル見る必要がある

• 頑張ればILからハンドアセンブルできる。はず。

2015/07/25 めとべや大阪 30

手がかり• OpCodeのバイト

• ldc.i4 => 20

• stloc.0 => 0A

• stloc.1 => 0B

• ret => 2A

2015/07/25 めとべや大阪 31

まとめ?• ILは意外に読める• ILはそこそこ書ける• バイナリもそこそこ読める• 普通は要らない知識です

2015/07/25 めとべや大阪 32

2015/07/25 めとべや大阪 33