IL2C短信: milestone2

IL2Cの短信です。milestoneを決めてやっているわけではないのですが、一区切りついたのでmilestone2ということにしておこう。

YouTube: Playlist: Making archive IL2C
GitHub: IL2C step-by-step design project


milestone1 (#6-4)

Hello world的なシンプルコードの変換が出来る:

public static int main()
{
  var a = 1;
  var b = 2;
  var c = a + b;
  return c;
}
int main(void)
{
  int local0;
  int local1;
  int local2;
  int local3;

  local0 = 1;
  local1 = 2;
  local2 = local1 + local0;
  local3 = local2;
  return local3;
}

milestone2 (#6-16)

  • プリミティブ型のプラットフォーム依存性を回避したいので、stdint.hを使うようにする。
  • 64ビット整数の足し算のサポート(今後の方向性検証のため)。
  • スタックの高度な再利用を含むコードの変換が出来る。
    これが一番大変だった… ILの実行パス解析に型推論が必要(知識ないのでもっと直接的な手法で実装した)とか。今の方法にも積み残しがあるけど。
  • 無条件・条件ジャンプに対応。
    上が出来たので、必然的にこれも出来るようになった。
public static long main()
{
  var a = 1L;
  var b = 2L;
  var c = a + b;
  return c;
}
#include <stdint.h>

int64_t main(void)
{
  int64_t local0;
  int64_t local1;
  int64_t local2;
  int64_t local3;

  int32_t __stack0_int32_t;
  int64_t __stack0_int64_t;
  int64_t __stack1_int64_t;

  __stack0_int32_t = 1;
  __stack0_int64_t = (int64_t)__stack0_int32_t;
  local0 = __stack0_int64_t;
  __stack0_int32_t = 2;
  __stack0_int64_t = (int64_t)__stack0_int32_t;
  local1 = __stack0_int64_t;
  __stack0_int64_t = local0;
  __stack1_int64_t = local1;
  __stack0_int64_t = __stack0_int64_t + __stack1_int64_t;
  local2 = __stack0_int64_t;
  __stack0_int64_t = local2;
  local3 = __stack0_int64_t;
  goto L_000b;
L_000b:
  __stack0_int64_t = local3;
  return __stack0_int64_t;
}

この冗長なコードは、VC++のReleaseビルドで2命令に短縮されます:

ビデオネタ: IL2C

IL2Cと言うのは、Unityで言うところのIL2CPPのC言語版です。これをフルスクラッチで作ってみるというビデオシリーズです。
つまり、C#(というか、それをコンパイルしたILを含むDLLやEXE)を入力に、C言語のソースコードを生成するツール、というわけです。

YouTube: Playlist: Making archive IL2C
GitHub: IL2C step-by-step design project

現在第6回までやったところですが、以下のようなC#のコード:

public static int main()
{
  var a = 1;
  var b = 2;
  var c = a + b;
  return c;
}

が、

#include <stdint.h>
int32_t main(void)
{
  int32_t local0;
  int32_t local1;
  int32_t local2;
  int32_t local3;

  local0 = 1;
  local1 = 2;
  local2 = local1 + local0;
  local3 = local2;
  return local3;
}

というC言語のソースコードに変換できる所まで出来ました。また、これの64ビット(long, int64_t)も出来たところです。

開発の方法の検討・設計・実装・テストまで含めて、全体を一からフルスクラッチでやってるところを、ほぼカット無しで収録しています。メタプログラミングに興味のある方は視聴してみてください。

この調子で続けると、40回~50回ぐらいで完成かな… 先は長そうだ :)

あと、途中でHuman Resource Machineというゲームをちょっとだけ紹介しています。IL(というかアセンブリ言語)をゲーム感覚で学べるアプリでお薦めです。