Ubuntu 16.04 安装 Lua
在 Linux 系统上使用以下命令编译安装 Lua:
curl -R -O http://www.lua.org/ftp/lua-5.3.3.tar.gz
tar zxf lua-5.3.3.tar.gz
cd lua-5.3.3
make linux test
安装 make编译过程如果提示以下信息则需要先安装 make:
# make linux test
The program 'make' can be found in the following packages:
* make
* make-guile
Try: apt install <selected package>
安装 make
# apt-get install make
安装 gcc编译过程提示以下信息则需要安装 gcc:
# make linux test
cd src && make linux
make[1]: Entering directory '/root/lua/lua-5.3.3/src'
make all SYSCFLAGS= ...
Lua特别之处笔记
<a href="/2015/02/02/gdb_tutorial/" rel="next" title="GDB基础教程">
<i class="fa fa-chevron-left"></i>
<p class="post-nav-pre-next-title">
GDB基础教程
</p>
</a>
</div>
<span class="post-nav-divider"></span>
<div class="post-nav-prev post-nav-item">
...
lua 5.4分代研究及luajit分代移植
lua垃圾回收发展历程
为什么不用引用计数?
引用计数有循环引用问题,会导致内存泄漏
应用计数嗯外开销大,赋值的时候会带来额外引用计数计算的开销。尤其是在内存比较稳定,没有新内存申请和释放的时候,你也需要承担这部分开销。
5.0及以前使用的是stop the world的标记清除法,会卡住所有操作,直到gc完成
5.1引入了分步gc,整个gc过程可以分为好几步,穿插在运行过程中
5.2引入了分代gc,属于实验性质,实际效果不好,在5.3的时候又移除了
5.4重新分代了分代gc,具体实现方式会在后面介绍
分代gc原理经验表明,大部分对象在被分配之后很快就被回收掉了,长时间存活的对象很大可能会一直存活下去。所以,垃圾回收可以集中精力去回收刚刚造出来的对象。将所有gc对象分成两种,young和old。当young节点活过了两次gc过程,就会变成old。old节点将不再被清除和遍历。活过两次gc过程也是与5.2 gc过程的最大不同点。5.2 gc只需要活过一次,就算做old。但是往往可能当前在某个函数执行过程中申请了临时变量触发了gc,这时候如果gc完成的话,当前函数堆栈上面申请的所 ...
Lua 排序算法
设有一组关键字{K1, K2,…, Kn};排序开始就认为 K1 是一个有序序列;让 K2 插入上述表长为 1 的有序序列,使之成为一个表长为 2 的有序序列;然后让 K3 插入上述表长为 2 的有序序列,使之成为一个表长为 3 的有序序列;依次类推,最后让 Kn 插入上述表长为 n-1 的有序序列,得一个表长为 n 的有序序列。
算法步骤
从第一个元素开始,该元素可以认为已经被排序
取出下一个元素,在已经排序的元素序列中从后向前扫描
如果该元素(已排序)大于新元素,将该元素移到下一位置
重复步骤 3,直到找到已排序的元素小于或者等于新元素的位置
将新元素插入到该位置后
重复步骤 2~5
动画演示
Lua 实现
local function insertionSort(arr)
for i = 2, #arr, 1 do
local tmp = arr[i]
local j = i - 1
while j >= 1 and tmp < arr[j] do
arr[j ...
Lua与C的交互
Lua与C的交互
Lua是一个嵌入式的语言,它不仅可以是一个独立运行的程序,也可以是一个用来嵌入其它应用的程序库。
C API是一个C代码与Lua进行交互的函数集,它由以下几部分构成:
1、 读写Lua全局变量的函数;
2、 调用Lua函数的函数;
3、 运行Lua代码片段的函数;
4、 注册C函数后可以在Lua中被调用的函数;
在C和LUA之间交互的关键在于一个虚拟栈(virtual stack),数据交互通过栈进行。操作数据时,首先将数据拷贝到栈上,然后获取数据,栈中的每个数据通过索引值进行定位,索引值为正时表示相对于栈底的偏移索引,索引值为负时表示相对于栈顶的偏移索引。索引值以1或 -1起始值,因此栈顶索引值永远为-1, 栈底索引值永远为1 。 “栈”相当于数据在Lua和C之间的中转地,每种数据都有相应的存取接口 。
另外,还可以使用栈来保存临时变量。栈的使用解决了C和LUA之间两个不协调的问题:
1、 Lua使用自动垃圾收集机制,而C要求显式的分配和释放内存;
2、 Lua使用动态数据类型,而C使用静态类型;
特别注意的是:
1、每当Lua调用C函数时,C函数会使用 ...
Evaluating
This paper proposed some evaluating guidelines from 5 aspects, including multiple runs, performance measurement, time out(running time for once), seed choices and target program. I’ll illustrate those guidelines below.
Multiple Runs因为大多数的Fuzzer都采用了随机变异算法,所以如果在evaluating阶段对特定的<种子,运行参数,时间,等等>只运行一次,那么这个结果是不能代表其真实情况的。论文中的figure-2展示了当使用AFL和AFLFast再所有运行环境相同的情况下运行多次时发现crashes数量。可以从图中看到运行多次后其最大值和最小值差距比较大。
但是如果运行多次之后就会有多个不同的运行结果,如何找出一个结果来代表这种运行环境下的一般性的运行结果呢?文中提到了permtation test和 bootstrap-based tes ...
Lua中的协程
Lua中的协程和其他变量一样,都是第一类值(first-class alue),可以被保存在变量中,可以被作为参数传递,可以被函数返回。
协程有4种状态:挂起(suspended),运行(running),死亡(dead)和正常(normal)。
Lua为协程提供了3个基础接口:create,resume和yield。
#coroutine.create
创建一个新的协程,并为它的运行分配一个独立的栈
协程处于挂起状态(suspended)
接受一个函数作为参数,这个函数就是协程的主程序块
返回这个协程
挂起点被设置为主程序块的第一句
#coroutine.resume
启动一个协程(第一次启动或从暂停状态启动)
自身(如果是协程的话)处于正常状态,被启动的协程处于运行状态
第一个参数为所要启动的协程
协程从它的挂起点开始执行
一直执行到被挂起或终止
导致协程终止的情况有两种:它的主程序块正常返回、运行过程中出错
执行结束后,控制权递交给此协程被激活的地方
#coroutine.yield
挂起一个协程
协程处于挂起状态 ...
深入 Lua Garbage Collector(二)
这一篇我们主要介绍一下 Lua 的 GC 机制
Lua垃圾回收器函数Lua 提供了以下函数 collectgarbage ([opt [, arg]]) 用来控制自动内存管理:
collectgarbage(“collect”): 做一次完整的垃圾收集循环。通过参数 opt 它提供了一组不同的功能:
collectgarbage(“count”): 以 K 字节数为单位返回 Lua 使用的总内存数。 这个值有小数部分,所以只需要乘上 1024 就能得到 Lua 使用的准确字节数(除非溢出)。
collectgarbage(“restart”): 重启垃圾收集器的自动运行。
collectgarbage(“setpause”): 将 arg 设为收集器的 间歇率 。 返回 间歇率 的前一个值。
collectgarbage(“setstepmul”): 返回 步进倍率 的前一个值。
collectgarbage(“step”): 单步运行垃圾收集器。 步长”大小”由 arg 控制。 传入 0 时,收集器步进(不可分割的)一步。 传入非 0 值, 收集器收集相当于 Lua 分 ...
Lua学习笔记三
Lua中可以用三种方式定义字符串:
单引号 ‘hello world’
双引号 “heool world”
[[ ]] [[hello world]]
字符串操作1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950print(string.upper("hello world")) --HELLO WORLD--string.lower(str)转小写print(string.lower("HELLO WORLD")) --hello world--[[string.gsub(mainStr,findStr,replaceStr,num)字符串替换,返回替换后的字符串和替换的次数 mainStr 整个需要被替换的字符串 findStr 要被替换的部分 replaceStr 新的字符串 要替换的数量,不填就是替换所有--]]print(string.gsub("aaaa"," ...
Lua入门笔记
<div class="post-gallery-row">
<a class="post-gallery-img fancybox" href="https://yunfwe.github.io//uploads/photos/1518315679054.jpg" rel="gallery_cjqdvcw1q0088t4e6vwb138q5" itemscope="" itemtype="http://schema.org/ImageObject" itemprop="url">
<img src="/uploads/photos/1518315679054.jpg" itemprop="contentUrl"/>
</a>
...