一:为什么要学习lua
先说说我懂什么,金融行业开发工程师的基本特点:Unix/Linux + C + Oracle/mysql/DB + shell,也就是在学习Lua前我只懂这些,之前也会C++,但自进入该行业后再也没有实际用过C++了,到要跳槽的时候发现自己真心懂得少,哎……说多了都是泪。为什么学习lua?
其一,这是目前IT行业里一门很热门的语言,尤其是游戏行业,室友就是做游戏的,需求量大;
其次,这是一种高效的脚本语言,比shell高效多了,追求高效自不必说;
其三,原本老大提议过希望用lua脚本重写系统配置文件的加载过程,公司配置文件的加载都是用redis静态加载的,每次配置文件更新都得重启系统,麻烦!希望换成动态加载并且高效的方式。
基于以上原因,不情愿的跨出实际的一步,学习lua。最开始的目的只有一个,在C里调用lua,程序能够编译并运行。
1.下载lua库
USBdriver~$ wget http://download.chinaunix.net/download.php?id=97&ResourceID=58
2.解压并安装
USBdrivers~$ tar -xzvf lua-5.1.tar.gz
USBdrivers~$ cd ~/lua-5.1
USBdrivers~$ make linux install
3.编写程序
//C_lua.c///
#include <lua.h> //Lua语言解析器
#include <lualib.h> //Lua标准库
#include <lauxlib.h> //Lua辅助工具
char *code = "for i=0, 5 do print(\'Hello, world!\') end";
int main()
{
lua_State *s = luaL_newstate(); //建立一个虚拟机
luaL_openlibs(s); //打开Lua附加库
luaL_dostring(s, code); //执行字符串中的源代码
lua_close(s); //关闭虚拟机
return 0;
}
4.编译
USBdrivers~$ gcc -o C_lua C_lua.c -llua -lm -ldl
5.运行
USBdrivers~$ ./C_lua
hello World!
hello World!
hello World!
hello World!
hello World!
通过以上5步,实现了语言学习的第一个目的。
################
附录1:常用lua接口
################
lua_State* luaL_newstate(void) ; //创建lua运行上下文
int luaL_loadfile(lua_State *L, const char *filename); //加载lua脚本文件,但不运行
luaL_openlibs(L); //装载lua的库
数据入"栈"接口:
void (lua_pushnil) (lua_State *L);
void (lua_pushnumber) (lua_State *L, lua_Number n);
void (lua_pushinteger) (lua_State *L, lua_Integer n);
void (lua_pushlstring) (lua_State *L, const char *s, size_t l);
void (lua_pushstring) (lua_State *L, const char *s);
void (lua_pushboolean) (lua_State *L, int b);
void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n);
数据获取接口:
lua_Number (lua_tonumber) (lua_State *L, int idx);
lua_Integer (lua_tointeger) (lua_State *L, int idx);
int (lua_toboolean) (lua_State *L, int idx);
const char *(lua_tolstring) (lua_State *L, int idx, size_t *len);
lua_CFunction (lua_tocfunction) (lua_State *L, int idx);
"栈"操作接口:
int (lua_gettop) (lua_State *L);
void (lua_settop) (lua_State *L, int idx);
void (lua_pushvalue) (lua_State *L, int idx);
void (lua_remove) (lua_State *L, int idx);
void (lua_insert) (lua_State *L, int idx);
void (lua_replace) (lua_State *L, int idx);
int (lua_checkstack) (lua_State *L, int sz);
lua中定义的变量和函数存放在一个全局table中,索引值为LUA_GLOBALSINDEX ,table相关操作接口:
void (lua_gettable) (lua_State *L, int idx);
void (lua_getfield) (lua_State *L, int idx, const char *k);
void (lua_settable) (lua_State *L, int idx);
void (lua_setfield) (lua_State *L, int idx, const char *k);
当"栈"中包含执行脚本需要的所有要素(函数名和参数)后,调用lua_pcall执行脚本:
int (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc);
在lua中调用C函数,一般需要在C里使用下面两个接口:
void lua_pushcfunction(lua_State *L, void* func); //注册在lua中使用的c函数
void lua_setglobal(lua_State *L, const char *k); //绑定到lua中的名字csum