概述
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
- 浏览 2322
- 评论(5)
- 论坛回复 / 浏览 (4 / 8274)
- 查看更多
相关推荐
lua, 基于web的面向对象编程语言 Lua 5.1自述文件请参阅安装安装说明。 查看历史以获得自上次发布版本以来的更改摘要。什么是 Lua?Lua是一种强大的轻量级编程语言,旨在扩展应用程序。 Lua也经常被用作通用的语言,...
Lua 编程入门教程。Lua一种脚本语言,是C语言扩展功能利器。
中文编程, Lua语言,5.4.0版本, 函数和关键字可以用中文编写进行编程的,教材的第二章,数据类型,第一节的例程。 有没有喜欢中文编程的朋友,请关注我博客内,有更多的例程。
中文编程, Lua语言,5.4.0版本, 函数和关键字可以用中文编写进行编程的,教材的第二章,数据类型,第三 节的例程。 有没有喜欢中文编程的朋友,请关注我博客内,有更多的例程。
中文编程, Lua语言,5.4.0版本, 函数和关键字可以用中文编写进行编程的,教材的第一个例程。 有没有喜欢中文编程的朋友,请关注我博客内,有更多的例程。
Terra是一种低级系统编程语言,嵌入在Lua编程语言中并由其元编程。_C++_Terra_下载.zip
使用Python Lua和Ruby语言进行游戏编程
嵌入式编程语言LUA 在windows上的安装包,安装后就可以直接变成使用了
lua programming language
2004年的GDC,全世界的游戏开发者都在争论Lua和Python哪个更好。没多久《魔兽世界》出来了,此后就再也没人争论过了。《魔兽世界》影响了全世界的玩家,LUA自然影响了全世界的游戏开发者。
使用cocos2d-x 引擎 3.17版本,编程语言lua编写, 仿90坦克,包括以下内容 1.地图编辑器 2.格子计算,随机产生坦克,坦克移动,坦克发子弹,碰撞检测,键盘按键监听等等,可自己扩展。 3.代码完整,运行库完整,可...
《罗布乐思开发官方指南:Lua 语言编程》读书笔记模板x.pptx
Terra是一种新的低级系统编程语言,旨在与Lua编程语言无缝地互操作。 它也与现有的C代码向后兼容(在嵌入)。 与C一样,Terra是具有手动内存管理功能的单态,静态类型的编译语言。 但是与C不同,它旨在简化与Lua的...
中文编程, Lua语言,5.4.0版本, 函数和关键字可以用中文编写进行编程的,教材的第二章,数据类型,第二节的例程。 有没有喜欢中文编程的朋友,请关注我博客内,有更多的例程。
MicroLua在Nintendo DS上带来了编程语言Lua,可轻松快速地开发漂亮的自制软件! µLua基于brunni的µLibrary,是一种Lua解释器,具有快速绘图和许多重要功能。 您可以使用简单而强大的Lua语言来开发您的Nintendo DS...
LuaD-用于D编程语言的Lua import luad.all;void main (){auto lua = new LuaState;lua.openLibs();auto print = lua. get ! LuaFunction( " print " );print( " hello, world! " );} LuaD是D和Lua编程语言之间的桥梁...
Ravi 编程语言是 Lua 5.3 的一个衍生,有限的可选静态类型,基于 LLVM 和 libgccjit 的 JIT 编译器。 Ravi 的名字来自梵语的太阳。
Lua经典编程书籍三本 gisit2012-05-11上传 三本书:1、Lua编程指南; 2、Lua程序设计_第二版_中文; 3、Programming in Lua, 2Nd Edition
我假设大家都学过至少一门编程语言,比如Basic或C,特别是C。因为Lua的最大用途是在宿主程序中作为脚本使用的。Lua 的语法比较简单,学习起来也比较省力,但功能却并不弱。 在Lua中,一切都是变量,除了关键字。请...
包含3个PPT: 1. How Lua works with C/C++ (36 pages + 4个示例程序) 2. Important concepts in Lua (46 pages: module and package, function and closure, ...3. Basic in Lua (37 pages: 介绍Lua的基础语法)