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
相关推荐
8Qi85 小时前
LeetCode 75:颜色分类(荷兰国旗问题)—— Java 题解 ✅
java·算法·leetcode·指针·排序
888CC++6 小时前
如何在 C 语言中进行程序调试?
前端·javascript·算法
(●—●)橘子……8 小时前
力扣第503场周赛练习理解
python·学习·算法·leetcode·职场和发展·周赛
明志数科10 小时前
4D时序标注技术详解:让机器人理解连续动作的数据基础
java·算法·机器人
KaMeidebaby10 小时前
卡梅德生物技术快报|原核表达系统工艺优化:包涵体重折叠 + 分子筛纯化实现功能 RBD 高效制备,附全参数配置
前端·人工智能·算法·数据挖掘·数据分析
无限码力10 小时前
携程0510笔试真题【单数组交换】
算法·携程笔试·携程笔试真题·携程0510笔试真题
BlockWay11 小时前
WEEX Labs 周度观察:微软-OpenAI 合作调整与AI 多云趋势
大数据·人工智能·算法·安全·microsoft
风筝在晴天搁浅11 小时前
快手 CodeTop LeetCode 224.基本计算器
数据结构·算法·leetcode
Smoothcloud润云11 小时前
5大功能精修,重构AI算力使用体验!
java·人工智能·windows·算法·重构·编辑器·sublime text