概述
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 17:12
- 浏览 2416
- 评论(5)
- 论坛回复 / 浏览 (4 / 8296)
- 查看更多
相关推荐
史上最全编程语言全套教程,共99门编程语言,包括: 函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 逻辑编程语言 面向对象编程语言 等所有常见...
lua, 基于web的面向对象编程语言 Lua 5.1自述文件请参阅安装安装说明。 查看历史以获得自上次发布版本以来的更改摘要。什么是 Lua?Lua是一种强大的轻量级编程语言,旨在扩展应用程序。 Lua也经常被用作通用的语言,...
Lua 被设计为一种扩展编程语言,支持通用的过程式编程以及数据描述能力。它不仅提供面向对象编程、函数式编程和数据驱动编程的良好支持,还旨在作为任何需要脚本语言的强大而轻量级工具。Lua 以库的形式实现,用纯 C...
学习Lua不仅能够帮助开发者掌握一种新的脚本语言,还能深入了解如何将脚本语言与传统编程语言相结合,从而提高整体开发效率。 - **基础知识**:首先需要了解Lua的基本语法结构,包括变量、数据类型、控制结构等。 -...
7. **元编程能力**:Lua的元表(metatable)机制允许用户自定义数据类型的操作行为,比如重载算术运算符和索引操作,增强了语言的灵活性。 8. **热更新**:在游戏开发中,Lua代码可以热更新,无需重启游戏即可修改...
本书旨在详尽介绍 Lua 编程语言的各个方面,包括其语法、语义以及如何将其作为扩展语言嵌入到宿主程序中。 #### Lua:一种多功能编程语言 Lua 被设计为一种支持通用过程编程,并具备数据描述功能的扩展编程语言。...
《云风的 BLOG- 采访 Lua 发明人的一篇文章》是关于编程语言 Lua 的深度探讨,这篇博客文章详尽地记录了云风对 Lua 的发明者之一的访谈过程,揭示了 Lua 的设计理念和背后的故事。Lua 是一种轻量级、高效、可扩展的...
Lua是一种简单高效的脚本编程语言,由Roberto Ierusalimschy等编写,并由***翻译并发布。该语言简单易学,与C、Java等编程语言兼容性好,特别适用于需要脚本编程的场合,比如大型游戏中的剧情控制、手机应用开发等。...
中文编程, Lua语言,5.4.0版本, 函数和关键字可以用中文编写进行编程的,教材的第二章,数据类型,第一节的例程。 有没有喜欢中文编程的朋友,请关注我博客内,有更多的例程。
- **语言多样性**:列举了多种编程语言,包括主流的C/C++、Java、C#等,以及偏门的如Fortran、动态语言Perl、Tcl、Ruby、Python等,特别提到本书的主角——Lua。 - **语言选择的重要性**:不同的任务适合不同的编程...
中文编程, Lua语言,5.4.0版本, 函数和关键字可以用中文编写进行编程的,教材的第二章,数据类型,第三 节的例程。 有没有喜欢中文编程的朋友,请关注我博客内,有更多的例程。
### Lua编程语言知识点详解 #### 一、Lua编程语言简介 **Lua** 是一种轻量级的、高效的脚本语言,被广泛应用于游戏开发、Web 应用、配置管理等领域。Lua 的设计初衷是为了实现简单易用且高效的语言特性,这使得它...
中文编程, Lua语言,5.4.0版本, 函数和关键字可以用中文编写进行编程的,教材的第一个例程。 有没有喜欢中文编程的朋友,请关注我博客内,有更多的例程。
在提供的压缩包文件中,"Premier.Press.Game.Programming.with.Python.Lua.and.Ruby.ebook-LiB.chm"很可能是一本关于使用这三种语言进行游戏编程的电子书,它可能会详细介绍如何利用这些语言来开发游戏,涵盖从基础...
《脚本引擎内核源代码之:Lua-5.1》是关于编程语言 Lua 的一个专深主题,主要关注其5.1版本的内核源代码。Lua 是一种轻量级、高性能、可嵌入式的脚本语言,广泛应用于游戏开发、系统管理、配置文件等多种场景。本文...
在IT行业中,C++与LUA的交互编程是一种常见的技术,尤其在游戏开发领域,由于LUA的轻量级和易读性,常被用作脚本语言来扩展C++程序的功能。本篇将深入探讨如何利用LUA库在C++环境中进行交互编程,以及在给定的压缩包...
Lua API 参考文档提供了详细的Lua脚本编程语言使用方法和罗技G系列外设宏命令编程的详细信息。 2. 手册目录 手册目录提供了罗技G系列外设宏命令编程的详细目录,包括Lua API 参考文档、手册目录、内容预览、参考...
Lua API中文翻译高清版是针对编程语言Lua的官方应用程序接口(API)的详细中文文档,旨在帮助中国开发者更好地理解和使用Lua。Lua是一种轻量级、高效、可扩展的脚本语言,广泛应用于游戏开发、系统配置、嵌入式系统...
在IT行业中,编程语言Lua因其轻量级、高效和易嵌入的特性,在游戏开发、脚本编写等领域广泛应用。在处理敏感词问题时,Lua也能提供解决方案。标题“lua屏蔽字处理”指的是在Lua环境中对敏感词进行过滤或替换的技术,...
1. **源码**:在学习任何编程语言时,理解其源码能够帮助我们深入理解语言的工作原理。Lua的源码相对较小且易于理解,是学习者探究语言机制的好材料。 2. **工具**:Lua常用于编写自动化工具、配置脚本或作为其他...