Lua编译与运行

lua会首先把代码编译成中间码然后执行,或许大家都有所困惑:它不是解释性语言吗?其实lua作为解释性语言的意义在于其能在运行过程中完成编译工作,正是dofile、loadfile、require这种函数的存在,lua才能顺理成章地称自己为“解释性语言”。

dofile/loadfile/require

我们可以通过dofile函数实现在代码中动态加载一个lua文件并执行它:

-- file 'lib1.lua' 
function norm (x, y) 
    local n2 = x^2 + y^2 
    return math.sqrt(n2) 
end 
function twice (x) 
    return 2*x 
end
> dofile("lib1.lua") -- load your library 
> n = norm(3.4, 1.0) 
> print(twice(n)) --> 7.0880180586677

而loadfile和dofile的不同点在于loadfile只是负责加载lua文件而非执行,dofile在loadflie之后执行了一次,而且如若加载失败则第一时间返回错误信息。因此可以这么定义dofile的代码:

function dofile (filename) 
    local f = assert(loadfile(filename)) 
    return f() 
end

loadstring和loadfile类似,只不过接收的是需要执行的字符串而非文件路径。

require和dofile功能类似,但是值得注意的是require有两点不同:

  • require搜索目录加载文件
  • require会判断是否文件此前已经被require过,用以避免重复加载同一文件

require搜索目录加载文件

require的路径是一个模式列表,每一个模式指明一种虚文件名到实文件名的一种方法,比如require "some",模式列表为:?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua ,则会从左至右依次搜寻文件直至存在:

some

some.lua 

c:\windows\some 

/usr/local/lua/some/some.lua​​​​​​​.

有一个进阶技巧则是设置模式列表的最后一项为默认lua文件,比如以上模式列表可以是:?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua;default.lua。这么设置的意义即在于未找到对应文件时可以加载默认的lua文件。

require判断是否重复加载

Lua自身保存了一个table用以筛查之前加载的文件名。注意这里保存的文件名为虚文件名,因此按照以上模式列表,如果require "some"且require "some.lua",则这个文件会同时加载两遍。

因此require的伪代码可以写作如下形式:

tbMode = {"?","?.lua","c:/windows/?","/usr/local/lua/?/?.lua"}
tbMap = {}
function requireMySelf(strPath)
    for i = 1,#tbMap do
        if strPath == tbMap[i] then
            return
        end
    end
    for i = 1,#tbMode do
        if loadfile(string.gsub(tbMode[i],"?","strPath")) then
            table.insert(tbMap,strPath)
            break
        end
    end
end

loadlib

标准C中进行动态库连接是很困难的一件事,但是lua可以通过loadlib的形式来实现动态库链接。通过传入动态链接库的绝对路径和初始化函数即可完成load,如若后续需要执行则需要显示调用以此这个变量即可:

local path = "/usr/local/lua/lib/libluasocket.so"
-- or path = "C:\\windows\\luasocket.dll" 
local f = assert(loadlib(path, "luaopen_socket")) 
f() -- actually open the library

相关推荐

  1. Lua编译运行

    2024-02-08 01:52:03       32 阅读
  2. lua 脚本按位运算

    2024-02-08 01:52:03       33 阅读
  3. weston 1: 编译运行傻瓜教程(补充)

    2024-02-08 01:52:03       32 阅读
  4. lua编译器介绍

    2024-02-08 01:52:03       12 阅读
  5. Lua-LuaC++的交互2

    2024-02-08 01:52:03       16 阅读
  6. Lua-LuaC的交互3

    2024-02-08 01:52:03       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-08 01:52:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-08 01:52:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-08 01:52:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-08 01:52:03       18 阅读

热门阅读

  1. 【算法题】92. 反转链表 II

    2024-02-08 01:52:03       27 阅读
  2. 分支解决冲突 & 分支管理策略 git merge命令详解

    2024-02-08 01:52:03       32 阅读
  3. 【Git】三棵“树”介绍

    2024-02-08 01:52:03       35 阅读
  4. (39)统计位数为偶数的数字

    2024-02-08 01:52:03       37 阅读
  5. work day7

    2024-02-08 01:52:03       28 阅读
  6. PyTorch自动微分模块torch.autograd的详细介绍

    2024-02-08 01:52:03       32 阅读
  7. 蓝桥杯-“山”形数字个数(python版)

    2024-02-08 01:52:03       34 阅读