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
相关推荐
这料鬼有毒13 小时前
二刷hot100-1143.最长公共子序列
算法·leetcode·动态规划
清风~徐~来14 小时前
【软件测试】allure 测试报告模块
单元测试
政企项目老覃14 小时前
边缘 AI 推理部署:安防零售场景下的模型裁剪与端侧落地实践
人工智能·程序人生·算法·性能优化·vllm
GreenTea16 小时前
发布 3 天登顶 HN:不生成一个字的模型 Jev,我把它的源码和黑料都扒了一遍
前端·后端·算法
庖丁解牛16 小时前
无穷小不是一个“神秘小数”,而是一场奔向 0 的过程
算法
ZPC821017 小时前
YOLO26 识别串番茄果梗
人工智能·深度学习·算法·机器学习
景熙552317 小时前
14.Java 集合框架从入门到源码万字详解(含 ArrayList/LinkedList/HashMap 源码、泛型通配符、红黑树)
java·开发语言·数据结构·算法
aaaameliaaa17 小时前
结构体 结构体
c语言·笔记·算法
有Li18 小时前
【AI答疑】MR数据预处理步骤
人工智能·笔记·算法·语言模型·医学生
盛世宏博北京19 小时前
多传感器数据融合算法:实现档案库房温湿度全域无死角监测
算法·档案温湿度