将代码绑定到 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()(您也可以编辑此定义以执行可能更有用的操作)。

Example

使用 C API 的一些示例可以在检查 Lua 标准库自身的源代码(src/*lib.c)时找到。例如,数学库(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 脚本的速度。

Basic

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++ 模板元编程的替代品,具有更好的语法和更nice的属性。

框架

CORBA

Windows COM

Windows .NET

Firefox

XML-RPC / SOAP

另请参阅


RecentChanges · preferences
编辑 · 历史
最后编辑于 2023 年 6 月 14 日下午 3:00 GMT (差异)