lua学习之路(一)

       一:为什么要学习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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值