なれる!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