# Lua簡介
#### Lua 是什么?
1993年在巴西里約熱內盧天主教大學(Pontifical Catholic University of Rio de Janeiro in Brazil)誕生了一門編程語言,發明者是該校的三位研究人員,他們給這門語言取了個浪漫的名字——`Lua`,在葡萄牙語里代表美麗的月亮。事實證明她沒有糟蹋這個優美的單詞,Lua語言正如它名字所預示的那樣成長為一門簡潔、優雅且富有樂趣的語言。
Lua 從一開始就是作為一門方便嵌入(其它應用程序)并可擴展的輕量級腳本語言來設計的,因此她一直遵從著簡單、小巧、可移植、快速的原則,官方實現完全采用ANSI C編寫,能以C程序庫的形式嵌入到宿主程序中。Lua 的每個版本都保持著開放源碼的傳統,不過各版采用的許可協議并不相同,自5.0版(最新版是5.1)開始她采用的是著名的MIT許可協議。正由于上述特點,所以Lua在游戲開發、機器人控制、分布式應用、圖像處理、生物信息學等各種各樣的領域中得到了越來越廣泛的應用。其中尤以游戲開發為最,許多著名的游戲,比如 Escape from Monkey Island、World of Warcraft、大話西游,都采用了 Lua 來配合引擎完成數據描述、配置管理和邏輯控制等任務。
作為一門過程型動態語言,Lua有著如下的特性:
1. 變量名沒有類型,值才有類型,變量名在運行時可與任何類型的值綁定;
1. 語言只提供唯一一種數據結構,稱為表(table),它混合了數組、哈希,可以用任何類型的值作為key和value。提供了一致且富有表達力的表構造語法,使得Lua很適合描述復雜的數據;
1. 函數是一等類型,支持匿名函數和正則尾遞歸(proper tail recursion);
1. 支持詞法定界(lexical scoping)和閉包(closure);
1. 提供thread類型和結構化的協程(coroutine)機制,在此基礎上可方便實現協作式多任務;
1. 運行期能編譯字符串形式的程序文本并載入虛擬機執行;
1. 通過元表(metatable)和元方法(metamethod)提供動態元機制(dynamic meta-mechanism),從而允許程序運行時根據需要改變或擴充語法設施的內定語義;
1. 能方便地利用表和動態元機制實現基于原型(prototype-based)的面向對象模型;
1. 從5.1版開始提供了完善的模塊機制,從而更好地支持開發大型的應用程序;
Lua的語法類似 PASCAL 和 Modula 但更加簡潔,所有的語法產生式規則(EBNF)不過才60幾個。熟悉 C 和 PASCAL 的程序員一般只需半個小時便可將其完全掌握。而在語義上 Lua 則與 Scheme 極為相似,她們完全共享上述的1、3、4、6點特性, Scheme 的 continuation 與協程也基本相同只是自由度更高。最引人注目的是,兩種語言都只提供唯一一種數據結構:Lua 的表和 Scheme 的列表(list)。正因為如此,有人甚至稱Lua為“只用表的 Scheme”。
#### Lua 和 LuaJIT 的區別
Lua非常高效,它運行得比許多其它腳本(如Perl、Python、Ruby)都快,這點在第三方的獨立測評中得到了證實。盡管如此,仍然會有人不滿足,他們總覺得“嗯,還不夠快!”。LuaJIT就是一個為了再榨出一點速度的嘗試,它利用JIT編譯技術把Lua代碼編譯成本地機器碼后交由CPU直接執行。LuaJIT測評報告表明,在浮點運算、循環和協程的切換等方面它的加速效果比較顯著,但如果程序大量依賴C編寫的函數,那么運行速度便不會有什么改進。目前LuaJIT只支持X86 CPU。
LuaJIT 是采用 C 語言寫的 Lua 的解釋器。LuaJIT 被設計成全兼容標準 Lua 5.1, 因此 LuaJIT 代碼的語法和標準 Lua 的語法沒多大區別。LuaJIT 和 Lua 的一個區別是,LuaJIT 的運行速度比標準 Lua 快數十倍,可以說是一個 Lua 的高效率版本。
若無特殊說明,我們接下來的章節都是基于 LuaJIT 進行介紹的。
Lua 官網鏈接:[http://www.lua.org](http://www.lua.org) ,LuaJIT 官網鏈接:[http://luajit.org](http://luajit.org)
- 序
- Lua 入門
- Lua簡介
- Lua環境搭建
- 基礎數據類型
- 表達式
- 控制結構
- if/else
- while
- repeat
- for
- break,return
- Lua函數
- 函數的定義
- 函數的參數
- 函數的返回值
- 函數回調
- 模塊
- String庫
- Table庫
- 日期時間函數
- 數學庫函數
- 文件操作
- 元表
- 面向對象編程
- FFI
- 下標從1開始
- 局部變量
- 判斷數組大小
- 非空判斷
- 正則表達式
- 不用標準庫
- 虛變量
- 函數在調用代碼前定義
- 抵制使用module()函數來定義Lua模塊
- 點號與冒號操作符的區別
- Nginx
- Nginx 新手起步
- location 匹配規則
- if 是邪惡的
- 靜態文件服務
- 日志服務
- 反向代理
- 負載均衡
- 陷阱和常見錯誤
- 環境搭建
- Windows平臺
- CentOS平臺
- Ubuntu平臺
- Mac OS X平臺
- Hello World
- 簡單API Server框架
- 獲取Nginx內置綁定變量
- LuaRestyRedisLibrary
- select+set_keepalive組合操作引起的數據讀寫錯誤
- redis接口的二次封裝(簡化建連、拆連等細節)
- redis接口的二次封裝(發布訂閱)
- pipeline壓縮請求數量
- script壓縮復雜請求
- LuaCjsonLibrary
- json解析的異常捕獲
- 稀疏數組
- 空table編碼為array還是object
- 跨平臺的庫選擇
- PostgresNginxModule
- 調用方式簡介
- 不支持事務
- 超時
- 健康監測
- SQL注入
- LuaNginxModule
- 執行階段概念
- 正確的記錄日志
- 熱裝載代碼
- 阻塞操作
- 緩存
- sleep
- 定時任務
- 禁止某些終端訪問
- 請求返回后繼續執行
- 調試
- 調用其他C函數動態庫
- 我的lua代碼需要調優么
- 變量的共享范圍
- 動態限速
- shared.dict 非隊列性質
- 如何添加自己的lua api
- 正確使用長鏈接
- 如何引用第三方resty庫
- 典型應用場景
- LuaRestyDNSLibrary
- 使用動態DNS來完成HTTP請求
- 緩存失效風暴
- 測試
- 單元測試
- API測試
- 性能測試
- 持續集成
- 灰度發布
- Web 服務
- API的設計
- 數據合法性檢測
- 協議無痛升級
- 代碼規范
- 連接池
- C10K編程
- TIME_WAIT問題
- 與Docker使用的網絡瓶頸
- 火焰圖
- 什么時候使用
- 顯示的是什么
- 如何安裝火焰圖生成工具
- 如何定位問題
- 開源文化對360企業安全的影響