Lua FFI 实战

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

May 19, 2013

由来

FFI库,是LuaJIT中最重要的一个扩展库。它允许从纯Lua代码调用外部C函数,使用C数据结构。有了它,就不用再像Lua标准math库一样,编写Lua扩展库。把开发者从开发Lua扩展C库(语言/功能绑定库)的繁重工作中释放出来。

FFI简介

FFI库,允许从纯Lua代码调用外部C函数,使用C数据结构。

FFI库最大限度的省去了使用C手工编写繁重的Lua/C绑定的需要。不需要学习一门独立/额外的绑定语言——它解析普通C声明。这样可以从C头文件或参考手册中,直接剪切,粘贴。它的任务就是绑定很大的库,但不需要捣鼓脆弱的绑定生成器

FFI紧紧的整合进了LuaJIT(几乎不可能作为一个独立的模块)。JIT编译器为Lua代码直接访问C数据结构而产生的代码,等同于一个C编译器应该生产的代码。在JIT编译过的代码中,调用C函数,可以被内连处理,不同于基于Lua/C API函数调用。

这一页将简要介绍FFI库的使用方法。

激励范例:调用外部C函数

真的很用容易去调用一个外部C库函数:

local ffi = require("ffi") ② ffi.cdef[[  int printf(const char* fmt, ...);    ]]③ ffi.C.printf("Hello %s!", "world")

以上操作步骤,如下:

① 加载FFI库② 为函数增加一个函数声明。这个包含在`中括号`对之间的部分,是标准C语法。.③ 调用命名的C函数——非常简单

事实上,背后的实现远非如此简单:③ 使用标准C库的命名空间ffi.C。通过符号名("printf")索引这个命名空间,自动绑定标准C库。索引结果是一个特殊类型的对象,当被调用时,执行printf函数。传递给这个函数的参数,从Lua对象自动转换为相应的C类型。

Ok,使用printf()不是一个壮观的示例。你也可能使用了io.write()string.format()。但你有这个想法…… 以下是一个Windows平台弹出消息框的示例:

 
 
  1. local ffi = require("ffi")
  2. ffi.cdef[[
  3. int MessageBoxA(void *w, const char *txt, const char *cap, int type);
  4. ]]
  5. ffi.C.MessageBoxA(nil, "Hello world!", "Test", 0)

Bing! 再一次, 远非如此简单,不?

和要求使用Lua/C API去绑定函数的努力相比:

  • 创建一个外部C文件,
  • 增加一个C函数,遍历和检查Lua传递的参数,并调用这个真实的函数,

传统的处理方式

  • 增加一个模块函数列表和对应的名字,
  • 增加一个luaopen_*函数,并注册所有模块函数,
  • 编译并链接为一个动态库(DLL),
  • 并将库文件迁移到正确的路径,
  • 编写Lua代码,加载模块
  • 等等……
  • 最后调用绑定函数。

唷!(很不爽呀!)

激励示例: 使用C数据结构

FFI库允许你创建,并访问C数据结构。当然,其主要应用是C函数接口。但,也可以独立使用。

Lua构建在高级数据类型之上。它们很灵活、可扩展,而且是动态的。这就是我们大家都喜欢Lua的原因所在。唉,针对特殊任务,你需要一个低级的数据结构时,这可能会低效。例如,一个超大的不同结构的数组,需要通过一张超大的表,存储非常多的小表来实现。这需要大量的内存开销以及性能开销。

这里是一个库的草图,操作一个彩图,以及一个基准。首先,朴素的Lua版本,如下:

 
 
  1. local floor = math.floor
  2.  
  3. local function image_ramp_green(n)
  4.   local img = {}
  5.   local f = 255/(n-1)
  6.   for i=1,n do
  7.     img[i] = { red = 0, green = floor((i-1)*f), blue = 0, alpha = 255 }
  8.   end
  9.   return img
  10. end
  11.  
  12. local
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值