1.Lua的安装与使用
(1)在Lua主页https://www.lua.org/download.html 下载源代码 https://www.lua.org/ftp/lua-5.4.8.tar.gz
(2)按照上述页面描述的步骤安装
kylin@kylin-gtj:/shujv/par$ tar xf lua-5.4.8.tar.gz
kylin@kylin-gtj:/shujv/par$ cd lua-5.4.8
kylin@kylin-gtj:/shujv/par/lua-5.4.8$ make all test
make[1]: Entering directory '/shujv/par/lua-5.4.8/src'
Guessing Linux
make[2]: Entering directory '/shujv/par/lua-5.4.8/src'
make all SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl"
make[3]: Entering directory '/shujv/par/lua-5.4.8/src'
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lapi.o lapi.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c lcode.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lctype.o lctype.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ldebug.o ldebug.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ldo.o ldo.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ldump.o ldump.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lfunc.o lfunc.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lgc.o lgc.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c llex.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lmem.o lmem.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lobject.o lobject.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lopcodes.o lopcodes.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c lparser.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lstate.o lstate.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lstring.o lstring.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ltable.o ltable.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ltm.o ltm.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lundump.o lundump.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lvm.o lvm.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lzio.o lzio.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lauxlib.o lauxlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lbaselib.o lbaselib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lcorolib.o lcorolib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ldblib.o ldblib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o liolib.o liolib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lmathlib.o lmathlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o loadlib.o loadlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o loslib.o loslib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lstrlib.o lstrlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o ltablib.o ltablib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lutf8lib.o lutf8lib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o linit.o linit.c
ar rcu liblua.a lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o
ar: `u' 修饰符被忽略,因为 `D' 为默认(参见 `U')
ranlib liblua.a
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o lua.o lua.c
gcc -std=gnu99 -o lua lua.o liblua.a -lm -Wl,-E -ldl
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_USE_LINUX -c -o luac.o luac.c
gcc -std=gnu99 -o luac luac.o liblua.a -lm -Wl,-E -ldl
make[3]: Leaving directory '/shujv/par/lua-5.4.8/src'
make[2]: Leaving directory '/shujv/par/lua-5.4.8/src'
make[1]: Leaving directory '/shujv/par/lua-5.4.8/src'
make[1]: Entering directory '/shujv/par/lua-5.4.8/src'
./lua -v
Lua 5.4.8 Copyright (C) 1994-2025 Lua.org, PUC-Rio
make[1]: Leaving directory '/shujv/par/lua-5.4.8/src'
(3)运行
编辑脚本test.lua
--[[ 函数返回两个值的最大值 --]]
function max(num1, num2)
if (num1 > num2) then
result = num1;
else
result = num2;
end
return result;
end
-- 调用函数
print("两值比较最大值为 ",max(10,4))
print("两值比较最大值为 ",max(5,6))
使用编译的lua二进制文件执行lua脚本
kylin@kylin-gtj:/shujv/par/lua-5.4.8$ cd src
kylin@kylin-gtj:/shujv/par/lua-5.4.8/src$ ./lua ../../test.lua
两值比较最大值为 10
两值比较最大值为 6
2.LuaJIT的安装与使用
在 LuaJIT主页 http://luajit.org/luajit.html通过点击 browsable mirror,
再进入luajit-2.0.git downloadable bundles页面,按其中描述的步骤安装
(1)下载bundle文件。 https://repo.or.cz/luajit-2.0.git/luajit-2.0-44d77d5f.bundle
(2)建立git目录,并从bundle文件提取。
root@66d4e20ec1d7:/par# git init luajit-2.0
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
Initialized empty Git repository in /par/luajit-2.0/.git/
root@66d4e20ec1d7:/par# cd luajit-2.0
root@66d4e20ec1d7:/par/luajit-2.0# git remote add origin ../luajit-2.0-44d77d5f.bundle
root@66d4e20ec1d7:/par/luajit-2.0# git fetc
git: 'fetc' is not a git command. See 'git --help'.
The most similar commands are
fetch
bisect
root@66d4e20ec1d7:/par/luajit-2.0# git fetch
Receiving objects: 100% (20667/20667), 4.30 MiB | 33.36 MiB/s, done.
Resolving deltas: 100% (17175/17175), done.
From ../luajit-2.0-44d77d5f.bundle
* [new branch] v2.1 -> origin/v2.1
* [new branch] v2.0 -> origin/v2.0
* [new branch] master -> origin/master
* [new tag] v2.0.0 -> v2.0.0
* [new tag] v2.0.0-beta1 -> v2.0.0-beta1
* [new tag] v2.0.0-beta10 -> v2.0.0-beta10
* [new tag] v2.0.0-beta11 -> v2.0.0-beta11
* [new tag] v2.0.0-beta2 -> v2.0.0-beta2
* [new tag] v2.0.0-beta2-hotfix2 -> v2.0.0-beta2-hotfix2
* [new tag] v2.0.0-beta3 -> v2.0.0-beta3
* [new tag] v2.0.0-beta4 -> v2.0.0-beta4
* [new tag] v2.0.0-beta5 -> v2.0.0-beta5
* [new tag] v2.0.0-beta6 -> v2.0.0-beta6
* [new tag] v2.0.0-beta7 -> v2.0.0-beta7
* [new tag] v2.0.0-beta8 -> v2.0.0-beta8
* [new tag] v2.0.0-beta8-fixed -> v2.0.0-beta8-fixed
* [new tag] v2.0.0-beta9 -> v2.0.0-beta9
* [new tag] v2.0.0-rc1 -> v2.0.0-rc1
* [new tag] v2.0.0-rc2 -> v2.0.0-rc2
* [new tag] v2.0.0-rc3 -> v2.0.0-rc3
* [new tag] v2.0.1 -> v2.0.1
* [new tag] v2.0.1-fixed -> v2.0.1-fixed
* [new tag] v2.0.2 -> v2.0.2
* [new tag] v2.0.3 -> v2.0.3
* [new tag] v2.0.4 -> v2.0.4
* [new tag] v2.0.5 -> v2.0.5
* [new tag] v2.0.ROLLING -> v2.0.ROLLING
* [new tag] v2.1.0-beta1 -> v2.1.0-beta1
* [new tag] v2.1.0-beta2 -> v2.1.0-beta2
* [new tag] v2.1.0-beta3 -> v2.1.0-beta3
* [new tag] v2.1.ROLLING -> v2.1.ROLLING
root@66d4e20ec1d7:/par/luajit-2.0# git remote set-url origin https://repo.or.cz/luajit-2.0.git
root@66d4e20ec1d7:/par/luajit-2.0# git fetch --prune origin
^C
root@66d4e20ec1d7:/par/luajit-2.0# git checkout v2.1
branch 'v2.1' set up to track 'origin/v2.1'.
Switched to a new branch 'v2.1'
(3)安装
按照http://luajit.org/install.html的步骤
root@66d4e20ec1d7:/par/luajit-2.0# make
==== Building LuaJIT 2.1 ====
make -C src
make[1]: Entering directory '/par/luajit-2.0/src'
HOSTCC host/minilua.o
HOSTLINK host/minilua
VERSION luajit.h
DYNASM host/buildvm_arch.h
HOSTCC host/buildvm.o
HOSTCC host/buildvm_asm.o
HOSTCC host/buildvm_peobj.o
HOSTCC host/buildvm_lib.o
HOSTCC host/buildvm_fold.o
HOSTLINK host/buildvm
BUILDVM lj_vm.S
ASM lj_vm.o
CC lj_assert.o
CC lj_gc.o
BUILDVM lj_ffdef.h
CC lj_err.o
CC lj_char.o
BUILDVM lj_bcdef.h
CC lj_bc.o
CC lj_obj.o
CC lj_buf.o
CC lj_str.o
CC lj_tab.o
CC lj_func.o
CC lj_udata.o
CC lj_meta.o
CC lj_debug.o
CC lj_prng.o
CC lj_state.o
CC lj_dispatch.o
CC lj_vmevent.o
CC lj_vmmath.o
CC lj_strscan.o
CC lj_strfmt.o
CC lj_strfmt_num.o
CC lj_serialize.o
CC lj_api.o
CC lj_profile.o
CC lj_lex.o
CC lj_parse.o
CC lj_bcread.o
CC lj_bcwrite.o
CC lj_load.o
CC lj_ir.o
CC lj_opt_mem.o
BUILDVM lj_folddef.h
CC lj_opt_fold.o
CC lj_opt_narrow.o
CC lj_opt_dce.o
CC lj_opt_loop.o
CC lj_opt_split.o
CC lj_opt_sink.o
CC lj_mcode.o
CC lj_snap.o
CC lj_record.o
CC lj_crecord.o
BUILDVM lj_recdef.h
CC lj_ffrecord.o
CC lj_asm.o
CC lj_trace.o
CC lj_gdbjit.o
CC lj_ctype.o
CC lj_cdata.o
CC lj_cconv.o
CC lj_ccall.o
CC lj_ccallback.o
CC lj_carith.o
CC lj_clib.o
CC lj_cparse.o
CC lj_lib.o
CC lj_alloc.o
CC lib_aux.o
BUILDVM lj_libdef.h
CC lib_base.o
CC lib_math.o
CC lib_bit.o
CC lib_string.o
CC lib_table.o
CC lib_io.o
CC lib_os.o
CC lib_package.o
CC lib_debug.o
CC lib_jit.o
CC lib_ffi.o
CC lib_buffer.o
CC lib_init.o
AR libluajit.a
CC luajit.o
BUILDVM jit/vmdef.lua
DYNLINK libluajit.so
LINK luajit
OK Successfully built LuaJIT
make[1]: Leaving directory '/par/luajit-2.0/src'
==== Successfully built LuaJIT 2.1 ====
(3)使用
按照http://luajit.org/running.html介绍的详细步骤,或者简单地测试
root@66d4e20ec1d7:/par/luajit-2.0# src/luajit ../test.lua
两值比较最大值为 10
两值比较最大值为 6
3.性能比较
用递归求斐波那契数列程序测试
lua
function fibonacci(n)
if n <= 1 then
return n
else
return fibonacci(n - 1) + fibonacci(n - 2)
end
end
print("fibonacci(40)",fibonacci(40))
测试结果
root@66d4e20ec1d7:/par/luajit-2.0# time src/luajit ../fib.lua
fibonacci(20) 6765
real 0m0.030s
user 0m0.000s
sys 0m0.000s
root@66d4e20ec1d7:/par/luajit-2.0# time src/luajit ../fib.lua
fibonacci(40) 102334155
real 0m2.170s
user 0m2.168s
sys 0m0.000s
root@66d4e20ec1d7:/par/luajit-2.0# time ../lua-5.4.8/src/lua ../fib.lua
fibonacci(20) 6765
real 0m0.031s
user 0m0.000s
sys 0m0.000s
root@66d4e20ec1d7:/par/luajit-2.0# time ../lua-5.4.8/src/lua ../fib.lua
fibonacci(40) 102334155
real 0m13.190s
user 0m13.184s
sys 0m0.000s
可见当n较大时,JIT的提升幅度很大。
如果不能用JIT,那么用尾递归也能达到很高效
lua
function fibonacci(n)
local function fib_helper(a, b, count)
if count == 0 then
return a
else
return fib_helper(b, a + b, count - 1)
end
end
return fib_helper(0, 1, n)
end
s=context
f= fibonacci(s)
print("fibonacci(",s,")",f)
return f