LuaJIT - FFI
dwing吧
全部回复
仅看楼主
level 13
dwing 楼主
前几天开始关注新版 LuaJIT 的时候, 发现增加了一个新的库 FFI, 把本地静态语言很巧妙地和 Lua 这种纯动态语言结合在一起, 让脚本级别的语言拥有C语言几乎所有的控制能力.
声明和调用C函数(自动透明地转换和访问):
local ffi = require("ffi")
ffi.cdef[[
   int MessageBoxA(void *w, const char *txt, const char *cap, int type);
]]
ffi.C.MessageBoxA(nil, "Hello world!", "Test", 0)
创建和使用C结构体(和C二进制兼容的格式):
local ffi = require("ffi")
ffi.cdef[[
   typedef struct { uint8_t red, green, blue, alpha; } rgba_pixel;
]]
local n = 100
local img = ffi.new("rgba_pixel[?]", n)
for i=0, n-1 do
   img[i].green = i
   img[i].alpha = 255
end
对动态/脚本语言有兴趣的可以在这里讨论一下看法
2011年02月17日 11点02分 1
level 1
可以调用windows api和自己写的动态库的接口吗?和js有啥区别?
2011年02月18日 07点02分 2
level 13
dwing 楼主
当然可以调用windows api和自己写的动态库的接口, 上面的例子就是调用MessageBox这个API, 自己写的DLL也可以, 只要接口符合C语言函数调用规则.
js主要是给浏览器用的,大部分实现都考虑到安全问题,不容易加载和使用外部DLL.
2011年02月18日 11点02分 3
level 6
一种很久以前BAT与C#混编的感觉。。。。当然FFI看着更自然点。
这种结合没用过几次,观望态度。
2011年02月18日 15点02分 4
level 6
其实使用dynwrap vbs/js也能调用_stdcall和_cdecl
只是用的人不怎么多,知道的也不算多
不过貌似不能调用地址什么的api(因为我没试过),指针什么的可能实现不了
2011年02月19日 13点02分 5
level 6

f=type of call _stdcall or _cdecl. So it can work with both MS C++ and
Borland C++. Default to _stdcall. If that doesn't work use _cdecl. If
that doesn't work good luck!
返回数据类型
r=return data type.
Data types are:
const ARGTYPEINFO ArgInfo[] = 
{
{'a', sizeof(IDispatch*),    VT_DISPATCH}, // a   IDispatch*
{'c', sizeof(unsigned char), VT_I4},       // c   signed char  
{'d', sizeof(double),        VT_R8},       // d   8 byte real 
{'f', sizeof(float),         VT_R4},       // f   4 byte real 
{'k', sizeof(IUnknown*),     VT_UNKNOWN},  // k   IUnknown* 
{'h', sizeof(long),          VT_I4},       // h   HANDLE 
{'l', sizeof(long),          VT_I4},       // l   long 
{'p', sizeof(void*),         VT_PTR},      // p   pointer 
{'s', sizeof(BSTR),          VT_LPSTR},    // s   string 
{'t', sizeof(short),         VT_I2},       // t   short 
{'u', sizeof(UINT),          VT_UINT},     // u   unsigned int 
{'w', sizeof(BSTR),          VT_LPWSTR},   // w   wide string 
}
William Epp added anr 'r' for VT_BYREF (pass by reference)but is for
strings only. This made the GETPROFILESTRING function to work. But it
didn't work for the GETPROFILESECTION. If anyone gets it to work please
let me know.
2011年02月19日 13点02分 7
level 6
{'p', sizeof(void*),          VT_PTR},       // p    pointer
貌似指针也能哦= =!
2011年02月19日 13点02分 8
level 13
dwing 楼主

LuaJIT 对 struct 有特殊的JIT优化, 使动态语言在处理这种C语言结构时会做直接按静态数据类型优化, 和写C语言的代码效率几乎相同.
2011年02月19日 15点02分 9
level 6
回复:9楼
现在才知道JIT是什么,论坛经常看到 但没关注过
2011年02月19日 15点02分 10
level 6
http://www.docin.com/p-95748436.html
Chrome V8引擎某些方面比LuaJIT性能高?
2011年02月20日 07点02分 11
level 13
dwing 楼主
2011年02月20日 08点02分 12
level 1
感觉ajax应用adobe做的最好,action script现在可以做ui,做音视频,做游戏,这种逻辑下已经没有游戏/ui/音视频的区别了,所有界面逻辑展现都成了一种统一的文件格式.动态应用在c语言层就足够了似乎.把动态语言和静态语言混合似乎没有明显优势.
2011年02月23日 02点02分 13
level 13
dwing 楼主
界面逻辑展现只是软件的一部分.
as作为一种脚本/动态语言,使用领域还不够广泛和通用.
比如想做个网页爬虫程序,动态语言和静态语言混合就很适合.
2011年02月23日 02点02分 14
level 1
想起了ht ml 5,以后客户端甚至操作系统都要被浏览器逻辑上代替了?
2011年02月23日 09点02分 15
level 1

2011年03月09日 18点03分 16
level 13
dwing 楼主
1.luajit和lua的关系在LuaJIT的官方网站上有介绍, 简单的说就是以Lua(5.1)语言和接口兼容的一个高效的实现.
2.标准的lua如果使用C/C++做底层模块当然可以实现ffi
3.先确定是否使用的是最新版(0.51)UCI中的测试程序,如果是,请把BG001R.uci发送给我.
2011年10月05日 14点10分 18
1