IL2Cの短信です。milestone3となる、ValueTypeのサポートを(限定的ですが)行いました。
YouTube: Playlist: Making archive IL2C
GitHub: IL2C step-by-step design project
IL2Cをmicro:bitで動かす (#6-24・#6-25)
- #6-24・#6-25の時点のIL2Cを使用して、micro:bitとArduino UNOのCコンパイラを使って実際に極小環境で動かしました。
Making Archive IL2C at .NET Conf 2017 Tokyo (#6-28)
- .NET Conf 2017 TokyoのUnplugged枠で登壇。
- この時点までのfeatureの解説などをしました。
namespace il2c_test_target { public class Hoge1 { public static int Add1(int a, bool isTwo) { return a + (isTwo ? 2 : 1); } } }
int32_t il2c_test_target_Hoge1_Add1(int32_t a, bool isTwo) { int32_t local0; int32_t __stack0_int32_t; int32_t __stack1_int32_t; __stack0_int32_t = a; __stack1_int32_t = isTwo ? 1 : 0; if (__stack1_int32_t != 0) goto L_0000; __stack1_int32_t = 1; goto L_0001; L_0000: __stack1_int32_t = 2; L_0001: __stack0_int32_t = __stack0_int32_t + __stack1_int32_t; local0 = __stack0_int32_t; goto L_0002; L_0002: __stack0_int32_t = local0; return __stack0_int32_t; }
milestone3 (#6-37)
- byte, sbyte, short, ushort, boolのサポート。
- ValueType(構造体)のフィールドとメソッドをサポート。スタティックとインスタンスメンバの両方共に変換出来ます。
スタティックメンバはCソースコード上、グローバル変数とグローバル関数として変換し、インスタンスフィールドは構造体、インスタンスメソッドはグローバル関数として変換。 - 名前空間と型名についてのマングリングの導入。
- 値を返さないメソッド(void)のret OpCodeのサポート
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace il2c_test_target { public struct Hoge3 { public static int Value1 = 123; public int Value2; public int GetValue2(int a, int b) { return this.Value2 + a + b; } } public class Hoge4 { public static int Test4() { var hoge3 = new Hoge3(); hoge3.Value2 = 456; return hoge3.Value2; } public static int Test5() { var hoge3 = new Hoge3(); hoge3.Value2 = 789; var result = hoge3.GetValue2(123, 456); return result; } } }
#ifndef __MODULE_il2c_test_target__ #define __MODULE_il2c_test_target__ #include <stdint.h> #include <string.h> #include <stdbool.h> typedef struct il2c_test_target_Hoge3 { int32_t Value2; } il2c_test_target_Hoge3; extern int32_t il2c_test_target_Hoge3_Value1; extern int32_t il2c_test_target_Hoge3_GetValue2(il2c_test_target_Hoge3* __this, int32_t a, int32_t b); extern int32_t il2c_test_target_Hoge4_Test4(void); extern int32_t il2c_test_target_Hoge4_Test5(void); #endif
#include "il2c_test_target.h" int32_t il2c_test_target_Hoge3_Value1 = 123; int32_t il2c_test_target_Hoge3_GetValue2(il2c_test_target_Hoge3* __this, int32_t a, int32_t b) { int32_t local0; il2c_test_target_Hoge3* __stack0_il2c_test_target_Hoge3_reference; int32_t __stack0_int32_t; int32_t __stack1_int32_t; __stack0_il2c_test_target_Hoge3_reference = __this; __stack0_int32_t = __stack0_il2c_test_target_Hoge3_reference->Value2; __stack1_int32_t = a; __stack0_int32_t = __stack0_int32_t + __stack1_int32_t; __stack1_int32_t = b; __stack0_int32_t = __stack0_int32_t + __stack1_int32_t; local0 = __stack0_int32_t; goto L_0000; L_0000: __stack0_int32_t = local0; return __stack0_int32_t; } int32_t il2c_test_target_Hoge4_Test4(void) { il2c_test_target_Hoge3 local0; int32_t local1; il2c_test_target_Hoge3* __stack0_il2c_test_target_Hoge3_reference; il2c_test_target_Hoge3 __stack0_il2c_test_target_Hoge3; int32_t __stack0_int32_t; int32_t __stack1_int32_t; __stack0_il2c_test_target_Hoge3_reference = &local0; memset(__stack0_il2c_test_target_Hoge3_reference, 0x00, sizeof(il2c_test_target_Hoge3)); __stack0_il2c_test_target_Hoge3_reference = &local0; __stack1_int32_t = 456; __stack0_il2c_test_target_Hoge3_reference->Value2 = __stack1_int32_t; __stack0_il2c_test_target_Hoge3 = local0; __stack0_int32_t = __stack0_il2c_test_target_Hoge3.Value2; local1 = __stack0_int32_t; goto L_0000; L_0000: __stack0_int32_t = local1; return __stack0_int32_t; } int32_t il2c_test_target_Hoge4_Test5(void) { il2c_test_target_Hoge3 local0; int32_t local1; int32_t local2; il2c_test_target_Hoge3* __stack0_il2c_test_target_Hoge3_reference; int32_t __stack0_int32_t; int32_t __stack1_int32_t; int32_t __stack2_int32_t; __stack0_il2c_test_target_Hoge3_reference = &local0; memset(__stack0_il2c_test_target_Hoge3_reference, 0x00, sizeof(il2c_test_target_Hoge3)); __stack0_il2c_test_target_Hoge3_reference = &local0; __stack1_int32_t = 789; __stack0_il2c_test_target_Hoge3_reference->Value2 = __stack1_int32_t; __stack0_il2c_test_target_Hoge3_reference = &local0; __stack1_int32_t = 123; __stack2_int32_t = 456; __stack0_int32_t = il2c_test_target_Hoge3_GetValue2(__stack0_il2c_test_target_Hoge3_reference, __stack1_int32_t, __stack2_int32_t); local1 = __stack0_int32_t; __stack0_int32_t = local1; local2 = __stack0_int32_t; goto L_0000; L_0000: __stack0_int32_t = local2; return __stack0_int32_t; }
IL2Cプロジェクト – Extensive Xamarin
技術書典3で配布予定の”Extensive Xamarin”に、IL2Cを寄稿させて頂きました。
是非、皆さん入手して読んでください :)
範囲はおおよそ.NET Confの発表分です。ビデオシリーズではすべて網羅していますが、その中でも印象深かったトピックについて、書籍化で解説しやすい部分を抜粋してあります。
締切がギリギリでしたが掲載を快諾していただいたXamaritansのメンバーの方々に感謝します。
何故Xamarin本に寄稿したのかですが、#6-38で喋っています: