Lua1.1

Lua1.1 Lua 的参考手册 (三)

爱⌒轻易说出口 提交于 2019-12-20 01:00:33
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> (接上篇) -------------------------------------- 7 一些例子 -------------------------------------- 本段给出一些显示 Lua 特性的例子。它并不打算覆盖完整的语言,只是显示一有趣的使用。 ------------------- 7.1 函数 next 和 nextvar ------------------- 这个例子显示如何使用函数 next 去遍历一个表的字段: function f (t) -- t is a table local i, v = next(t, nil) -- i is an index of t, v = t[i] while i do -- do something with i and v i, v = next(t, i) -- get next index end end 这个例子打印所有值非空的全局变量的名字 function printGlobalVariables () local i, v = nextvar(nil) while i do print(i) i, v = nextvar(i) end end ------------------- 7.2 字符串操作 ----------

Lua1.1 Lua 的参考手册 (二)

左心房为你撑大大i 提交于 2019-12-20 01:00:10
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> (接上篇) -------------------------------------- 5 API -------------------------------------- 这节主要描述 Lua 的 API, 也就是宿主程序和库交互的一组 C 函数。API 函数可以分为以下几类: 1. 执行 Lua 代码; 2. 在 Lua 和 C 之间进行值的转化; 3. 操作(读写)Lua 对象; 4. 调用 Lua 函数; 5. 由 Lua 调用的 C 函数; 6. 错误处理。 所有的 API 都在文件 lua.h 中声明。除非另有说明,API 函数返回一个错误码:0 为成功,非 0 为失败。 ------------------- 5.1 执行 Lua 代码 ------------------- 一个宿主程序可以执行写在文件中或在字符串中的 Lua 代码,使用下面的函数: int lua_dofile (char *filename); int lua_dostring (char *string); ------------------- 5.2 在 Lua 和 C 之间进行值的转化 ------------------- 因为 Lua 没有静态的类型系统,所有的在 Lua 和 C 之间传递的值的类型为

Lua1.1 Lua 的参考手册 (一)

﹥>﹥吖頭↗ 提交于 2019-12-20 00:59:57
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 说明: 这个文档是 Lua1.1 的 doc 目录里的 manual.ps 文件。 原文版权归原作者所有,这篇翻译只是作为学习之用。如果翻译有不当之处,请参考原文。 -------------------以下是正文------------------- 编程语言 Lua 的参考手册 摘要:Lua 是嵌入式语言,被设计用来做为一个配置语言给其它程序使用。本文档描述 Lua 编程语言以及 Lua 程序和宿主 C 程序交互的 API。它展示了一些使用这些主要特点的例子。 -------------------------------------- 1 简介 -------------------------------------- Lua 是一种嵌入式编程语言,支持过程式编程与数据描述功能。它经常做为别的程序的配置语言使用。Lua 是由 R. Ierusalimschy, L. H. de Figueiredo 和 W. Celes 设计, 由 W. Celes 实现。 Lua 被实现为由 C 语言写成的库。做为一个嵌入式语言,Lua 没有 "main" 函数的概念;它只能嵌入到宿主运行,叫做嵌入程序。宿主可以执行一段 Lua 代码,可以读写 Lua 变量,可以注册被 Lua 代码调用的 C 函数。通过注册 C

Lua1.1 Lua 的设计和实现 (一)

二次信任 提交于 2019-12-20 00:59:44
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 说明: 这个文档是 Lua1.1 的 doc 目录里的 lua.ps 文件。 同时这个文档可以这里找到:http://www.lua.org/semish94.html 原文版权归原作者所有,这篇翻译只是作为学习之用。如果翻译有不当之处,请参考原文。 --------------------以下是正文------------------ 应用程序扩展语言的设计和实现 摘要。我们描述 Lua 的设计和实现,一个简单而强大的应用程序扩展语言。尽管Lua是一种程序语言,它有数据描述能力,并已广泛应用于几个生产任务,包括用户配置,通用的数据输入,用户界面的描述,描述应用程序对象和存储结构化图形元文件。 -------------------------------------- 简介 -------------------------------------- 有越来越多的定制应用程序的需求。随着应用程序变得更加复杂,用简单参数来定制变得不太可能:用户现在想要在程序运行时决定采用哪种配置;用户还想自己写宏和脚本,以提高生产率(Ryan 1990)。因此,如今规模大点儿的应用程序几乎总是为终端用户提供配置或脚本语言以做扩展之用。这些语言通常是简单的,但每一种都有它自己的语法。因此,用户必须为每种应该程序学会一门新的语言

Lua1.1 虚拟机指令分析(二)

为君一笑 提交于 2019-12-20 00:55:08
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> (接上篇) > EQOP case EQOP: { Object *l = top-2; Object *r = top-1; --top; if (tag(l) != tag(r)) tag(top-1) = T_NIL; else { switch (tag(l)) { case T_NIL: tag(top-1) = T_NUMBER; break; case T_NUMBER: tag(top-1) = (nvalue(l) == nvalue(r)) ? T_NUMBER : T_NIL; break; case T_ARRAY: tag(top-1) = (avalue(l) == avalue(r)) ? T_NUMBER : T_NIL; break; case T_FUNCTION: tag(top-1) = (bvalue(l) == bvalue(r)) ? T_NUMBER : T_NIL; break; case T_CFUNCTION: tag(top-1) = (fvalue(l) == fvalue(r)) ? T_NUMBER : T_NIL; break; case T_USERDATA: tag(top-1) = (uvalue(l) == uvalue(r)) ? T

Lua1.1 Lua 的设计和实现 (二)

纵然是瞬间 提交于 2019-12-20 00:54:52
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> (接上篇) -------------------------------------- 实现 -------------------------------------- 扩展语言总是由应用程序以某种方式解释执行的。简单的扩展语言可以直接从源代码进行解释执行。另一方面,嵌入式语言通常是强大的编程语言,具有复杂的语法和语义。一个更有效的嵌入式语言实现技术是设计适合语言需求的虚拟机,编译扩展程序成虚拟机的字节码,然后通过解释执行字节码来模拟虚拟机(Betz 1988, 1991; Franks 1991)。我们选择这种混合架构来实现Lua;和直接执行源代码相比,它拥有如下优点: 因为词法和语法解析只进行一次,可能在实际嵌入之前使用外部解析器,识别简单的早期错误,获得更短的开发周期和更快的执行速度; 如果使用一个外部编译器时,可以只提供字节码形式的扩展程序,也就是预编译,从而可以使加载更快,环境更安全,运行时更小(不过,连接几个预编译的扩展程序可能是一项艰巨的任务)。 这种架构率先用于 Smalltalk(Goldberg–Robson 1983; Budd 1987)(字节码就是从它那里借来的术语),也成功用于基于P码(Clark–Koehler 1982)的 UCSD 的 Pascal 系统。在这些系统中

Lua1.1 虚拟机指令分析(一)

ぃ、小莉子 提交于 2019-12-20 00:38:57
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在语法分析 lua_parse 之后,调用 lua_execute 来执行语法分析生成的字节码。 虚拟机的指令是一个枚举型,就是在 opcode.h 中的 OpCode, 通过 lua_execute 中的那个 switch case 来看下指令对应的操作。 > PUSHNIL case PUSHNIL: tag(top++) = T_NIL; break; 设置栈顶的 Object 类型为 T_NIL,这个栈就是之前所说的那个 Lua 和 C 之间交互的那个栈。 > PUSH0, PUSH1, PUSH2 case PUSH0: tag(top) = T_NUMBER; nvalue(top++) = 0; break; case PUSH1: tag(top) = T_NUMBER; nvalue(top++) = 1; break; case PUSH2: tag(top) = T_NUMBER; nvalue(top++) = 2; break; 设置栈顶的 Object 类型为 T_NUMBER,值为 0/1/2。 这个是指令优化,把操作数放到指令里,从而让指令更短,执行的更快些。 这几个指令是 PUSHBYTE 指令的优化版,或者叫特化版更合适一些。 > PUSHBYTE case PUSHBYTE

Lua1.1 公开发布的第一版

你。 提交于 2019-12-20 00:33:05
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Lua1.1 是官方公开发布的第一版,是事实上的第一版 ,也是最早发布的一版。 代码从这里 www.lua.org/ftp/lua-1.1.tar.gz 下载,事实上在 www.lua.org/versions.html 页面,有所有的可以下下载到的版本。 代码下载下来之后,解压,可以看到这次多了不少目录(和 Lua1.0 的一个孤零零的目录相比)。 目录介绍: clients, include, src 目录中是代码。 test 目录中是一些测试文件。 doc 目录中是文档。 编译: 看目录中有 Makefile 文件,make 一下试试,不行,各种奇怪的错误。好吧,我比较懒,就不深究原因了。开 VS2010, 把上面提到的几个代码目录中的文件全部拷贝到一起,建工程,把这些代码全部加入工程,编译,编译失败, 在 iolib.c 的 21 行报错:error C2099: initializer is not a constant 看看 iolib.c 的 21 行是什么 static FILE *in=stdin, *out=stdout; 这个代码错误好像很熟悉的样子,是的,Lua1.0 里就遇到过了。同样,这里做如下修改: iolib.c 21 行 static FILE *in=stdin, *out