Lua C API 研究 —— 基础篇

Lua C API 研究 —— 基础篇


Lua 提供了和 C 交互的 API,可以在 C 中执行 Lua 代码,也可以在 Lua 中执行 C 代码。两者都通过 Lua C API 实现。本文基于 Lua 5.1,参考 http://www.lua.org/pil/24.html

头文件

在 C/C++ 中使用 Lua C API,需要引入 Lua 的头文件:

  • lua.h

    lua.h 包含了 Lua 的基础函数,这些函数以 lua_ 开头

  • lauxlib.h

    lauxlib.h 包含了 Lua 的辅助函数(称为 auxiliary library 或 auxlib),这些函数以 luaL_ 开头

  • lualib.h

    lualib.h 包含了 Lua 打开内置库的函数,如

    • luaopen_base(L); /* opens the basic library */
    • luaopen_table(L); /* opens the table library */
    • luaopen_io(L); /* opens the I/O library */
    • luaopen_string(L); /* opens the string lib. */
    • luaopen_math(L); /* opens the math lib. */

    在 Lua 5.1 中,可以直接使用 luaL_openlibs 来打开所有库函数,也可以根据需要,只打开需要使用的库

在 C++ 中使用 Lua C API,引用 Lua 头文件时,需要使用 extern “C”:

extern "C" {
#include <lua.h>
}

Lua 栈

Lua 与 C 通过 Lua 栈(lua_State *L)来进行参数传递,Lua 与 C 的互调,就是通过 Lua C API 对 Lua 栈进行操作

在 Lua 代码中,严格遵守 LIFO 的原则,只能操作 Lua 栈的栈顶。在 C 代码中,则可以操作栈中任意元素,甚至可以在栈的任意位置删除和插入元素

在 Lua 栈中可以存放各种类型的变量,如 number,string,可以存放函数,线程等

如果栈中有 4 个元素,如果以正数来表示,栈顶索引为 4,栈底索引为 1;如果以负数来表示,栈顶索引为 -1,栈底索引为 -4。索引 0 为保留槽,不要去对其进行操作

Lua 栈操作很多,后面会单开一篇进行探讨,这里不再进行详述

C 调用 Lua

应用场景

在 C 中调用 Lua,可以实现在用户的 C 程序中集成一个 Lua 解释器,用于执行 Lua 脚本。这样可以实现系统和业务分离,系统层提供底层能力的支持,业务层使用 Lua 进行编写,可以大大提高业务层的开发效率。另外 C 调用 Lua 时提供了保护执行机制,即使 Lua 代码写得有问题,只会影响当前正在执行的 Lua 实例,不会导致整个系统崩溃

目前比较流行的 Redis 和 Nginx Openresty 中都使用了类似的技术:

  • 如 Redis 中加载 Lua 脚本,通过 EVAL 命令可以在 Redis 服务端执行一段 Lua 脚本,以实现类似于存储过程的功能。
  • 在 Nginx Openresty 中,可以将 Lua 脚本加载于 Nginx 的配置中,当外部访问指定 URI 时,Nginx 可以执行相应的 Lua 脚本,实现一些复杂的逻辑,如数据库操作,Redis 操作,甚至向外发送 HTTP 请求等

基本流程

C 调用 Lua 基本流程为:

  1. 引入 Lua 头文件
  2. 创建 Lua 栈
  3. 打开需要使用的 Lua 库
  4. 加载 Lua 代码
  5. 执行 Lua 代码
  6. 获取 Lua 代码执行结果
  7. 关闭 Lua 栈
引入 Lua 头文件

Lua 的头文件为 lua.h,lauxlib.h 和 lualib.h。每个文件包含的内容前面已经介绍过,这里就不再赘述

<
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值