openresty開發系列12--lua介紹及經常使用數據類型簡介
lua介紹
1993 年在巴西里約熱內盧天主教大學(Pontifical Catholic University of Rio de Janeiro in Brazil)誕生了一門編程語言,發明者是該校的三位研究人員,他們給這門語言取了個浪漫的名字——Lua,在葡萄牙語裏表明美麗的月亮。事實證實她沒有糟蹋這個優美的單詞,Lua 語言正如它名字所預示的那樣成長爲一門簡潔、優雅且富有樂趣的語言。
Lua 從一開始就是做爲一門方便嵌入(其它應用程序)並可擴展的輕量級腳本語言來設計的,所以她一直聽從着簡單、小巧、可移植、快速的原則,官方實現徹底採用 ANSI C 編寫,能以 C 程序庫的形式嵌入到宿主程序中。LuaJIT 2 和標準 Lua 5.1 解釋器採用的是著名的 MIT 許可協議。正因爲上述特色,因此 Lua 在遊戲開發、機器人控制、分佈式應用、圖像處理、生物信息學等各類各樣的領域中獲得了愈來愈普遍的應用。其中尤以遊戲開發爲最,許多著名的遊戲都有lua的身影
Lua 和 LuaJIT 的區別
Lua 很是高效,它運行得比許多其它腳本(如 Perl、Python、Ruby)都快,這點在第三方的獨立測評中獲得了證明。儘管如此,仍然會有人不知足,他們總以爲"嗯,還不夠快!"。LuaJIT 就是一個爲了再榨出一些速度的嘗試,它利用即時編譯(Just-in Time)技術把 Lua 代碼編譯成本地機器碼後交由 CPU 直接執行。LuaJIT 2 的測評報告代表,在數值運算、循環與函數調用、協程切換、字符串操做等許多方面它的加速效果都很顯著。憑藉着 FFI 特性,LuaJIT 2 在那些須要頻繁地調用外部 C/C++ 代碼的場景,也要比標準 Lua 解釋器快不少。目前 LuaJIT 2 已經支持包括 i38六、x86_6四、ARM、PowerPC 以及 MIPS 等多種不一樣的體系結構。
LuaJIT 是採用 C 和彙編語言編寫的 Lua 解釋器與即時編譯器。LuaJIT 被設計成全兼容標準的 Lua 5.1 語言,同時可選地支持 Lua 5.2 和 Lua 5.3 中的一些不破壞向後兼容性的有用特性。所以,標準 Lua 語言的代碼能夠不加修改地運行在 LuaJIT 之上。LuaJIT 和標準 Lua 解釋器的一大區別是,LuaJIT 的執行速度,即便是其彙編編寫的 Lua 解釋器,也要比標準 Lua 5.1 解釋器快不少,能夠說是一個高效的 Lua 實現。另外一個區別是,LuaJIT 支持比標準 Lua 5.1 語言更多的基本原語和特性,所以功能上也要更增強大。
2)應用場景
1. 在不少時候,咱們能夠將Lua直接嵌入到咱們的應用程序中,如遊戲、監控服務器等。這樣的應用方式對於程序的最終用戶而言是徹底透明的,可是對於程序自己,其擴展性將會獲得極大的加強。
2. 將Lua視爲一種獨立的腳本語言,經過它來幫助咱們完成一些軟件產品的輔助性工具的開發。好比在咱們以前的數據分析產品中,咱們經過編寫Lua腳本,將每一個用戶不一樣格式的數據從新格式化爲咱們的軟件平臺可以讀取的格式,以後再將格式化的後的數據加載到數據庫中,或者是寫入咱們的分析引擎能夠識別的數據分析文件中。這其中Lua僅僅用於文件格式的規格化過程,至於此後的操做,都是經過Lua調用咱們的C語言導出函數來完成的。
3. 將Lua應用於應用程序的動態配置部分。好比移動智能設備或嵌入式設備,它們的顯示分辨率在不少狀況下都是非標準的,若是咱們爲每一款設備都維護一套相關的配置信息,這無疑會加大咱們程序的維護開銷,若是咱們將這段動態配置邏輯交由Lua腳本完成,那麼這對於程序配置的靈活性而言,將會獲得很大的提升。甚至能夠是這樣,運行在移動終端設備上的應用程序,在啓動主窗體以前先和服務器創建鏈接,在服務器確認設備的各類參數後,再將和該設備顯示相關的Lua腳本發送給設備客戶端,這樣客戶端在獲得Lua腳本以後,就能夠馬上執行它以獲得最新的動態配置信息。
3)主要優點
1. 高效性:
做爲一種腳本語言,Lua的高效是衆所周知的,所以在實際應用中,不少大型程序都會考慮將代碼中易變的部分用Lua來編寫。這不但沒有明顯下降系統的運行效率,反而使程序的穩定性和可擴展性獲得了顯著的提高。
2. 可移植性:
在官方網站中提供了基於多種平臺的發佈包,如Linux/Unix、Windows、Symbian和Pocket PC等。
3. 可嵌入性:
在語言設計之初,Lua就被準確的定位爲嵌入式腳本語言,所以Lua的設計者們爲Lua提供了與其餘編程語言之間的良好交互體驗,這特別體如今和C/C++之間的交互上。對於其餘語言,如Java和C#,也能夠將Lua做爲其嵌入式腳本引擎,並在代碼中進行直接的交互。
4. 簡單強大:
儘管是過程化腳本語言,但因爲Lua的設計者們爲Lua提供了meta-mechanisms機制,這不只使Lua具有了一些基本的面向對象特徵,如對象和繼承,並且仍然保持了過程化語言所具備的語法簡單的特徵。
5. 小巧輕便:
在最新版本(5.2.0)的Lua中,僅僅包含了大約20000行的C語言代碼,編譯後的庫文件大小約爲240K左右,所以這對於不少資源有限的平臺有着極強的吸引力。
6. 免費開源:
MIT Licence可讓Lua被免費的用於各類商業程序中。
lua的經常使用數據類型簡介
java
一)註釋 單行註釋 兩個減號是單行註釋: --註釋內容 多行註釋 --[[ 多行註釋 多行註釋 --]] 二)基本類型 Lua中有8個基本類型分別爲: nil(空) -----> java null(空) boolean(布爾)、 number(數字) 雙精度浮點數 ---> java int double float string(字符串) table(表) ----> 相似 java map function(函數)、 userdata(自定義的類型)、 thread(線程/協程) 使用type函數測試給定變量或者值的類型 三)變量 1)變量命名 大小寫區分命名規則 Lua 標示符用於定義一個變量,函數獲取其餘用戶定義的項。標示符以一個字母 A 到 Z 或 a 到 z 或下劃線 _ 開頭後加上0個或多個字母,下劃線,數字(0到9)。 _temp 通常約定,如下劃線開頭鏈接一串大寫字母的名字(好比 _VERSION)被保留用於 Lua 內部全局變量。 關鍵詞: and break do else elseif end false true for function if in local nil not or return then repeat until while 變量名字,它的大小寫是相關的。也就是說,A和a是兩個不一樣的變量 定義一個變量的方法就是賦值。"="操做就是用來賦值的。 2)全局變量 在默認狀況下,變量老是認爲是全局的。除非,你在前面加上"local"。這一點要特別注意,由於你可能想在函數裏使用局部變量,卻忘了用local來講明. 全局變量不須要聲明,給一個變量賦值後即建立了這個全局變量,訪問一個沒有初始化的全局變量也不會出錯,只不過獲得的結果是:nil。 > print(b) nil > b=10 > print(b) 10 > 若是你想刪除一個全局變量,只須要將變量賦值爲nil。 b = nil print(b) --> nil 這樣變量b就好像從沒被使用過同樣。換句話說, 當且僅當一個變量不等於nil時,這個變量即存在。 3)局部變量 變量名稱 前加修飾符 local 四)nil類型 > print(type(a)) nil ------------------------- 對於全局變量和 table,nil 還有一個"刪除"做用,給全局變量或者 table 表裏的變量賦一個 nil 值,等同於把它們刪掉,執行下面代碼就知: tab1 = { key1 = "val1", key2 = "val2" } for k, v in pairs(tab1) do print(k .. " - " .. v) end print('---------') tab1.key1 = nil for k, v in pairs(tab1) do print(k .. " - " .. v) end ----------------------------- 判斷nil類型 做比較時應該加上雙引號 ": type(X) ---> 返回的類型 實際上是string > type(X)==nil false > type(X)=="nil" true