另外,Lua 也是一個可擴展的語言 (extensible language),可在 Lua 環境下用其它語言 (例如 C) 來擴展 Lua 所沒有的新功能。
就 Lua 的擴展語言及可擴展語言兩個角色,皆可使用 C 語言。Lua 可作為 C 語言的擴展語言,C 實作為應用程式,使用 liblua 提供 Lua 環境來擴充 Lua 語言功能。反過來,C 也可以擴展 Lua 語言,提供 Lua 沒有的功能。這兩者使用相同的 API 跟 Lua 溝通,稱為 C API,包括一些函數:讀寫 Lua 全域變數,呼叫 Lua 函數,運行 Lua 程式碼,登記 C 函數好讓能被 Lua 呼叫,等等。
跟 Lua 是完全不同的是,C API 延續 C 嚴謹的特性。在寫 C 語言程式時,必須注意類型 (type) 檢查,錯誤處理,memory-allocation 錯誤等。大多數 API 中的函數不檢查參數的正確性,在呼叫函數之前,必須確保參數是對的。否則,可能出現「segmentation fault」或類似的激烈結果,而不是委婉的告訴你錯誤訊息。此外,API 強調靈活性和簡易性,而不是易用,常見的工作可能要呼叫好幾個 API 函數,但讓你完全控制所有細節,比如錯誤處理,緩衝區大小等等。
Lua 和 C 之間通信中的重要組成部分是虛擬堆疊。幾乎所有的 API 都對這個堆疊裡的值操作。所有從 Lua 到 C 及從 C 到 Lua 的資料交換都是經過這個堆疊。此外,可以使用堆疊來存放中間結果。堆疊有助於解決 Lua 和 C 之間的兩個不匹配:一是 Lua 使用垃圾收集 (garbage collection),而 C 需要明確的釋出記憶體;二是來自 Lua 使用動態類型 (dynamic typing),而 C 使用靜態類型 (static typing)。
正如標題所說,本章是一個概述,不用急著去理解所提到的所有細節。稍後會補上那些細節。然而,不要忘了,可以在 Lua 參考手冊找到特定功能的更多細節。此外,可以在 Lua 的分佈 (distribution) 本身找到幾個使用 API 例子。獨立的 Lua 直譯器 (lua.c) 提供應用程式的例子,而標準庫 (lmathlib.c,lstrlib.c 等) 提供 Lua 的函式庫的例子。
參考:
- 本文翻譯 Programming in Lua, 1st ed. 的 §24 – An Overview of the C API,並加以修改整理。
- 本站 Lua 相關文章
沒有留言:
張貼留言