欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Lua学习点滴记录 LuaLuaJIT 

程序员文章站 2022-07-16 13:04:42
...
1、Lua官网
http://www.lua.org/manual/5.3/manual.html

2、Lua与Java的比较
Lua学习点滴记录
            
    
    
        LuaLuaJIT 

3、Lua与LuaJIT比对
http://luajit.org/performance_x86.html

4、Lua语法实战
【syntax】
0> 在 Lua 中,一共只有 9 种数据类型,分别为 nil 、boolean 、lightuserdata 、number 、string 、 table 、 function 、 userdata 和 thread。
  =>其中,只有 string table function thread 四种在 vm 中以引用方式共享,是需要被 GC 管理回收的对象。其它类型都以值形式存在。
0> lua中 nil和false返回值都是假。
1> 【..】表示连接字符串
=>不能连接nil值,attempt to concatenate local 'http_uri_arg_value' (a nil value)=>error
2> lua函数可以返回多个变量
3> 【local】标识局部变量
4> 通过nginx变量取uri,但获取不到参数,如下:
-- 请求中的当前URI(不带请求参数,参数位于$args)
local uri = ngx.var.uri
5> 获取uri中的指定参数
local user = ngx.var.arg_user -- 定义user变量并获取url中的参数 http://localhost?user=hello
6> 跳转
return responses.send(status_code, message)
7> ngx.print vs ngx.say => say会多输出一空行
8> false和nil为假, true和 not nil为真, 0 也为真!
9> lua标识空采用nil
10> elseif,区别于 else if;
11> and & or,不支持问号表达式;lua中0表示true;
12> no continue,lua 中不支持 continue 语法;需要用 if 和 else 语句实现;
13> . & :,lua 中 object.method 和 object:method 行为不同,object:method 为语法糖,会扩展成第一个参数为 self
14> forgot return _M,在编写模块的时候如果最后忘记 return _M, 调用时会提示尝试对 string 调用方法的异常
15> 事实上,一个lua_State也是一个类型为 thread 的 GCObject 。
16> mainthread 一定是 GCObject 链表上的最后一个节点(除 Udata 外),这是因为挂接过程都是向链表头添加的。
17> 一个完整的 lua 虚拟机在运行时,可有多个lua_State,即多个 thread 。它们会共享一些数据。这些数据放在global_State *l_G域中。其中自然也包括所有 GCobject 的链表。
18> 线程(thread)作为Lua中一种基本的数据类型,它代表独立的执行线程(independent threads of execution),
   线程类型是实现协程(coroutines)的基础,注意这里的线程类型不要与操作系统线程混淆,Lua的线程类型是Lua虚拟机实现一种数据类型。
19> Lua线程状态
//////////begin////////
44 /* thread status */
45 #define LUA_OK      0
46 #define LUA_YIELD   1
47 #define LUA_ERRRUN  2
48 #define LUA_ERRSYNTAX   3
49 #define LUA_ERRMEM  4
50 #define LUA_ERRGCMM 5
51 #define LUA_ERRERR  6
///////////end//////////
20> 在调用lua_newstate     初始化Lua虚拟机时,会创建一个全局状态和一个线程(或称为调用栈),这个全局状态在整个虚拟机中是唯一的,供其他线程共享。
    一个Lua虚拟机中可以包括多个线程,这些线程共享一个全局状态,线程之间也可以调用lua_xmove函数来交换数据。
21> luaV_execute 是Lua VM 执行一段字节码的入口。Lua VM 就是一个状态机,从当前调用栈上次运行点开始解释字节码指令,
    直到下一个 C 边界跳出点(可以是函数执行完毕,也可以是一次协程 yield 操作)
22> 所有的指令都会操作寄存器 A ,从 Lua VM 的角度看,寄存器就是数据栈上的变量,所以可以将寄存器 A 所指变量预先取出放到局部变量ra 中。
    ra = RA(i)。某些指令操作在 vm 运行过程中会改变数据栈的大小(伸缩),而 ra 是一个指向数据栈的指针,而不是一个索引。这种情况下,一旦数据栈发生变化,就需要重新获取ra的值。
23> ngx_lua模块的原理:
=>1、每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM;
=>2、将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问;
=>3、每个外部请求都由一个Lua协程处理,协程之间数据隔离;
=>4、Lua代码调用I/O操作等异步接口时,会挂起当前协程(并保护上下文数据),而不阻塞worker;
=>5、I/O等异步操作完成时还原相关协程上下文数据,并继续运行;

24> Table
=>table 库是由一些辅助函数构成的,这些函数将 table 作为数组来操作
=>在初始化一个数组的时候,若不显式地用键值对方式赋值,则会默认用数字作为下标,从 1 开始。
  由于在 Lua 内部实际采用哈希表和数组分别保存键值对、普通值,所以不推荐混合使用这两种赋值方式。
=>任何一个nil值都有可能被当成数组的结束,这也就说明对于有“空洞”的情况,table 的长度存在一定的不可确定性。
=>不要在 Lua 的 table 中使用 nil 值,如果一个元素要删除,直接 remove,不要用 nil 去代替。
=>table.maxn (table),该函数的开销相比 # 运算符也会更大一些。
=>问题:用哈希表存储键值对时,可以取到key的顺序位置?比如第1个参数,第2个参数,……
=>获取url参数 ngx.var.arg_xx与ngx.req.get_uri_args["xx"]两者都是为了获取请求uri中的参数
///////begin//////
local strider = ngx.var.arg_strider
local strider = ngx.req.get_uri_args["strider"]
////////////end///////////
=>URI 内容传递过程中是需要调用 ngx.encode_args 进行规则转义

26> String
=>使用 string.byte 来进行字符串相关的扫描和分析是最为高效的
=>应当总是使用 # 运算符来获取 Lua 字符串的长度
=>对于 LuaJIT 这里有个性能优化点,对于 string.find 方法,当只有字符串查找匹配时,是可以被 JIT 编译器优化的
=>print(find("abc cba", "(%a+)", 1, true))
>>>>string.reverse (s)
>>>>string.find(s, p [, init [, plain]])=>find("abc cba", "(%a+)", 1, true) =>第4个参数默认是false,建议仅匹配字符串,设置为true
=>string.find (s, pattern [, init [, plain]]) =>_, q=string.find("haha", 'ah')=>通过虚拟变量替代不需要的返回值
=>strig.sub(a,1,3) In particular, the call string.sub(s,1,j) returns a prefix of s with length j, and string.sub(s, -i) (for a positive i) returns a suffix of s with length i

27> 判断字符串长度
//////////begin/////////
if conf.whitelist and #conf.whitelist > 0 then
    block = not iputils.binip_in_cidrs(binary_remote_addr, cidr_cache(conf.whitelist))
  end
/////////end///////////

28> 特殊字符【_】标识虚变量dummy variable,
=> 虚变量不仅仅可以被用在返回值,还可以用在迭代等
=> 当有多个返回值需要忽略时,可以重复使用同一个虚变量
for example:用于ipairs
////////////begin/////////
for _, location in ipairs {"body", "headers", "querystring"} do
   plugin.config[action][location] = plugin.config[action][location] or {}
end
/////////end///////////
  • Lua学习点滴记录
            
    
    
        LuaLuaJIT 
  • 大小: 86.6 KB
相关标签: Lua LuaJIT