はかせのラボ

私の頭の中を書いていく雑記ブログです

IL 黒魔術士を目指します

あいさつ

どうも、はかせです。
最近私がイカサマをする際に使う
手品のタネを紹介してきました。

ただ私もそろそろイカサママジシャンを卒業して、
黒魔術士になりたいなと思い始めました。

思い立ったが吉日、
さっそく黒魔術(IL)の勉強を始めます。

IL is 何?

私のブログの読者の中には「ILって何?」という方が多いと思います。
実際私も存在は知っていたものの、
使いこなしたら化け物じみたパフォーマンスを出せるもの
程度にしか認識していませんでした。
(ZeroFormatterとかMessagePack for C#とか)

あまり良く知られていないのと、叩きだす結果の凄さから
一部界隈では「黒魔術」なんて呼ばれているらしいです。

ただこの世界はファンタジーではないので魔術なんてものは存在しません。
つまりILもれっきとしたプログラム技術の一つというわけです。

さて前振りはこの辺にしてILの説明に入りましょう。
ILってのは
Intermediate Languageの略です。
Intermediateってのは中級とか中間とかって意味で、
Languageってのは言語って意味です。
なんで訳すと中間言語ってなります。

C#コンパイルされると.NETの中間言語(IL)に変換されます。
その後ILがJITコンパイラーによってネイティブコード、つまり機械語に変換されます。

ILが吐かれる理由はパフォーマンスらしいです。
詳しくはこのスライドに書かれているのでそちらをどうぞ

www.slideshare.net

とまぁそんなこんなでILが何でどうして作られるかってのは
わかった気がします。

使えるツール

さて概要がわかったとこで勉強を始めるわけなんですが、
参考書も何もなく勉強するなんてことは稀有だと思います。

本ではなくともどこかのサイトだったり
知人の教えだったり、
なんらかの先達の導きの元進めていくでしょう。
そちらの方が何倍も効率的ですから。

ILの参考書に該当するものはツールです。
ILってのはC#を変換したものである以上、
C#が書ければ後はそれを変換すればILが出てきます。

ツールはいっぱいあるのですが、
とりあえず色んなとこで見た下記のツールを取ってみました。

LINQPad
www.linqpad.net
C#で書いたコードをILで見ることができるツール。
一画面で見比べることができるから極めてわかりやすい。

ILSpy
github.com
定番.NET逆コンパイラらしい。
DLLやexeからC#コードを生成できるし、
これからDLLを作るなんてこともできるらしい。

DnSpy
ci.appveyor.com
ILSpyと同じく.NET逆コンパイラ
何やらステップ実行ができるらしい。
UIとかもVSライクで馴染み深い。

とりあえずやってみる

今までILについて能書きを垂れてきましたが、
私はILの実物を見たことがありません。
なのでまずは実物をみてみましょう。

先述のLINQPadを使えばC#コードが
ILに変わった姿を見れます。
f:id:hakase0274:20190910203740p:plain

ふむふむこれがILですか・・・・
命令がいくつかありますね。

retはreturnのことでしょう。
ldstrはload stringでしょうか・・・?文字列をメモリに置いてます。
callはメソッド呼び出しですね。

どうやらILの命令はOpCodeというものらしいです。
docs.microsoft.com

既視感・・・

私はILのコードを見たのは今日が初めてです。
ですが、なぜでしょう?初めて見た気がしません。
どこかで似たようなものでも見たことがあるんでしょうか・・・・
・・・・
・・・・
・・・・

COBOL

000010 IDENTIFICATION                   DIVISION.
000020 PROGRAM-ID.                      SAMPLE-01.
000030*
000040 ENVIRONMENT                      DIVISION.
000050*
000060 DATA                             DIVISION.
000070*
000080 PROCEDURE                        DIVISION.
000090 MAIN.
000100     DISPLAY "Hello world!"  UPON CONSOLE.
000110     STOP RUN.

CASL II

MAIN     START
         OUT    BUF,LEN         
         RET                   
BUF      DC     'Hello, World!' 
LEN      DC     13             
         END

Human Resource Machine
f:id:hakase0274:20190910205034j:plain

お前らか!!!!
既視感の正体はお前らだな!?

確かにILは高級言語よりの低級言語なんて話をよく聞きます。
低級言語って機械よりな言語なんで結構似通るんですよね。

既視感の正体がわかってスッキリしました。

あとがき

今回はILの勉強を始めたという話でした。
世間一般で黒魔術なんて言われているので、
どんな偏屈なやつなんだろうとビクついていましたが、
とりあえず握手ぐらいはできそうな距離感で安心しました。

そして既視感の所で話した
Human Resource Machineは以前私がレビューぽい記事を出したゲームです。
非常によくできたパズルゲームで
プログラミングの学習にもなる神ゲーと思っていましたが、
まさかILにも手が届くとは・・・・
感服いたしました。

ちなみにその時の記事はこちら
hakase0274.hatenablog.com

それでは今回はこの辺でノシ

参考

私がC#神と崇めるneuecc様のIL記事です。
(私からするとめちゃむずです)
neue.cc