跳至內容

Lua

出自Taiwan Tongues 台語維基
這是此頁批准,以及是最近的修訂。

Lua(發音:/ ˈluːə /,葡萄牙語「月娘」)是一个簡潔、輕量、會當延伸的手稿語言。Lua 有著相對較簡單的 C API 顛倒有誠容易1980入去應用。足濟應用程式使用 Lua 成做家己的躉入式的手稿語言,以此來實現會組態性、會當延伸性。

歷史

Lua 是佇一九九三年由羅伯托 ・ 呢魯薩林斯希望、Luiz Henrique de Figueiredo 和 Waldemar Celes 建立的,𪜶彼陣是巴西的里約熱內盧天主教大學的電腦圖形技術組(Tecgraf)成員。Lua 先驅是資料描述 / 組態語言「SOL」(簡單的物件語言)和「DEL」(資料錄入語言)。 𪜶佇一九九二年–一九九三年佇咧 Tecgraf 獨立開發矣需要增加靈活性的兩个無仝專案(攏是用佇咧工程應用的互動式圖形程式)。 佇咧 SOL 和 DEL 中欠缺真濟控制流結構,需要共𪜶增加完全的編程能力。

佇咧《The Evolution of Lua》中,這門語言的作者寫講:

> 佇一九九三年,唯一真正的競爭者是 Tcl,伊已經明確的設計用佇1875入去到應用。猶毋過,Tcl 攏無熟似的語法,無對資料描述提供良好的支援,並且講干焦佇咧 Unix 平台上執行。阮無考慮 LISP 抑是 Scheme,因為𪜶有著無友好的語法。Python 猶處佇咧幼年期。佇咧 Tecgraf 的自由的自力更生氛圍落來,阮非常自然的試驗開發家己的手稿語言 . . . 因為這門語言的足濟的潛在使用者毋是專業的編程者,語言應當避免神秘的語法佮語意。新語言的實現應該是懸度會當徙栽,因為乎 Tecgraf 的客戶有非常濟項的各種電腦平台。最後咧,因為阮預期 Tecgraf 的其他的產品嘛需要1875入手稿的語言,新語言應當追隨 SOL 的例並提供做帶有 C API 的庫。 > >

Lua 主要受著後列前輩語言的影響:

  • Modula 鋪二:對中引入大部份的控制結構語法,` if `、` while `、` repeat ` / ` until `。
  • CLU:多賦值佮對函式呼叫的多個回值,這是對參照參數抑是顯式指標的閣較簡單的替代。
  • C + +:「 允准局部變數只有佇需要的所在聲明的巧去想法」。
  • SNOBOL 和 AWK:關聯陣列。
  • LISP 和 Scheme:咧發表著《Dr . Dobb's Journal》的文章當中,Lua 的創立者閣聲稱,有著單一而且無所不在的資料結構機制(列表)的 LISP 和 Scheme,著𪜶決定共表格開發做 Lua 的主要資料結構起到矣主要影響。Lua 的語意真久來日子轉受著 Scheme 的影響,特別是介入了匿名函式佮完全的詞法作用域。

Lua 佇版本五配零進前佇類似 BSD 授權條款之下發行。自從版本五鋪零以來,Lua 採用矣 MIT 授權條款。

特性

Lua 是一種輕量語言,伊的官方版本干焦包括一个精簡的核心佮上基本的庫。這會使 Lua 體積細、啟動速度緊。伊用 ANSI C 語言編寫,並且以原始碼的形式開放,編譯了後的完整參考直譯器干焦大約兩百四十七 kB,到五孵四 . 三版本,該體積變做兩百八十三 kB(Linux , amd 六十四), 猶閣有夠束結的,會當誠方便的嵌入去別的程式內底。佮真濟「大而全」的語言無仝款,網路通訊、圖形介面等攏無預設提供。猶毋過 Lua 會用得真容易地予人擴充:由宿主語言(通常是 C 抑是 C + +)提供這寡功能,Lua 會使使用𪜶,就親像講本來就內建的功能仝款。事實上,這馬已經有真濟成熟的擴充模組會當供選用。

Lua 是一个動態型別語言,支援增量式糞埽收集策略。有內起的,佮作業系統無關係的協同運作式加執行緒支援。Lua 原生支援的資料類型真少,干焦提供數值(預設是雙精度浮點數,可組態)、 布林量、字捾、格仔、函式、執行緒佮使用者自訂資料這幾種。但是其處理表佮字串的效率非常之懸,加上元表的支援,開發者會當高效的類比出需要的複雜資料類型(譬如講集合、陣列等等)。

語法佮語意

Lua 是一種多重程式的設計範式的程式的設計語言:伊干焦提供足細的一个特性集合來滿足無仝程式設計範式的需要,毋是為著某一種特定的程式設計範式提供繁雜的特性支援。比如講,Lua 並無提供繼承這个特性,但是你會當用元格來共類比。諸如號名空間、類這概念攏無咧語言基本性中實現,但是咱會當用表格結構(Lua 唯一提供的複雜資料結構)是較簡單。正正是提供了遮的基本的元特性,咱會當任意的對語言來進行咱家己的改造。

Lua 實現了少量的進階特徵比如頭等函式、糞埽回收、閉包、當場尾呼叫、強制(佇執行時間佇字串佮數值之間自動轉換)、 協程(協同運作多工)佮動態模組裝載。

詞法

經典的 Hello World ! 程式會當寫為下:

抑無就是按怎:

佇咧 Lua 中注釋會當佇雙連字元並列到這途的結束,類似 Ada、Eiffel、Haskell、SQL 和 VHDL。加行字串共注釋用雙方括號來妝娗。

下例中實現一个階乘函式:

控制流

Lua 有四種類型的迴箍:` while ` 迴箍,` repeat ` 迴箍(類似 ` do while ` 迴箍), 數值 ` for ` 迴箍,佮通用 ` for ` 迴箍,佮條件語句 ` if exp then . . . { elseif exp then . . . } [else . . .] end `。

通用 ` for ` 迴箍:

共表格 ` _ G ` 上使用標準迵天代器函式 ` pairs ` 進行迵天代,到伊轉去到伊 ` nil `。

會使有岫狀的回轉,就是佇其他的回箍仔內底的回箍仔。

函式

Lua 將函式來處理做頭等值,佇下跤例中用 print 函式的表現會當修改來展示:

任何著 ` print ` 的進一步呼叫攏愛經過新函式,並且因為 Lua 的詞法作用域,這舊的 print 函式將干焦會當予這个新的修改去矣 print 存取著。

Lua 閣來支援閉包,展示如下:

逐改呼的時陣為變數 ` x ` 建立新的閉包,所以倒轉來每一个新匿名函式攏咧存取伊家己的 ` x ` 參數。閉包由 Lua 的糞埽收集器來管理,親像任何其他的物件仝款。

create \ _ a \ _ counter ( ) 會轉去一个無頭路,這个匿名函式會共 count 加一下閣回傳。佇咧匿名函式內底的變數 count 的值會一直被儲存佇咧掩名函式中。因此呼叫 create \ _ a \ _ counter ( ) 時產生一个記數器函式,逐擺呼叫記數器函式,攏會得著一个比頂改較大的值。

變數類型

Lua 是一種動態型別語言,就按呢語言內底無類型的定義,無需要聲明變數類型,逐个變數家己儉了類型。

有八種基本類型:nil、布林值(boolean)、 數字型(number)、 字串型(string)、 使用者自訂類型(userdata)、 函式(function)、 執行緒(thread)佮表(table)。

格仔

格仔(table)是 Lua 中上重要的資料結構(並且是設計中唯一內建的複合資料類型), 並且是所有使用者建立類型的基礎。𪜶是增加自動數值鍵佮特殊語法的關聯陣列。

表格是鍵和資料的有序對的搜集,其中的資料用鍵來參照;嘛會使講,伊是插雜配構關聯陣列。

格使用 ` { } ` 構造器語法來建立。

格總是用參照來傳達的(參見傳共享呼叫)。

鍵(索引)會當是除了 ` nil ` 和 NaN 的任何值,包括函式。

通過使用字串作為鍵,表格定定用做結構(抑是記錄)。 因為這種的用法傷捷看著,Lua 為存取這種欄位提供了特殊語法。

通過使用表格來儲存有關函式,伊會當充當號名的空間。

予人表格自動的予人數值鍵,予𪜶會當去予人用做陣列的資料類型。第一个自動索引是一而非零,因為足濟其他的程式語言攏按呢(雖然顯式的索引零是允准的)。

數值鍵 ` 一 ` 佮無仝字串鍵 ` " 一 " `。

格仔的長度 ` t ` 予人定義替任何整數索引 ` n `,予得 ` t [n] ` 毋是呢 ` nil ` 而且 ` t [n + 一] ` 是 ` nil `;而且若準 ` t [一] ` 是 ` nil `,` n ` 會使是無。對一个正規表格,有非 nil 值得自一到予定 ` n `,伊的長度就精確確實是 ` n `,伊的最後的值的索引。你若講這个陣列有「空」(就是講佇咧其他非 nil 價值之間的 nil 值), 著 ` # t ` 會當是直接前導於 ` nil ` 值的任何一个索引(就是講會當共任何這種 nil 值當做陣列的結束)。

格會當是物件的陣列。

使用雜鬥對映來類比陣列通常比使用真正陣列愛慢;猶毋過 Lua 表格為用作陣列做最佳化來避免這个問題。

元表格

會當延伸的語意是講 Lua 的關鍵特徵,而且「元表格」概念允准以強力方式來客製化 Lua 的格仔。下列例展示一个「無限」格仔。對任何 ` n `,` fibs [n] ` 會予出第 ` n ` 個斐波彼契數,使用動態規劃佮記憶化。

物件導向程式設計

就算講 Lua 無內建的類的概念,會當用過兩个語言特徵實現物件導向程式設計:頭等函式和表格。通過囥函式佮有關係的資料入表格,形成一个物件。繼承(單繼承佮偌重繼承兩人)會當通過使用元表格機制來實現,共這个物件講佇佗位的爸物件走揣無存在的方法。

對遮的技術無採用「類」的概念,是採用原形的,類似 Self 抑是 JavaScript。建立新物件愛按呢通過工廠方法(對頭構造一个新的物件), 欲按怎通過複製現存的物件。

建立一个基本的向量物件:

Lua 為著便利物件定向提供一寡語法糖。欲聲明佇原型表格內的成員函式,會用得使用 ` function table : func ( args ) `,伊等價數佇 ` function table . func ( self , args ) `。呼叫類別方法嘛使用冒號,` object : func ( args ) ` 等價於 ` object . func ( object , args ) `。

下面是使用 ` : ` 語法糖的對應的類:

繼承

Lua 支援使用元格來共使得 Lua 有類繼承。佇這个例中,咱允准向量佇衍生的類中將𪜶的值乘以一个常數:

Lua 閣支援偌重繼承咧,` _ _ index ` 會當愛遮是一个函式愛遮是一个表格。運算子加載嘛會當進行,Lua 元格格相有元素譬如講 ` _ _ add `、` _ _ sub `,就是等等的這種。

實現

Lua 程式毋是對文字式的 Lua 檔案直接解說的,是編譯做位元組碼,紲落來共執行佇咧 Lua 虛擬機器頂懸。編譯過程典型的對使用者是不可見並且是咧執行時間來進行的,猶毋過伊會當離線完成用來增加裝載效能抑是通過排除編譯器來減少對宿主環境的記憶體佔用。Lua 位元組碼閣會當佇咧 Lua 之內產生佮執行,使用來自字串庫的 ` dump ` 函式佮 ` load / loadstring / loadfile ` 函式。Lua 版本五孵三 . 四是用差不多二十四 , 零行 C 代碼實現的。

像大多數 CPU,毋是像多數虛擬機器(𪜶是因為疊起來的), Lua VM 是因為暫存器的,所以閣較起來類似真實的硬體設計。暫存器架構既避免過多的值複製閣減少了每函式的指令的總數。Lua 五的虛擬機器是第一个廣泛使用的徛佇暫存器的純 VM。Parrot 和 Android 的 Dalvik 是另外兩个周知的是暫存器的 VM。PCScheme 的 VM 嘛是因為暫存器的。

下跤的例列出頂懸定義的階乘函式的位元組碼(通過 ` luac ` 五榖一編譯器來展示):

` ` ` function < factorial . lua : 一 , 七 > ( 九 instructions , 三十六 bytes at 零 x 八千空六十三 c 六十 ) 一 param , 六 slots , 零 upvalues , 六 locals , 二 constants , 零 functions 一 [二] LOADK 一影一  ; 一二 [三] LOADK 二鋪二  ; 二三 [三] MOVE 三零四 [三] LOADK 四影一  ; 一五 [三] FORPREP 二一  ; to七六 [四] MUL 一一五七 [三] FORLOOP 二鋪二  ; to 六八 [六] RETURN 一二九 [七] RETURN 零一 ` ` `

C API

Lua 意圖去予人入去其他的應用,為著這个目的提供著 C API。API 予人分做兩部份:Lua 核心庫佮輔助庫。Lua API 的設計消除了會使對用 C 代碼的手動參照管理的需要,無仝 Python 的 API。API 親像語言本身仝款是誠簡主義。進階功能通過輔助庫來提供,𪜶真大程度上構成自預處理器宏,用幫助做複雜的表格操作。

Lua C API 是因為疊起來的部份。Lua 提供壓入佮彈出上簡單 C 資料類型(整數、浮點數等)進入和離開疊起來的函式,閣有通過疊操作表格的函式。Lua 疊小可無仝款傳統疊起來,譬如講疊會當直接的被索引。負數索引指示對棧頂開始落去偏移量。比如講 − 一是佇頂懸的(上新進壓入的值), 整數索引指示對下底(上舊的值)向頂懸的偏徙量。佇咧 C 和 Lua 函式之間集合資料嘛用疊完成。愛呼叫一个 Lua 函式,共實際參數壓入相疊,並接著使用 ` lua _ call ` 來呼叫實際的函式。咧寫對 Lua 喝直接咻的 C 函式的時陣,實際參數讀自堆。

下跤是對 C 搧叫 Lua 函式的例 :

如下按呢執行這个比例:

` ` ` $ cc-o example example . c-llua $ . / example Result : 八 ` ` `

C API 閣提供一寡特殊的表格,佇各種 Lua 疊起來的「偽索引」之上。Lua 五孵二進前,佇咧 ` LUA _ GLOBALSINDEX ` 之上是全域表格;` _ G ` 來自 Lua 內部,伊是主號名空間。猶閣有一个登錄檔位佇咧 ` LUA _ REGISTRYINDEX `,佇遮 C 程式會當儉 Lua 價值用著以後檢索。

猶閣會使用 Lua API 寫擴充模組。擴充模組是通過向 Lua 指令碼提供本地設施,用來擴充直譯器的功能的共享物件。對 Lua 方面看來,這種模組出現為一个號名空間的表格,伊有家己的函式佮變數。Lua 指令碼會使用 ` require ` 裝載擴充模組,袂輸用 Lua 家己寫的模組仝款。一組閣佇咧增長中的叫做「rock」的模組會當通過叫做 LuaRocks 的軟體套件管理器取得著,類似 CPAN、RubyGems 和 Python eggs。對大多數的流行的程式語言包括其他的手稿語言,攏存在注好的 Lua 結束。對於 C + +,有真濟佇模仔的方式佮一寡自動結生成器。

應用

佇電動遊戲開發中,Lua 被程式設計師廣泛的用作手稿語言,主要因為伊的可能感知著的較𠢕過望入去、快速執行,佮短學習曲線。

佇二空空三年,GameDev . net 組織的一改投票,說明了 Lua 是遊戲編程的上時行手稿語言。佇二空一二年一月十二號,Lua 予被《遊戲開發者》宣佈做編程工具範圍的 Front Line 獎二空一一年度得著獎者。

大量非遊戲應用嘛會當延伸性 Lua,比如講 TeX 排版設定語言實現 LuaTeX、鍵-值資料庫 Redis、文字編輯器 Neovim 和 web 侍服器 Nginx。

通過 Scribunto 擴充,Lua 有得著為 MediaWiki 軟體內面的侍服器捀手稿語言,Wikipedia 佮其他 wiki 攏是對伊來的。伊的應用包括允准對 Wikidata 整合資料到文章中,佮助力佇自動生物分類框系統。

Lua 會當提去覕入式的硬體,毋但會當納入去其他的程式語言,而且會當騙入去處理器內底,比如講 NodeMCU 開源硬體項目將 Lua 1875入去到 Wi-Fi SoC 中,另外咧,遊戲平台 Roblox 所有的遊戲攏利用 Lua 進行編程的。另外咧,猶閣有中國大陸發起的開源 LuatOS 專案,嘛是將 Lua 應用到1875入式的領域,但是毋是干焦限制 Wifi,伊包括二 G / 四 G / NBIOT 等通信模組,原仔包括講 stm 三十二 / w 八百等1875入式 mcu,同時嘛支援佇遐 windows / linux 平台頂執行的模擬器。

編譯做 Lua 的語言

  • Moonscript,是動態、空白敏感的手稿語言,伊受著 CoffeeScript 的啟發,編譯做 Lua。
  • Haxe,支援編譯做 Lua 目標,支援 Lua 五孵一刀五孵三閣有 LuaJIT 二孵空佮二孵一。
  • Fennel,目標為 Lua 的 Lisp 方言。
  • Urn,起佇咧 Lua 之上的 Lisp 方言。
  • Amulet,類 ML 的函數式語言,其編譯器輸出 Lua 檔案。

參考資料

延伸閱讀

  • Ierusalimschy , R . Programming in Lua 三 rd . Lua . org . 二千空一十三 [二千空二十五十三] . ISBN 九百七十八追八十五分九十鋪排空三千七百九十八孵五鼻空 .(原始內容存檔佇兩千空二十一孵一孵十八).   ( The 一 st ed . is available online . )
  • Gutschmidt , T . Game Programming with Python , Lua , and Ruby . Course Technology PTR . 兩千空三 . ISBN  九百七十八孵一一鋪五鋪九千兩百鋪七十七鋪七 .
  • Schuytema , P . ; Manyen , M . Game Development with Lua . Charles River Media . 兩千空五 . ISBN  九百七十八追一一孵五鋪八千四百五十知四百空四七 .
  • Jung , K . ; Brown , A . Beginning Lua Programming . Wrox Press . 兩千空七 [七 July 兩千空一十八] . ISBN 九百七十八撨空九四百七十五五六千九百一十七孵二 .(原始內容存檔佇兩千空一十八拍七鋪八).
  • Figueiredo , L . H . ; Celes , W . ; Ierusalimschy , R . ( 編 ) . Lua Programming Gems . Lua . org . 兩千空八 [二千空二十五十四] . ISBN 九百七十八追八十五分九十石牌三千七百九十八摃四鼻三 .(原始內容存檔佇兩千空二十五十一九九).
  • Takhteyev , Yuri . Coding Places : Software Practice in a South American City . The MIT Press . 二千空一十二 [二千空二十五十四] . ISBN 九百七十八追空九二百六十二追一千八百空七堵四 .(原始內容存檔佇兩千空一十二分十一孵二).   Chapters 六 and 七 are dedicated to Lua , while others look at software in Brazil more broadly .
  • Varma , Jayant . Learn Lua for iOS Game Development . Apress . 二千空一十二 [二千空二十五十四] . ISBN 九百七十八追一一鼻四千三百空二鼻四千六百六十二鼻六 .(原始內容存檔佇兩千空二十一抹四四).
  • Matheson , Ash . An Introduction to Lua . GameDev . net . 二十九 April 兩千空三 [三 January 二千空一十三] .(原始內容存檔佇兩千空一十二鋪十二鋪十八).
  • Fieldhouse , Keith . Introducing Lua . ONLamp . com . O'Reilly Media . 十六 February 二千空六 [二十八 February 二千空六] .(原始內容存檔佇兩千空六鋪三鋪十二).
  • Streicher , Martin . Embeddable scripting with Lua . developerWorks . IBM . 二十八 April 二千空六 [二千空二十五十四] .(原始內容存檔佇兩千空九抹七堵二).
  • Quigley , Joseph . A Look at Lua . Linux Journal . 一 June 兩千空七 [二千空二十五十四] .(原始內容存檔佇兩千空二十鋪十三十).
  • Hamilton , Naomi . The A-Z of Programming Languages : Lua . Computerworld ( IDG ) . 十一 September 兩千空八 [七 July 兩千空一十八] .(原始內容存檔佇兩千空一十八拍七鋪八).   Interview with Roberto Ierusalimschy .
  • Ierusalimschy , Roberto ; de Figueiredo , Luiz Henrique ; Celes , Waldemar . Passing a Language through the Eye of a Needle . ACM Queue . 十二 May 二千空一十一 ,( 五 ) : 二十–二十九 [七 July 兩千空一十八] . doi : 十 . 一百九十七石八千八百六十二分之一千一百四十五 . 一百九十八拍三千空八十三 .(原始內容存檔佇兩千空一十八拍七鋪八).   How the embeddability of Lua impacted its design .
  • Ierusalimschy , Roberto ; de Figueiredo , Luiz Henrique ; Celes , Waldemar . A Look at the Design of Lua . Communications of the ACM . November 兩千空一十八 ,六十一( 十一 ) : 一百十四–一百二三 [二千空二十五十四] . doi : 十 . 三百一十八學六千兩百七十七分之一千一百四十五 .(原始內容存檔佇兩千空二十一孵一孵九).
  • Lua papers and theses

外部連結

  • 官方網站
  • Lua Users , 使用者社群