Lua
[1] 是一個小巧的腳本語言。它是巴西里約熱內盧天主教大學(Pontifical Catholic University of Rio de Janeiro)里的一個由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo三人所組成的研究小組於1993年開發的。 其設計目的是為了通過靈活嵌入應用程序中從而為應用程序提供靈活的擴展和定制功能。Lua由標准C編寫而成,幾乎在所有操作系統和平台上都可以編譯,運行。Lua並沒有提供強大的庫,這是由它的定位決定的。所以Lua不適合作為開發獨立應用程序的語言。Lua 有一個同時進行的JIT項目,提供在特定平台上的即時編譯功能。
Lua腳本可以很容易的被
C/C++ 代碼調用,也可以反過來調用C/C++的函數,這使得Lua在應用程序中可以被廣泛應用。不僅僅作為擴展腳本,也可以作為普通的配置文件,代替
XML,ini等文件格式,並且更容易理解和維護。
[2] Lua由標准C編寫而成,代碼簡潔優美,幾乎在所有操作系統和平台上都可以編譯,運行。 [2] 一個完整的Lua解釋器不過200k,在目前所有腳本引擎中,Lua的速度是最快的。這一切都決定了Lua是作為嵌入式腳本的最佳選擇。 [2]
Lua腳本是一個很輕量級的腳本,也是號稱性能最高的腳本,用在很多需要性能的地方,比如:游戲腳本,nginx,wireshark的腳本,當你把他的源碼下下來編譯后,你會發現解釋器居然不到200k,這是多么地變態啊(/bin/sh都要1M,MacOS平台),而且能和C語言非常好的互動
它主要的使用場景主要是:
- 在 Lua 中揉和和處理各種不同的 nginx 上游輸出(Proxy,Postgres,Redis,Memcached 等)
- 在請求真正到達上游服務之前,Lua 可以隨心所欲的做復雜的訪問控制和安全檢測
- 隨心所欲的操控響應頭里面的信息
- 從外部存儲服務(比如 Redis,Memcached,MySQL,Postgres)中獲取后端信息,並用這些信息來實時選擇哪一個后端來完成業務訪問
而 Lua 語言自身也有一些特別的地方:
下標從 1 開始,這個是和其他編程語言很大的不同。
不區分 array 和 dict ,會導致處理 json 的時候,無法區分 array 和 object。
默認全局變量,需要在所有變量前加 local,忘記的話,可能導致各種難查的 bug。
自帶的字符串正則匹配規則和通常的 PCRE 不同,使用的話,學習成本較高。
Lua 標准庫和周邊庫,都是阻塞的,需要自己甄別哪些可以和 OpenResty 搭配使用。新手很容易使用了阻塞的庫,而導致性能急劇下降。
運行可以通過 Lua 的交互模式,也可以用記事本編輯代碼保存為 .lua 的格式,通過 Lua 編譯器運行。也可以通過第三方工具,將 Lua 打包獨立運行。
Lua的目標是成為一個很容易嵌入其它語言中使用的語言。大多數程序員也認為它的確做到了這一點。
很多應用程序、游戲使用LUA作為自己的嵌入式
腳本語言,以此來實現可配置性、可擴展性。這其中包括
魔獸世界、
博德之門、
憤怒的小鳥、QQ三國、VOCALOID3、Garry's Mod、
太陽神三國殺、
游戲王ygocore和飢荒等。
輕量級
Lua語言的官方版本只包括一個精簡的核心和最基本的庫。這使得Lua體積小、啟動速度快,從而適合嵌入在別的程序里。5.0.2版的Lua的
內核小於120KB,而Python的內核大約860KB,Perl的內核大約1.1MB。
[3]
可擴展
Lua並不象其它許多"大而全"的語言那樣,包括很多功能,比如網絡通訊、圖形界面等。但是Lua提供了非常易於使用的擴展接口和機制:由
宿主語言(通常是C或
C++)提供這些功能,Lua可以使用它們,就像是本來就內置的功能一樣。
其它特性
Lua還具有其它一些特性:同時支持
面向過程(procedure-oriented)編程和
函數式編程(functional programming);自動
內存管理;只提供了一種通用類型的表(table),用它可以實現
數組,哈希表,集合,對象;語言內置模式匹配;閉包(closure);函數也可以看做一個值;提供多線程(協同進程
[4] ,並非操作系統所支持的線程)支持;通過閉包和table可以很方便地支持面向對象編程所需要的一些關鍵機制,比如數據抽象,虛函數,繼承和重載等。
-
獨立應用腳本
-
Web 應用腳本
-
擴展和數據庫插件如:MySQL Proxy 和 MySQL WorkBench
-
安全系統,如入侵檢測系統