Fun 语言 JIT

作者: 一了 <[email protected]>
日期: 2026-07-15


use 'lib-jit.fun';

# 汇编
var s = `#!asm i:i
      pop ebx
      pop eax
      push eax
      push ebx

      push edi
      mov edi,eax

      mov eax,$00000001 ; cpuid
      cpuid
      push eax

      stosd
      mov eax,edx
      stosd

      pop eax
      pop edi
`;

var cpu = ' '.x(8 div charSize());
var jit = NewJit(s);
var ptr = cpu.toNum(-1);
?. int2hex(jit.Run(ptr));
jit.Delete();
?. str2hex(cpu);
?. 'Ok';

# 机器码
s = `#!hex i:i
  5b
  58
  50
  53
  89e3
  40
`;

jit = NewJit(s);
?. jit.Run(1000);
jit.Delete();
?. 'Ok';

# C
s = `#!C i:i
  int is_prime(int n) {
    if (n < 2) return 0;
    if (n == 2) return 1;
    if (n % 2 == 0) return 0;
    for (int i = 3; i * i <= n; i += 2)
    if (n % i == 0) return 0;
    return 1;
  }
`;

jit = NewJit(s);
?. jit.call(1000000007);
jit.del();
?. 'Ok';


将上述代码拷入 fun ide 中, 按 F11 即可看到运行结果.


A4060B00
a4060b00ffcc8c0f
Ok
1001
Ok
1
Ok


支持回调, 如下:


use 'lib-jit.fun';

var ii = 0;
fun cb(a, b)
  ii = a * 2^32 + b;
  ?, 'cb'; ?. ii;
  result = ii;
end fun;

# 汇编
var s = `#!asm i:i
    mov ecx, dword ptr [esp+04]
    @sum1ton
    push eax
    push edx
    mov  eax, <test>
    call eax
`;

var jit = NewJit(s, names: [test: cb.@toCallback(nil, 'ii:i', true)]);
?. jit.Run(100000000);
jit.Delete();
?. 'Ok';

# C
s = `#!C ii:i
  int sum(int n, int (*test)(int, int)) {
    long long s = 0;
    for(int i = 1; i <= n; i++) s += i;
    test((int)(s >> 32), (int)(s & 0xFFFFFFFF));
    return 1;
  }
`;

jit = NewJit(s);
?. jit.call(100000000, cb.@toCallback(nil, 'ii:C', true));
jit.del();
?. 'Ok';



运行结果:


cb 5.00000005E15
987459712
Ok
cb 5.00000005E15
1
Ok


公众号二维码