libjit
 
LibJIT是一个相当简单,轻量级的库,用于运行时编译,具有简单稳定的ABI。

网站:http://www.gnu.org/software/libjit/
支持平台:Windows,Linux,DOS
标题包括:jit.bi
标题版本:git a8293e141b79c28734a3633a81a43f92f29fc2d7

例子

''简单的mul / add示例

#include "jit.bi"

'初始化libjit
Dim context As jit_context_t = jit_context_create()
jit_context_build_start(context)

'定义函数mul_add(x,y,z)
Dim params(0 To 2) As jit_type_t = {jit_type_int, jit_type_int, jit_type_int}
Dim signature As jit_type_t = jit_type_create_signature( _  
    jit_abi_cdecl,  _ 'C风格功能
    jit_type_int,   _ '返回类型
    @params(0),     _ '参数数组
    3,              _ '组件数量
    1               _ '计数引用?
)
Dim mul_add As jit_function_t = jit_function_create(context, signature)

'构建函数(result =(x * y)+ z)
Dim As jit_value_t x, y, z, temp1, temp2
x = jit_value_get_param(mul_add, 0)
y = jit_value_get_param(mul_add, 1)
temp1 = jit_insn_mul(mul_add, x, y)
z = jit_value_get_param(mul_add, 2)
temp2 = jit_insn_add(mul_add, temp1, z)
jit_insn_return(mul_add, temp2)

'编译功能函数
jit_function_compile(mul_add)
jit_context_build_end(context)

'通话功能
Dim As Integer a=3, b=5, c=2, result
Dim args(0 To 2) As Integer Ptr = {@a, @b, @c}
jit_function_apply(mul_add, @args(0), @result)
Print Using "mul_add(&,&,&)= &"; a; b; c; result

'清理libjit
jit_context_destroy(context)


''GCD计算示例

#include "jit.bi"

'初始化libjit
Dim context As jit_context_t = jit_context_create()
jit_context_build_start(context)

'将函数gcd(x作为uinteger,y作为uinteger)定义为uinteger
Dim params(0 To 1) As jit_type_t = {jit_type_uint, jit_type_uint}
Dim signature As jit_type_t = jit_type_create_signature( _  
    jit_abi_cdecl,  _ 'C风格功能
    jit_type_uint,  _ '返回类型
    @params(0),     _ '参数数组
    2,              _ '组件数量
    1               _ '计数引用?
)
Dim gcd As jit_function_t = jit_function_create(context, signature)

'构建功能
'检查x = y
Dim As jit_value_t x, y, x_eq_y
x = jit_value_get_param(gcd, 0)
y = jit_value_get_param(gcd, 1)
x_eq_y = jit_insn_eq(gcd, x, y)

'如果x = y,则返回x
Dim label_x_ne_y As jit_label_t = jit_label_undefined
jit_insn_branch_if_not(gcd, x_eq_y, @label_x_ne_y)
jit_insn_return(gcd, x)

'否则...
jit_insn_label(gcd, @label_x_ne_y)

'检查x {98??9796003}y
Dim As jit_value_t x_lt_y
Dim label_x_gte_y As jit_label_t = jit_label_undefined
x_lt_y = jit_insn_lt(gcd, x, y)
jit_insn_branch_if_not(gcd, x_lt_y, @label_x_gte_y)

'如果x {98??9796003}y,返回gcd(x,y-x)
Dim As jit_value_t gcd_args(0 To 2), gcd_result
gcd_args(0) = x
gcd_args(1) = jit_insn_sub(gcd, y, x)
gcd_result = jit_insn_call( _
    gcd,          _ '我们正在打电话
    "GCD",        _ '功能名称
    gcd,          _ '功能参考
    0,            _ '签名=自动
    @gcd_args(0), _ '参数
    2,            _ '参数计数
    0             _ 'flags =没什么特别的
)
jit_insn_return(gcd, gcd_result)

'其他...
jit_insn_label(gcd, @label_x_gte_y)

'返回gcd(x-y,y)
gcd_args(0) = jit_insn_sub(gcd, x, y)
gcd_args(1) = y
gcd_result = jit_insn_call( _
    gcd,          _ '我们正在打电话
    "GCD",        _ '功能名称
    gcd,          _ '功能参考
    0,            _ '签名=自动
    @gcd_args(0), _ '参数
    2,            _ '参数计数
    0             _ 'flags =没什么特别的
)
jit_insn_return(gcd, gcd_result)

'编译功能
jit_function_compile(gcd)
jit_context_build_end(context)

'通话功能
Dim As jit_uint a=21, b=14, result
Dim As jit_uint Ptr args(0 To 1) = {@a, @b}
jit_function_apply(gcd, @args(0), @result)
Print Using "gcd(&,&)= &"; a; b; result

'清理libjit
jit_context_destroy(context)