看了云风 的博客,里面有很大篇幅是关于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内容为
name = "javaeye\n" function add(x, y) return x+y end
新建main.c内容为
#include <stdio.h> #include <lua.h> #include <lauxlib.h> lua_State *L; /** * 函数调用过程是一个入栈出栈的过程,需要把函数,参数分别压入堆栈, * 通过lua_call,调用堆栈中的函数并弹出相关数据 * 这个过程跟java虚拟机的字节码方法调用基本一致,把数据送入操作栈,然后调用、出栈 * */ int luaadd(int x, int y) { int sum; lua_getglobal(L, "add"); lua_pushnumber(L, x); lua_pushnumber(L, y); /* LUA_API void (lua_call) (lua_State *L, int nargs, int nresults); */ lua_call(L, 2, 1); sum = (int)lua_tonumber(L, 1); lua_pop(L, 1); return sum; } int main(int argc, char *argv[]) { char line[BUFSIZ]; char *name; L = lua_open(); luaL_dofile(L, "maz.lua"); printf("1+2=%d\n", luaadd(1, 2)); lua_getglobal(L, "name"); name = (char *)lua_tostring(L, 1); lua_pop(L, 1); printf("name: %s", name); lua_close(L); return 0; }
代码很简明(代码是参考网上的),这样就实现了c调用Lua代码,Lua代码动态的解释执行。无需参与程序编译,可以代替或增强配置文件。今天主要是想了解一下Lua,有些细节的东西待深入学习。
其中Lua调用C的部分改日补充