论坛首页 编程语言技术论坛

编程语言 Lua

浏览 8270 次
精华帖 (0) :: 良好帖 (10) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-03-28   最后修改:2009-03-28

 

 

概述

Lua 是一个扩展式程序设计语言,它被设计成支持通用的过程式编程,并有相关数据描述的设施。 Lua 也能对面向对象编程,函数式编程,数据驱动式编程提供很好的支持。 它可以作为一个强大、轻量的脚本语言,供任何需要的程序使用。 Lua 以一个用 clean C 写成的库形式提供。(所谓 Clean C ,指的 ANSI C 和 C++ 中共通的一个子集)作为一个扩展式语言,Lua 没有 "main" 程序的概念:它只能 嵌入 一个宿主程序中工作,这个宿主程序被称作 embedding program 或简称为 host 。 宿主程序可以通过调用函数执行一小段 Lua 代码,可以读写 Lua 变量,可以注入 C 函数让 Lua 代码调用。 这些扩展的 C函数,可以大大的扩展了 Lua 可以处理事务的领域,这样就可以订制出各种语言, 而它们共享一个统一的句法格式的框架。 Lua的官方发布版就包含了一个叫做 lua的简单的宿主程序,它用 Lua 库提供了一个保证独立的 Lua 解释器。

 

Lua 是一个自由软件,它的使用许可决定了对它的使用过程一般没有任何保证。


在两个世界之间最好地进行混合

如果您希望充分利用这两个世界的优点,应该怎样办呢,是选择最好的性能还是选择高级强大的抽象?更进一步说,如果我们希望对处理器密集且依赖于系统的算法和函数以及与系统无关且很容易根据需要而进行修改的单独逻辑进行优化,那又当如何呢?

对高性能代码和高级编程的需要进行平衡是 Lua(一种可嵌入式脚本语言)要解决的问题。在需要时我们可以使用编译后的代码来实现底层的功能,然后调用Lua 脚本来操作复杂的数据。由于 Lua 脚本是与编译代码独立的,因此我们可以单独修改这些脚本。使用 Lua,开发周期就非常类似于(编码、编译、运行、编写脚本、编写脚本、编写脚本)。

例如,Lua Web 站点 “使用” 页面(请参见 参考资料 )列出了主流市场上的几个计算机游戏,包括 World of Warcraft 和(家用版的)Defender ,它们集成 Lua 来实现很多东西,从用户界面到敌人的人工智能都可以。Lua 的其他应用程序包括流行的 Linux 软件更新工具 apt-rpm的扩展机制,还有 “Crazy Ivan” Robocup 2000 冠军联赛的控制逻辑。这个页面上的很多推荐感言都对 Lua的小巧与杰出性能赞不绝口。

嵌入和扩展

除了语法简单并且具有功能强大的表结构之外,Lua 的强大功能使其可以与宿主语言混合使用。由于 Lua 与宿主语言的关系非常密切,因此 Lua脚本可以对宿主语言的功能进行扩充。但是这种融合是双赢的:宿主语言同时也可以对 Lua 进行扩充。举例来说,C 函数可以调用 Lua函数,反之亦然。

Lua 与宿主语言之间的这种共生关系的核心是宿主语言是一个虚拟堆栈 。虚拟堆栈与实际堆栈类似,是一种后进先出LIFO)的数据结构,可以用来临时存储函数参数和函数结果。要从 Lua中调用宿主语言的函数(反之亦然),调用者会将一些值压入堆栈中,并调用目标函数;被调用的函数会弹出这些参数(当然要对类型和每个参数的值进行验证),对数据进行处理,然后将结果放入堆栈中。当控制返回给调用程序时,调用程序就可以从堆栈中提取出返回值。

实际上在 Lua 中使用的所有的 C 应用程序编程接口(API)都是通过堆栈来进行操作的。堆栈可以保存 Lua 的值,不过值的类型必须是调用程序和被调用者都知道的,特别是向堆栈中压入的值和从堆栈中弹出的值更是如此(例如 lua_pushnil()和 lua_pushnumber()。

清单 2 给出了一个简单的 C 程序(节选自 参考资料Programming in Lua 一书的第 24 章),它实现了一个很小但却功能完善的 Lua 解释器。

 

清单 2. 一个简单的 Lua 解释器

 1 #include 

 2 #include 

 3 #include 

 4 #include 

 5

 6 int main (void) {

 7   char buff[256];

 8   int error;

 9   lua_State *L = lua_open();   /* opens Lua */

10   luaopen_base(L);             /* opens the basic library */

11   luaopen_table(L);            /* opens the table library */

12   luaopen_io(L);               /* opens the I/O library */

13   luaopen_string(L);           /* opens the string lib. */

14   luaopen_math(L);             /* opens the math lib. */

15

16   while (fgets(buff, sizeof(buff), stdin) != NULL) {

17     error = luaL_loadbuffer(L, buff, strlen(buff), "line") ||

18             lua_pcall(L, 0, 0, 0);

19     if (error) {

20       fprintf(stderr, "%s", lua_tostring(L, -1));

21       lua_pop(L, 1);  /* pop error message from the stack */

22     }

23   }

24

25   lua_close(L);

26   return 0;

27 }


第 2 行到第 4 行包括了 Lua 的标准函数,几个在所有 Lua 库中都会使用的方便函数以及用来打开库的函数。第 9 行创建了一个 Lua 状态 。所有的状态最初都是空的;我们可以使用 luaopen_...()将函数库添加到状态中,如第 10 行到第 14 行所示。

第 17 行和 luaL_loadbuffer()会从 stdin中以块的形式接收输入,并对其进行编译,然后将其放入虚拟堆栈中。第 18 行从堆栈中弹出数据并执行之。如果在执行时出现了错误,就向堆栈中压入一个 Lua 字符串。第 20 行访问栈顶(栈顶的索引为 -1
)作为 Lua 字符串,打印消息,然后从堆栈中删除该值。

使用 C API,我们的应用程序也可以进入 Lua 状态来提取信息。下面的代码片段从 Lua 状态中提取两个全局变量:

..

if (luaL_loadfile(L, filename) || lua_pcall(L, 0, 0, 0))

  error(L, "cannot run configuration file: %s", lua_tostring(L, -1));



lua_getglobal(L, "width");

lua_getglobal(L, "height");

..

width = (int) lua_tonumber(L, -2);

height = (int) lua_tonumber(L, -1);

..


请再次注意传输是通过堆栈进行的。从 C 中调用任何 Lua 函数与这段代码类似:使用 lua_getglobal()来获得函数,将参数压入堆栈,调用 lua_pcall(),然后处理结果。如果 Lua 函数返回 n 个值,那么第一个值的位置在堆栈的 -n 处,最后一个值在堆栈中的位置是 -1。

反之,在 Lua 中调用 C 函数也与之类似。如果您的操作系统支持动态加载,那么 Lua 可以根据需要来动态加载并调用函数。(在必须使用静态加载的操作系统中,可以对 Lua 引擎进行扩充,此时调用 C 函数时需要重新编译 Lua。)


结束语

Lua是一种学习起来容易得难以置信的语言,但是它简单的语法却掩饰不了其强大的功能:这种语言支持对象(这与 Perl
类似),元表使表类型具有相当程度的可伸展性,C API 允许我们在脚本和宿主语言之间进行更好的集成和扩充。Lua 可以在C、C++、C#、Java™ 和 Python 语言中使用。

在创建另外一个配置文件或资源格式(以及相应的处理程序)之前,请尝试一下 Lua。Lua 语言及其社区非常健壮,具有创新精神,随时准备好提供帮助。

 

  • 大小: 5.3 KB
   发表时间:2009-03-28   最后修改:2009-03-28
个人以为加入 CWDG 写山口山插件,是最好的学习途径之一 ……

另外 scite 也嵌入了 lua ,其源代码也很值得学习。
0 请登录后投票
   发表时间:2009-04-02   最后修改:2009-04-02
写山口山的插件确实非常快的学习lua

以前就改过
0 请登录后投票
   发表时间:2009-04-09  
号称最快的脚本语言,不过除了嵌入,似乎也没什么地方能用到。

话说,LUA跟Python有啥关系的说?
0 请登录后投票
   发表时间:2009-04-22  
学起来简单的难以置信,用起来麻烦的难以置信。

鉴定完毕。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics