Lua与LuaJIT的安装与使用

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
相关推荐
小O的算法实验室2 天前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
郭涤生2 天前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿2 天前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz2 天前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能2 天前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****2 天前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能2 天前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能2 天前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数
CoderCodingNo2 天前
【GESP】C++四、五级练习题 luogu-P1177 【模板】排序
数据结构·c++·算法
Proxy_ZZ02 天前
从零实现LDPC比特翻转译码器:C语言实战与底层逻辑解析
c语言·算法