将代码绑定到 Lua

lua-users home
wiki

Lua 可以嵌入和扩展[1]其他语言编写的代码或应用程序。其他语言中的代码和值可以暴露给 Lua,反之亦然。以下列出了 Lua 与其他语言之间绑定的低级和高级解决方案。

Lua C API

与 Lua 绑定的最直接方法是使用 Lua C API。C API 由两部分组成:基本 API (lua.h) 提供了 C 和 Lua 之间所有交互的原始函数,而辅助库 (lauxlib.h) 提供了用于某些常见任务的更高级别的函数。[2]

启用 API 检查

默认情况下,Lua C API 几乎不进行对传递给它的参数的健全性检查。例如,传递不正确的堆栈索引会导致段错误或随机数据损坏。您应该始终在任何调试版本中启用 API 检查。您可以通过使用选项-DLUA_USE_APICHECK编译来实现。luaconf.h 使用此 C 宏来定义luai_apicheck 以在各种地方调用assert()(您也可以编辑此定义以执行可能更有用的操作)。

示例

可以通过检查 Lua 自身标准库的源代码 (src/*lib.c} 来找到使用 C API 的一些示例。例如,数学库 (math.*) 在文件src/lmathlib.c中实现。此文件的基本形式如下所示。首先,我们导入各种头文件,包括 C API (lua.h) 和辅助库 (lauxlib.h)

#define LUA_LIB
#include "lua.h"
#include "lauxlib.h"

然后定义了在 C 中实现的各种 Lua 函数。它们都具有相同的签名,并且参数通过 Lua 自身的堆栈传递。例如,sin 函数定义如下。luaL_check_number() 用于检查sin 函数参数的正确类型。lua_pushnumber() 用于返回计算出的正弦值。请注意,math_sin() 函数的返回值是返回的值的数量(lua 函数可以返回多个值)。

static int math_sin (lua_State *L) {
  lua_pushnumber(L, sin(luaL_checknumber(L, 1)));
  return 1;
}

这些函数通过构建一个函数指针和名称表,然后调用luaL_register() 来注册到 Lua 中。常量pihuge 是单独设置的。此注册代码放置在一个名为luaopen_math() 的函数中,该函数可以静态调用(例如,从 linit.c)或动态调用(通过 Lua 的共享库加载机制通过require)。

static const luaL_Reg mathlib[] = {
{"abs",   math_abs},
{"cos",   math_cos},
{"sin",   math_sin},
... etc...rest of table not included, but make sure you finish of with:
{NULL, NULL}
};

/*
** Open math library
*/
LUALIB_API int luaopen_math (lua_State *L) {
  luaL_register(L, LUA_MATHLIBNAME, mathlib);
  lua_pushnumber(L, PI);
  lua_setfield(L, -2, "pi");
  lua_pushnumber(L, HUGE_VAL);
  lua_setfield(L, -2, "huge");
  return 1;
}

将 C/C++ 与 Lua 绑定

C

C 外部函数接口 (FFI)

C 内联

C++

已经开发了各种 C++ 或 C++ 模板绑定来简化 C++ 中的过程

另请参阅

从 C/C++ 调用 Lua

这些框架和文章是单向绑定:从 C/C++ 调用 Lua 函数,传递参数并获取返回值。

在 C++ 中嵌入 Lua

这些框架比之前的框架更广泛:它们允许你的 C++ 程序与 Lua 解释器完全交互,但将扩展 Lua 的任务留给其他绑定系统(SWIG、tolua++ 等)。

自动绑定生成器

DLL 的代理包装器

动态链接库可以导出函数信息。 [FuBi] 描述了一种从脚本(或 RPC)调用这些函数的方法。 Lua 可以使用此功能 [6]

其他

其他语言

Ada

Bash Shell

luabash 工具是 bash shell 的一个动态加载模块,它在 bash shell 和 lua 脚本语言之间架起了一座桥梁。 这使得复杂的嵌入式代码段可以被高效的 lua 代码替换,并且可以提高 shell 脚本的速度,而无需大幅重写现有代码。

基础

COBOL

D

Erlang

Fortran

Go

Haskell

Java

LabVIEW

Objective-C

OCaml

Pascal

Perl

PHP

Python

R

Ruby

Tcl

Terra

[Terra] 是一种新的低级系统编程语言,旨在与 Lua 编程语言无缝互操作。

与 C 一样,Terra 是一种简单、静态类型、编译语言,具有手动内存管理。但与 C 不同的是,它从一开始就被设计为与 Lua 互操作。Terra 函数是使用 terra 关键字创建的一流 Lua 值。在需要时,它们会被 JIT 编译成机器代码。

您可以将 Terra 和 Lua 用作

具有高性能扩展的脚本语言。虽然 Lua 和其他动态语言的性能一直在提高,但低级抽象让您在需要时能够对性能进行可预测的控制。

软件 DSL 的 JIT 编译器。使用 Lua 元编程 Terra。允许您将用 Lua 编写的领域特定语言 (DSL) 编译成高性能 Terra 代码。将 Terra-Lua 程序嵌入其他软件作为库,允许您在现有软件中添加 JIT 编译器。

独立的低级语言。Terra 的设计使其能够独立于 Lua 运行。事实上,如果您的最终程序不需要 Lua,您可以将 Terra 代码保存到 .o 文件或可执行文件中。在这种情况下,Lua 充当强大的元编程语言。您可以将其视为 C++ 模板元编程的替代品,具有更好的语法和更友好的特性。

框架

CORBA

Windows COM

Windows .NET

Firefox

XML-RPC / SOAP

另请参见


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于2023年6月14日下午9:00 GMT (差异)