Lua与C混编

看了云风 的博客,里面有很大篇幅是关于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的部分改日补充

你可能感兴趣的:(C++,c,C#,lua,Ruby)