- 浏览: 151259 次
- 性别:
- 来自: 北京
最新评论
文章列表
为了可能的版权问题,特此说明《The design and implementation of a language for extendingapplications》版权属于原作者们,我翻译的此文档,网友最好加上原始链接再转载,但不强求,因为我不敢保证我翻译,表达的准确性,正确性。这只是 ...
- 2013-12-04 09:36
- 浏览 322
- 评论(0)
2008年偶然接触lua,但一直未在工作中使用。网上介绍lua有很多优点
我想lua的优秀一定有其优秀的dna。
虽然lua几个大版本之间有可能存在不兼容,但是他优秀的dna应该还是在早期版本上找到。
因此我开始看lua1.0的相关文档,代 ...
- 2013-12-04 09:34
- 浏览 394
- 评论(0)
Compilation, Execution, and Errors
前面我们介绍过dofile函数, 其实dofile的实现如下:
function dofile (filename)
local f = assert(loadfile(filename))
return f()
end
loadfile函数很灵活, 我们可以多次调用loadfile的返回结果来反复执行一段代码. 但是如果出错loadfile将返回nil和一个错误提示信息.
loadstring功能和loadfile类似, 参数为要直接处理的script内容.
f = loadstring ...
- 2013-12-04 09:25
- 浏览 305
- 评论(0)
lua是一种动态类型语言, 不用特别声明变量以及指定类型, 首次赋值即为声明. 说到此点, 我觉得动态语言的这种特点与汇编倒是蛮象的: 不管你是什么类型, 对于底层而言, 它代表的就是一内存地址, 而操作符代表的就是对这些地址及存在于这些地址里的量进行操作而已. 闲话少说, 继续看pil, 今天的内容是: types and values.
笔记内容:
1. lua提供了八种数据类型: nil, boolean, string, number, userdata, function, thread, table. 如果想看某个表达式是何种类型的, 可以使用type()函数, 它的 ...
- 2013-12-04 09:25
- 浏览 441
- 评论(0)
Lua中的函数是一阶类型值(first-class value),定义函数就象创建普通类型值一样(只不过函数类型值的数据主要是一条条指令而已),所以在函数体中仍然可以定义函数。假设函数f2定义在函数f1中,那么就称f2为f1的内嵌(inner)函数,f1为f2的外包(enclosing)函数,外包和内嵌都具有传递性,即f2的内嵌必然是f1的内嵌,而f1的外包也一定是f2的外包。内嵌函数可以访问外包函数已经创建的所有局部变量,这种特性便是所谓的词法定界(lexical scoping),而这些局部变量则称为该内嵌函数的外部局部变量(external
local variable)或 ...
- 2013-12-04 09:24
- 浏览 400
- 评论(0)
A No-Frills Introduction to Lua 5.1 VM Instructions
by Kein-Hong Man, esq. <khman AT users.sf.net>
Version 0.1, 20060313
1 Introduction
这是一本关于Lua 5.1虚拟机指令集的完全介绍。与Perl和Python相比,Lua的简洁性使得有人可以一窥它的内幕并理解它的内在实现。如果没有把一个“生物”切开就不可能检查它的内脏,器官和那些令人生厌的平时难得一见的东西,同样的道理,在没有拆分的情况下,任何人都不会完全的理解体会一个脚本语言或是任何复 ...
- 2013-12-04 09:21
- 浏览 350
- 评论(0)
第1章续(11-3)
第二节局部函数的声明
前面研究了局部变量的定义,下面就研究下,lua中局部函数定义的方法。
其中局部函数定义的语法是:
local function FuncName (parlist) chunk END
首先,lua会检测到local function这两个关键字,知道后面是在定义局部函数,lua会跳过这两个关键字,分别用llex_next()和testnext()。testnext()和checknext()这两个函数的区别是,checknext()是期望后面是某个token,是的话就读取,如果不是的话,就会报错,而testnext()是检查后面是不 ...
- 2013-12-04 09:18
- 浏览 491
- 评论(0)
Lua是边进行语法分析,边词法分析。其中,词法分析的模块是:llex。其对外暴露的接口是:llex_next()。并且,在整个语法分析、词法分析的过程中,只有一个唯一的全局实例:llex_state。
在词法分析的过程中,lua会处理以下几种情况:
<1>‘/r’, ‘/n’ 这两个东西的任意组合,是换行,lua直接跳过,其中是用inclinenumber(ls)这个函数跳过的。
<2> --或–--[ ]注释,lua也会跳过,不过,lua是通过把注释当作字符串读取后跳过的。
<3>[==[]==],中间是等量=的字符串,lua会读取字符串,通过rea ...
- 2013-12-04 09:17
- 浏览 476
- 评论(0)
一、概览
ldo.h/ldo.c描述Lua的堆栈和调用的结构。
提供对调用、协程、异常等复杂控制流的支持。
模块中对外公开的API主要分为以下几类:
(1) 错误恢复:
luaD_seterrorobj,luaD_throw,luaD_rawrunprotected,luaD_pcall
(2) 堆栈操纵:
luaD_reallocCI
luaD_reallocstack,luaD_growstack,luaD_checkstack,
incr_top,savestack,restorestack
(3) 函数调用:
luaD_callhook,luaD_precall,l ...
- 2013-12-04 09:15
- 浏览 443
- 评论(0)
一、概览
lvm.h/lvm.c的作用是提供底层的Lua虚拟机。
这个模块主要是用于循环读取并分解指令,
然后根据其操作码的枚举值进行处理或跳转到Lua的其它模块。
内部的函数引用图如下:
参考资料:
* A No-Frills Introduction to Lua 5.1 VM Instructions
http://luaforge.net/docman/83/98/ANoFrillsIntroToLua51VMInstructions.pdf
* 翻译Lua 5.1 VM Instructions(一)
http://blog.csdn.net/tm_wb/ ...
- 2013-12-04 09:14
- 浏览 368
- 评论(0)
一、概览
ltm.h/ltm.c的作用是提供查询元方法(元方法的值可能是函数,也可能是非函数的值)的API。
源码中把元方法称为标签方法(tag method)。
Lua的元方法有点像C++的运算符重载,用于覆盖一些Lua内部定义的默认行为。
参考链接:
1. LUA源码分析五:元表
http://lin-style.iteye.com/blog/1012138
2. Lua GC 的源码剖析 (2)
http://blog.codingnow.com/2011/03/lua_gc_2.html
查询元表的方式有两种:
* 方式一、查询某个元表(Table结构体)的元方法(见 ...
- 2013-12-04 09:14
- 浏览 426
- 评论(0)
一、概述
lundump.h和lundump.c是lua预编译二进制代码的加载器。
不同于llex/lparser/lcode串联起来对文本脚本的解析和编译,
lundump解析的是二进制脚本文件(由luac编译生成)。
它的公开接口luaU_undump和luaY_parser的声明原型是相同的,
所以可以把lundump看成是lparser的另一种实现。
另外,由于lundump解析的二进制文件的结构是嵌套而且动态变长的,
所以lundump大多时候是手工解码,而且依赖于ldump的写入格式。
二、头文件
#include "lobject.h"
...
- 2013-12-04 09:13
- 浏览 654
- 评论(0)
一、概述
lparser.h/lparser.c是Lua的语法分析器。
用于分析Lua脚本的语法以及把上下文信息传递给代码生成器,
完成文本代码到二进制代码的转换,以及语法检查。
在线版:
http://www.lua.org/source/5.1/lparser.h.html
http://www.lua.org/source/5.1/lparser.c.html
lparser内部主要函数的引用图如下:(只含部分)
在Lua参考手册(LRM)中描述了Lua的基本语法,见
http://www.lua.org/manual/5.1/manual.html#8
可以画出的 ...
- 2013-12-04 09:13
- 浏览 452
- 评论(0)
一、概述
lcode.h/lcode.c是Lua的代码生成器,
用于优化和生成目标二进制代码。
lcode.c的所有导出函数只被lparser.c引用。
lcode内部的函数引用图如下:
二、宏
1. #define NO_JUMP (-1)
2. #define getcode(fs,e)((fs)->f->code[(e)->u.s.info])
3. #define luaK_codeAsBx(fs,o,A,sBx)luaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx)
4. #define luaK_setmultret(f ...
- 2013-12-04 09:11
- 浏览 271
- 评论(0)
一、作用和参考资料
llex.c是Lua的词法分析器(把单个输入字符串切割为多个输出符号)
参考:
1. Lua 5.1.3源代码分析之词法分析 By 天地沙鸥
http://xenyinzen.wordpress.com/2009/12/09/lua-5-1-3%E6%BA%90%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8B%E8%AF%8D%E6%B3%95%E5%88%86%E6%9E%90/
二、包含头文件
1. llex.h
#include "lobject.h"
#include "lzi ...
- 2013-12-04 09:10
- 浏览 257
- 评论(0)