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命令に短縮されます:
進捗した #dotnet #il2c pic.twitter.com/6tQRl4dJBv
— Kouji Matsui (@kekyo2) September 26, 2017