注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

太阳神上的博客

青青子衿,悠悠我心,但为君故,沉吟至今。

 
 
 

日志

 
 
 
 

神奇的GNU Lightning  

2007-12-23 04:42:21|  分类: 程序设计创意 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
  GNU Lightning是GNU的一个JIT(Just In Time)项目,看来这个项目并没有开始多久,目前的最新版本是1.2。这个项目很有用,它可以动态地生成可执行的代码,有自己的一套指令集,目前支持x86,PowerPC和Sparc三个平台,其中x86最全。
  因为我的Tenshi脚本虽然效率并不是第一位的,但我仍然是希望越快越好,特别是从Lua里获得了不少的启发。Lua从1993年发展至今,其效率是脚本语言的不容质疑的No.1,它的虚拟机的设计极其精妙,是基于寄存器的,而现在大多数则是基于堆栈的。这肯定需要极高超的技巧才能实现,我不敢奢望。不过虚拟机再快也快不过实际的指令,如果用即时编译成本地代码,我的语言的效率则会上了一个很大的台阶。而GNU Lightning对于我来说可以说是非常有用的。
  GNU Lightning,听这个名字就很厉害。lightning是“闪电”的意思,因此此库是以速度取胜,开发这个库的人汇编一定非常牛B。这个库都是一些头文件,没有编译好的库。因此在开发时只需要include一下就可以了。我在Linux和Windows里都编译通过了,没有什么问题。只不过在它的源码包里有一个反汇编的函数,很有用,不知怎的编译时就不生成相应的库文件,在Linux里要我手工编译才行,在Windows里则链接出错,不知道怎么搞的。
   下面是一段调用printf函数的代码,这正是我梦寐以求的,有了这个库,我的语言就可以完全以C的接口调用C的函数,连库都可以不用封装了。
 #include <stdio.h>
#include <lightning.h>

int main()
{
    jit_insn print_int[1024];
    
    jit_set_ip(print_int);
    
    jit_prolog(1); // print_int有一个参数
    int offset=jit_arg_i(); //获取第一个参数的偏移量
    jit_getarg_i(JIT_R0,offset); // 从偏移量里获得参数值放到JIT_R0里
    jit_movi_p(JIT_R1,"The number is %d\n"); // 把格式化字符串的地址放到JIT_R1
    
    jit_prepare(2); //准备调用有两个参数的printf
    jit_pusharg_i(JIT_R0); // 先push整数
    jit_pusharg_p(JIT_R1); // 再push字符串
    jit_finish(printf); // 调用printf
    
    jit_ret(); //调用完毕
    
    jit_flush_code(print_int,jit_get_ip().ptr);
    
    typedef void (*func_type)(int);
    
    func_type foo=(func_type)print_int;
    foo(50);
    
    getchar();
    return 0;
}


  评论这张
 
阅读(275)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017