首页 Lua教程 当前文章

【新手入门】LUA简介:短小精悍的嵌入式脚本语言

xLeaves(xxrpa) 发布于 2023年06月26日 10:41:22


LUA 是一种轻量级的开源脚本语言,使用 C 语言开发而成:官方网站


LUA非常的轻量级,它自身只包含极为有限的功能(甚至称之为几乎什么功能都没有也不过分),这些功能包括基础的数学运算、字符串处理、IO操作、系统操作(比如运行一个程序)。

但可以非常容易的集成到各种宿主程序中,化身为宿主程序的一部分,为宿主程序提供脚本语言扩展。

这也是 LUA 最初的设计目标,因此 LUA 非常广泛的存在于各种软件、游戏中,为这些软件和游戏提供扩展、MOD开发等能力,例如魔兽世界、僵尸毁灭工程等数量众多的游戏,都支持使用 LUA 设计地图和扩展模组。

轻量级并不是纯粹的缺点,和 C 语言类似,由于 LUA 的小巧低依赖,它可以运行在非常广泛的硬件平台下。

上至 Windows、Linux、MacOS 工作站,下至各种手机、平板、智能设备中都可以找到 LUA 的身影。

甚至在资源非常有限的嵌入式操作系统中,也可以看到它流畅的运行于 160MHZ 的单核处理器上:Luatos


LUA 也是相当易于扩展的,你可以在自己的程序里非常轻松的集成 LUA,然后调用它运行一段代码;

也可以将自己程序里的函数注册到 LUA 环境中,然后通过 LUA 脚本调用这些函数;

当然,你也可以主动调用一个 LUA 的函数,可以一次压入参数,或者直接call一个 LUA 语句,也可以主动读写 LUA 的变量;

或者,实现一个带有标准导出的 DLL,作为 LUA 的扩展插件导入到 LUA 运行环境中,这种做法的跨平台能力很差,区分32、64位程序,也区分系统(例如 Linux 下扩展插件是 so 后缀的)和硬件平台。

但在特定环境下,一些扩展插件确实很有用,可以大幅提升 LUA 的开发能力,这个网站搜集了很多 LUA 扩展插件:luaforge

LUA 本身也提供了一套加载机制(以及闭包),可以使用这套机制加载单纯依赖 LUA 代码实现的扩展插件。


LUA 具有非常出色的执行效率,当然,它毕竟只是脚本语言,无论如何都不可能和编译型语言在性能上相抗衡;和 JIT 类的脚本语言相比,性能也会有所差距。

但是 LUA 也有一个 LuaJIT 项目,将 LUA 代码运行时编译为本机机器指令执行,从而大大提升运行效率:LuaJIT

而在不使用 JIT 的时候,LUA 的性能比绝大多数脚本语言都要更好。


LUA 非常灵活,它具备原生的 table 数据类型,可以很容易的组织任意形态的结构化数据。

LUA 非常擅长处理数据,这是 C 语言等编译型语言不具备的优势,因此很多时候,C 语言会通过内嵌 LUA 来提升这方面的能力。

LUA 的 table 还具备一定的元编程能力(在运行阶段实现一些编译阶段才能实现的功能),让 LUA 在处理运行前未知的数据时,也具备相当强的灵活性。

例如 LUA 可以用很少的代码,实现动态 API 调用,这段代码依赖一些宿主实现(loadlib、getproc、call):

function import(dll)
	s_class = {}
	s_class.__index = function(ct, func)
		if ct.xywh_Dll_CTable[func] == nil then
			local address = getproc(ct.xywh_Dll_Handle, func)
			if address ~= 0 then
				ct.xywh_Dll_CTable[func] = address
			else
				address = getproc(ct.xywh_Dll_Handle, func .. "A")
				if address ~= 0 then
					ct.xywh_Dll_CTable[func] = address
				end
			end
			assert(ct.xywh_Dll_CTable[func], "error : 找不到导出函数!")
		end
		return function(...)
			return call(ct.xywh_Dll_CTable[func], ...)
		end
	end
	setmetatable(s_class, s_class)
	s_class.xywh_Dll_Handle = loadlib(dll)
	s_class.xywh_Dll_CTable = {}
	assert(s_class.xywh_Dll_Handle, "error : 动态链接库加载失败!")
	return s_class
end

user = import("user.dll")

print(user.MessageBox(0, "text", "title", 0))


LUA 也具备一个可以使用(但不那么好用)的官方解释器,可以单行运行代码,通常我不建议大家按照传统教程使用这个解释器运行 LUA 代码,而是使用自己开发的解释器。

因为官方解释器只有非常有限的功能,而 LUA 的灵魂通常是开发一些带有宿主能力的程序,这时候官方的解释器就毫无用处了。

下一篇教程,我会介绍大家怎样编译 LUA,怎样用官方解释器运行 Hello World


若无特殊声明,上述内容为本站原创,未经授权禁止转载!