Lua快速介绍

来源:互联网 发布:淘宝上怎么样买东西呢 编辑:程序博客网 时间:2024/05/18 23:28

其语法简单明了,其本身也非常简明精巧,所有源代码放在一起也不到700KB,编译出来的程序,一般只有几百KB,其运行起来,自然也轻快。

语法规则:

数据类型:nil,boolean, number, string, function, userdata, thread, table.

其中nil表示空。number即可以表示整数,也可以是双精度浮点数。string是可以表示任意长度的字符串或者二进制数据。userdata为用来引用C等其它语言所表示的数据结构,在Lua中只用来引用,不作修改。thread为语言中的coroutine所使用。tablelua中唯一的“数据结构”,也是非常强大的数据结构。table可以用来表示数组、不同类型的集合以及键=>值对数据。


其语法等方面主要说与C语言不同之处了,不等号用~=表示,用^表示指数运算,用#表示取长度运算。用..来连接字符串。双引号,单引号和[[]]都可以表示字符串。

注释使用两个减号来注释一行。

主要表达式结构:

if… then … elseif … then … else … endwhile… do … endfor… in … do … endfor… = start, end, step do …end

使用table,初始化的示例:

a = { [f(1)] = g; "x", "y"; x = 1, f(x), [30] = 23; 45 }

最后,使用local来表示一个局部变量,防止外部的非法引用。


lua吸引人之处是其方便与C等语言进行互操作,无论C调用Lua还是Lua调用C,都比较方便。


因为代码量比较小,且其源代码严格遵守C的规范,因此在嵌入式系统中,移植它非常方便。几乎不用改代码,只需要改一下对应的编译器、编译参数,就能编译出对应平台的版本。

C中调用Lua的方式:

一般会用到的头文件:

#include"lua.h"#include"lauxlib.h"#include"lualib.h"

在调用Lua之前,一定得获取一个Lua环境,即lua_State结构。以后的操作都是针对这个环境进行的。

lua_State*L = luaL_newstate();//new lua environment.

加载Lua的标准库,分别是base,coroutine, table, io, os, string, bit32, math, debug, package:

luaL_openlibs(L);

之后就可以使用Lua的各种CAPI进行调用操作了。

需要了解的是,在交互时使用的是栈式操作,所有的数据交换都要在这个专门的栈中进行。这就有点像JVM的字节码一样,在JVM中的所有字节码指令,都是基于栈操作的,调用函数前,先要把函数参数压入栈。调用一个函数时,函数的参考是直接从栈顶获取的。

Lua提供了一套处理这个与C语言交互的栈的API。所以我们可以很方便地使用这些API完成我们想要做的事情。

C语言中调用Lua,实际是把Lua作为一个“工具库”附加到C语言中的,因此需要提供Lua的头文件和库来编译。当使用C++或者其它语言时也是如此。反过来当使用Lua来调用C中实现的函数时,我们一般可以在把要调用的C函数,包装成一个Lua可以调用的函数(有特定的函数声明格式),然后编译成一个动态库,让lua在运行时加载,并执行。

当然,对于一些嵌入式系统,和特定的应用场景,做成一个动态库再加载显得有些麻烦,因此我们也可以直接修改Lua语言的代码,把这两个代码合在一起编译,让Lua在系统初始化之后,再直接加载对应的函数。

LuaLinux中默认没有对编译成动态库的支持,在编译时会提示使用-fPIC来编译,这时需要修改Makefile,使其编译时加上这个选项。

Lua可调用的函数原型如下:

typedefint (*lua_CFunction)(lua_State *L);

例如有一个函数

lua_Cfunction getType;

然后我们需要在本地声明一个函数列表,以包含这个函数:

staticconst struct luaL_Reg mlibs = {    {"l_sin",getType},    {NULL,NULL} //sentinel};

数组的最后要以NULL结尾。最后再实现一个简单的注册函数。用于在加载动态库时,或者在Lua启动时,调用这个函数来加载我们的库。在Lua5.2之后,使用以下方式:

intluaopen_mylib(lua_State *L){    luaL_newlib(L,mlibs);    return1;}

Lua5.2之后,不再让自定义的库自动作为全局变量了。所在在Lua中的使用方式与之前略有区别。在Lua启动之后,如果要加载动态库,需要执行

mylib= package.loadlib("mylib.so", "luaopen_mylib")()

这样就把自定义的函数放在mylib变量里了。我们可以用

mylib.getType()

来调用C的函数了。

0 0