將程式碼連結至 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 函式,傳入引數並取得回傳值。

將 Lua 嵌入至 C++

這些架構比先前的架構稍微廣泛一點:它們允許您的 C++ 程式與 Lua 直譯器充分互動,但將擴充 Lua 到其他連結系統 (SWIG、tolua++ 等) 的任務留給它們。

自動連結產生器

DLL 的代理程式封裝器

可從動態連結函式庫匯出函數資訊。 [FuBi] 說明了一個從腳本 (或 RPC) 呼叫這些函數的方法。這個功能可從 Lua [6] 使用。

雜項

其他語言

Ada

Bash 外殼

luabash 工具是可動態載入的 bash 外殼模組,可在 bash 外殼和 lua 腳本語言之間提供橋樑。這能使複雜的嵌入式程式碼片段替換成高效的 lua 程式碼,並提升外殼腳本的速度,無需大費周章重寫現有程式碼。

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++範本元程式編寫的替代方案,具有更好的語法和更友善的屬性。

架構

CORBA

Windows COM

Windows .NET

Firefox

XML-RPC / SOAP

另請參閱


RecentChanges · 偏好設定
編輯 · 記錄
上次編輯於 2023 年 6 月 14 日,格林威治標準時間晚間 9:00 (diff)