第一版是針對 Lua 5.0 編寫的。雖然在很大程度上仍然適用於後續版本,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買本書,您也能 贊助 Lua 專案。
![]() |
程式設計 in Lua | ![]() |
第四部分。C API 第 24 章。C API 概觀 |
Lua 是一種嵌入式語言。這表示 Lua 不是獨立套件,而是一個函式庫,可以與其他應用程式連結,以便將 Lua 設施納入這些應用程式。
您可能會想:如果 Lua 不是獨立程式,我們怎麼能在整本書中將 Lua 當作獨立程式使用?這個謎題的解答是 Lua 解譯器(可執行檔 lua
)。這個解譯器是一個微小的應用程式(程式碼少於五百行),它使用 Lua 函式庫來實作獨立解譯器。這個程式會處理與使用者的介面,取得使用者的檔案和字串,並將它們提供給 Lua 函式庫,由函式庫執行大部分工作(例如實際執行 Lua 程式碼)。
能夠作為函式庫來擴充應用程式,是讓 Lua 成為擴充語言的關鍵。同時,使用 Lua 的程式可以在 Lua 環境中註冊新函式;這些函式是以 C(或其他語言)實作的,可以新增無法直接用 Lua 編寫的設施。這讓 Lua 成為可擴充語言。
這兩種 Lua 觀點(作為擴充語言和可擴充語言)對應到 C 和 Lua 之間兩種互動方式。在第一種方式中,C 擁有控制權,而 Lua 是函式庫。這種互動方式中的 C 程式碼就是我們所說的應用程式程式碼。在第二種方式中,Lua 擁有控制權,而 C 是函式庫。在此,C 程式碼稱為函式庫程式碼。應用程式程式碼和函式庫程式碼都使用相同的 API 與 Lua 進行通訊,也就是所謂的 C API。
C API 是讓 C 程式碼與 Lua 互動的一組函式。它包含用於讀取和寫入 Lua 全域變數、呼叫 Lua 函式、執行 Lua 程式碼片段、註冊 C 函式以便 Lua 程式碼稍後可以呼叫它們等等的函式。(在本文中,「函式」一詞實際上表示「函式或巨集」。API 將多項設施實作為巨集。)
C API 遵循 C 的操作模式,這與 Lua 非常不同。在 C 中進行編程時,我們必須注意類型檢查(和類型錯誤)、錯誤復原、記憶體配置錯誤,以及其他幾個複雜性來源。API 中的大部分函式都不會檢查其引數的正確性;在呼叫函式之前,確認引數有效是你的責任。如果你犯了錯誤,你可能會收到「分段錯誤」或類似錯誤,而不是一個行為良好的錯誤訊息。此外,API 強調靈活性與簡潔性,有時會以易用性為代價。常見的任務可能涉及多個 API 呼叫。這可能會很無聊,但它讓你完全控制所有細節,例如錯誤處理、緩衝區大小等。
正如其標題所述,本章的目標是概述從 C 使用 Lua 時所涉及的內容。現在不要費心了解正在發生的所有細節。稍後我們將填寫細節。不過,請不要忘記你可以在 Lua 參考手冊中找到有關特定函式的更多詳細資訊。此外,你可以在 Lua 發行版本身中找到 API 使用的幾個範例。Lua 獨立直譯器 (lua.c
) 提供了應用程式程式碼的範例,而標準函式庫 (lmathlib.c
、lstrlib.c
等) 則提供了函式庫程式碼的範例。
從現在開始,我們戴上了 C 程式設計師的帽子。當我們談論「你」時,我們指的是你在 C 中編程時,或你被你編寫的 C 程式碼所假扮。
Lua 和 C 之間溝通的主要組成部分是一個無處不在的虛擬堆疊。幾乎所有 API 呼叫都對此堆疊上的值進行操作。所有從 Lua 到 C 和從 C 到 Lua 的資料交換都透過此堆疊進行。此外,你也可以使用堆疊來保留中間結果。堆疊有助於解決 Lua 和 C 之間的兩個阻抗失配:第一個是由於 Lua 是垃圾回收的,而 C 需要明確的解除配置;第二個是由於 Lua 中的動態類型與 C 的靜態類型之間的衝突。我們將在第 24.2 節中更詳細地討論堆疊。
版權所有 © 2003–2004 Roberto Ierusalimschy。保留所有權利。 | ![]() |