闷头看的东西不写出来总感觉迟早要忘记,那就通过博客的形式一点一点记录下来吧,没准回头来看会有更多收获。
新工作的第一天就被告知要先维护一个CGI,代码用LUA写的,LUA是神马,能吃吗\抠鼻子。零零散散看了两三天,今天终于有那么一点点眉目了。
首先,执行一个lua文件命令是:lua 文件名.lua
前面的lua程序是一个解释器,用C来写的,源码里的函数乍一看好简单:
int main (int argc, char **argv) {
int status, result;
lua_State *L = luaL_newstate(); /* create state */
if (L == NULL) {
l_message(argv[0], "cannot create state: not enough memory");
return EXIT_FAILURE;
}
/* call 'pmain' in protected mode */
lua_pushcfunction(L, &pmain);
lua_pushinteger(L, argc); /* 1st argument */
lua_pushlightuserdata(L, argv); /* 2nd argument */
status = lua_pcall(L, 2, 1, 0);
result = lua_toboolean(L, -1); /* get result */
finalreport(L, status);
lua_close(L);
return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE;
}
今天白天试了一下用C语言写一个程序,程序中调用lua脚本,晚上看到这个源码我就乐了,什么嘛,在C里面调实际就是把lua程序的代码搬到自己代码里去实现。
再来看一个我觉得很惊艳的程序:luac -l -l 文件名.lua
通过这个命令,可以看到一些像汇编一样的东西,如下:
$ luac -l -l exelua.lua
main <exelua.lua:0,0> (3 instructions, 12 bytes at 0x1b9b530)
0+ params, 2 slots, 0 upvalues, 0 locals, 1 constant, 1 function
1 [4] CLOSURE 0 0 ; 0x1b9b710
2 [1] SETGLOBAL 0 -1 ; fun1
3 [4] RETURN 0 1
constants (1) for 0x1b9b530:
1 "fun1"
locals (0) for 0x1b9b530:
upvalues (0) for 0x1b9b530:
function <exelua.lua:1,4> (7 instructions, 28 bytes at 0x1b9b710)
2 params, 4 slots, 0 upvalues, 2 locals, 1 constant, 0 functions
1 [2] GETGLOBAL 2 -1 ; print
2 [2] MOVE 3 0
3 [2] CALL 2 2 1
4 [3] GETGLOBAL 2 -1 ; print
5 [3] MOVE 3 1
6 [3] CALL 2 2 1
7 [4] RETURN 0 1
constants (1) for 0x1b9b710:
1 "print"
locals (2) for 0x1b9b710:
0 a 1 7
1 b 1 7
upvalues (0) for 0x1b9b710:
总结出来的规律是,以函数为单位,lua文件里没有写主函数,但在这里是可以看到主函数的,估计就是从这里入手的。
今天在尝试在C里调lua函数的时候遇到了几个坑
1、gcc的时候有几个必须用到的库,liblua.a, libm.a, libld.a
2、还有三个要用的头文件#include "lua.h", #include "lualib.h", #include "lauxlib.h"。注意文件路径,小心找不着啊~
明天得研究下lua.c和一些标准库函数。撤~