Lua与C混编

转自:http://shumo.iteye.com/blog/387154

看了云风 的博客,里面有很大篇幅是关于Lua 的,所以想感受一下Lua。

    先前也用过很多脚本语言,用php写过网页,python写过简单小程序, 后来由于rails接触了ruby, 似乎ruby更优雅,工作需要也写perl。由于这些脚本语言平时不怎么用,每次用的时候都要看一下相应的tutorial,而且要不时的查文档。

    安装了Lua for Windows 最新版本 5.1.4.23,安装后运行QuickLuaTour,简单了解了Lua的一些语言元素和一些控制结构,标准库等。接着看自带的参考手册,比较郁闷,从中索引到了Programming in Lua,阅读了前面几个章节,了解到Lua是做为一种嵌入式、易扩展、过程化的脚本语言而存在,作为小规模的语言(只包含少数的标准库base,string,table,io,os等),其供c/c++使用的语言动态链接库(164k, 11k)和静态库(26k),很容易实现和其他语言的互相调用。内建的高级数据类型方面,没有像上述的几种脚本语言有List(Array), Dict(关联数组)等,仅有一个万能的table,索引比较自由,.和[]可以共用。

    接下来尝试了c调用Lua的函数和全局变量。新建一个vc的空的控制台项目,引入lua51.lib,把lua5.1.dll, lua51.dll放到工作目录中,新建maz.lua内容为

Lua代码   收藏代码
  1. name = "javaeye\n"  
  2.   
  3. function add(x, y)  
  4.     return x+y  
  5. end  

   新建main.c内容为

 

Lua代码   收藏代码
  1. #include <stdio.h>  
  2. #include <lua.h>  
  3. #include <lauxlib.h>  
  4.   
  5. lua_State *L;  
  6.   
  7. /**  
  8.  * 函数调用过程是一个入栈出栈的过程,需要把函数,参数分别压入堆栈,  
  9.  * 通过lua_call,调用堆栈中的函数并弹出相关数据  
  10.  * 这个过程跟java虚拟机的字节码方法调用基本一致,把数据送入操作栈,然后调用、出栈  
  11.  *   
  12.  */  
  13. int luaadd(int x, int y)   
  14. {  
  15.     int sum;  
  16.     lua_getglobal(L, "add");  
  17.     lua_pushnumber(L, x);  
  18.     lua_pushnumber(L, y);  
  19.     /* LUA_API void  (lua_call) (lua_State *L, int nargs, int nresults); */  
  20.     lua_call(L, 21);  
  21.     sum = (int)lua_tonumber(L, 1);  
  22.     lua_pop(L, 1);  
  23.     return sum;  
  24. }  
  25.   
  26. int main(int argc, char *argv[])   
  27. {  
  28.     char line[BUFSIZ];  
  29.     char *name;  
  30.     L = lua_open();  
  31.     luaL_dofile(L, "maz.lua");  
  32.     printf("1+2=%d\n", luaadd(12));   
  33.     lua_getglobal(L, "name");  
  34.     name = (char *)lua_tostring(L, 1);  
  35.     lua_pop(L, 1);  
  36.     printf("name: %s", name);  
  37.     lua_close(L);  
  38.     return 0;  
  39. }  

    代码很简明(代码是参考网上的),这样就实现了c调用Lua代码,Lua代码动态的解释执行。无需参与程序编译,可以代替或增强配置文件。今天主要是想了解一下Lua,有些细节的东西待深入学习。

    其中Lua调用C的部分改日补充


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值