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で喋っています: