學習之餘瀏覽一下大神陳皓的酷殼網,不經意看到這篇《Lua簡明教程》,於是想嘗試一下這個很輕量級的腳本,也號稱性能最高的腳本語言。
一、Lua 語言簡介
Lua(英語發音:/ˈluːə/)程序設計語言是一個簡潔、輕量、可擴展的腳本語言,是葡萄牙語中“Luna”(月亮)的意思。是巴西里約熱內盧天主教大學(Pontifical Catholic University of Rio de Janeiro)裏的一個研究小組,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所組成並於1993年開發(已經有20多個年頭咯)。 其設計目的是爲了嵌入應用程序中,從而爲應用程序提供靈活的擴展和定製功能。Lua由標準C編寫而成,幾乎在所有操作系統和平臺上都可以編譯,運行。
Lua並沒有提供強大的庫,這是由它的定位決定的。所以Lua不適合作爲開發獨立應用程序的語言。Lua 有一個同時進行的JIT項目,提供在特定平臺上的即時編譯功能。[1]
二、Lua 安裝
網上搜了一下,好像sudo apt-get、install lua5.2就可以。
我是在Lua官網下載安裝包安裝的(我下載的lua-5.2.3.tar.gz):
1. tar -xvf lua-5.2.3.tar.gz
後 cd lua-5.2.3 進入目錄
long@zhouyl:~/Public/lua-5.2.3$ ls
doc Makefile README src
很明顯,Linuxer在看到README的情況下毋庸置疑的要看一下:
long@zhouyl:~/Public/lua-5.2.3$ cat README
This is Lua 5.2.3, released on 11 Nov 2013.
For installation instructions, license details, and
further information about Lua, see doc/readme.html.
這個README寫的很簡單,沒有我們預想的那樣寫了如何安裝或者如何使用等,但是它寫明瞭想要學習Lua的更多信息,查看doc/readme.html文件,所以…… chromium-browser doc/readme.html打開看看唄。不出所料,打開的網頁中有着About / Installing / Changes ...,所以我們略讀一遍就能知道如何安裝。
2. make linux (這裏make後跟着平臺,我們當然要跟着linux咯)
不幸的是……報錯了:“ error:readline/readline.h:no such file or directory ”
之前的博客中,我寫過使用apt-file查詢這種缺失文件的方法,有興趣可以看看《cyclictest 測試以及原理淺談》一文,在其中有詳細的apt-file使用。
apt-file search readline | grep readline.h
可以很輕鬆地在結果中找到這條:
“ libreadline6-dev: /usr/include/readline/readline.h ”,所以apt-get安裝之(sudo apt-get install libreadline6-dev)!
安裝完成後,再使用 make linux 非常順利!
3. sudo make install
此時,Lua已經安裝完畢,我們可以使用這個神奇的腳本語言Lua了:
long@zhouyl:~/Public/lua-5.2.3$ lua
Lua 5.2.3 Copyright (C) 1994-2013 Lua.org, PUC-Rio
> print("Hello World")
Hello World
>
作爲一個腳本語言,它當然也可以寫到腳本文件中運行:
long@zhouyl:/tmp/test$ cat hello.lua
#!/usr/local/bin/lua
print("Hello World")
long@zhouyl:/tmp/test$ lua hello.lua
Hello World
long@zhouyl:/tmp/test$ chmod +x hello.lua
long@zhouyl:/tmp/test$ ./hello.lua
Hello World
long@zhouyl:/tmp/test$
三、Lua 語言基礎
3.1 註釋
-- 兩個橫線開始單行註釋
--[[
加上兩個[和]表示
多行註釋。
--]]
3.2 變量類型
Lua是一種動態類型語言,因此語言中沒有類型的定義,不需要聲明變量類型,每個變量自己保存了類型。Lua有八種基本類型:
數值(number) 內部以double表示,Lua的數字只有double型,64bits,你不必擔心Lua處理浮點數會慢(除非大於100,000,000,000,000),或是會有精度問題
字符串(string) 總是以零結尾,但可以包含任意字符(包括零),因此並不等價於C字符串,而是其超集。字符串你可以用單引號,也可以用雙引號或者上面註釋時用到的[[ ]](類似於Python中的三引號,可以用於定義多行的字符串),還支持C類型的轉義,比如: ‘\a’ (響鈴), ‘\b’ (退格), ‘\f’ (表單), ‘\n’ (換行)>, ‘\r’ (回車), ‘\t’
(橫向製表), ‘\v’ (縱向製表), ‘\\’ (反斜槓), ‘\”‘ (雙引號), 以及 ‘\” (單引號)
布爾(boolean) 只有“true”或者“false”兩個值。數字0、''空字符串('\0')都是true!
函數(function) Lua的關鍵概念之一。不簡單等同於C的函數或函數指針。
表(table) 異構的Hash表。Lua的關鍵概念之一。
userdata 用戶(非腳本用戶)定義的C數據結構。腳本用戶只能使用它,不能定義。
線程(thread) Lua協作線程(coroutine),與一般操作系統的搶佔式線程不一樣。
nil 代表什麼也沒有,可以與C的NULL作類比,但它不是空指針。你訪問一個沒有聲明過的變量,就是nil。例如 foo
= anUnknownVariable 現在 foo = nil。 只有false和nil是false,其他的都是true,上面提到過包括0和空字符串在內都是true。
> print(type(nil))
nil
> print(type(99.9+12))
number
> print(type(true))
boolean
> print(type("Hello World"))
string
> print(type(print))
function
> print(type{test = "test"})
table
要注意的是:lua中的變量如果沒有特殊說明,全是全局變量,那怕是語句塊或是函數裏。變量前加local關鍵字的是局部變量。theGlobalVar = 50
local theLocalVar = "local variable"
3.3 流控制
Lua中使用do和end等關鍵字標示出程序塊:
while 循環:
while num < 50 do
num = num + 1 -- 沒有 ++ or += 運算符。
end
If 語句:
if num > 40 then
print('over 40')
elseif s ~= 'walternate' then -- ~= 表示不等於。像Python一樣,== 表示等於,適用於字符串。
io.write('not over 40\n') -- 默認輸出到stdout。
else
-- 默認變量都是全局的。
thisIsGlobal = 5 -- 通常用駝峯式定義變量名。
-- 如何定義局部變量:
local line = io.read() -- 讀取stdin的下一行。
-- ..操作符用於連接字符串:
print('Winter is coming, ' .. line)
end
and 和 or :
Lua中的'or'和 'and'都是可短路的,和python中一樣, 我們也可以使用 a and b or c 得到類似於C/js裏的 a?b:c 操作符:ans = aBoolValue and 'yes' or 'no'
for 循環:
karlSum = 0
for i = 1, 100 do -- 範圍包括兩端
karlSum = karlSum + i
end
-- 使用 "100, 1, -1" 表示遞減的範圍:
fredSum = 0
for j = 100, 1, -1 do fredSum = fredSum + j end
範圍表達式爲begin, end[, step]。類似於python中的range()。
until 循環:
repeat
print('the way of the future')
num = num - 1
until num == 0
3.4 函數
Lua的函數定義同shell中類似,使用function關鍵字,end結束:
遞歸
function fib(n)
if n < 2 then return 1 end
return fib(n - 2) + fib(n - 1)
end
閉包
示例一
function newCounter()
local i = 0
return function() -- anonymous function
i = i + 1
return i
end
end
c1 = newCounter()
print(c1()) --> 1
print(c1()) --> 2
示例二
function myPower(x)
return function(y) return y^x end
end
power2 = myPower(2)
power3 = myPower(3)
print(power2(4)) --4的2次方
print(power3(5)) --5的3次方
Lua 語言支持多值同時賦值:name,Age = "Zhou",12,所以Lua的函數返回值也多返回值(同python挺像):
#!/usr/local/bin/lua
function getUserInfo(id)
print(id)
return "Zhou", 24
end
name, age = getUserInfo() -- 使用多個變量接收函數返回值
print(name)
print(age)
print(getUserInfo(123)) -- 直接打印函數的多個返回值
print(getUserInfo(123)[1]) -- 嘗試一下是否支持python式的使用數
組方式選擇返回值的部分
程序寫的很簡單,那麼運行結果如何?
long@zhouyl:/tmp$ lua aa.lua
nil -- 沒有帶參數,打印id時打印空
Zhou
24
123 -- 打印id
Zhou 24 -- 輸出多返回值
123
nil -- 並不支持選取返回值的部分,所以還是乖乖用變量接收返回值比較好
3.5 Table
所謂Table其實就是一個Key Value的數據結構,就像python或者其他語言中的Dict(字典),Table是Lua中的唯一的數據結構:
long@zhouyl:~$ lua
Lua 5.2.3 Copyright (C) 1994-2013 Lua.org, PUC-Rio
> zhou = {name="Zhou Yunlong",age=24,home="AH"}
> print(zhou.name) -- 通過key打印value
Zhou Yunlong
> zhou.hope="gf" -- 可以直接添加
> print(zhou.hope)
gf
> for key,value in pairs(zhou) do -- 遍歷Table
print(key,value)
end
hope gf
age 24
name Zhou Yunlong
home AH
>
四、說在最後的話
本文只是在看到陳皓大神的博文後,對Lua腳本語言的一些簡單測試,感覺還挺有意思的,這個神奇、簡單、高效的語言也走過了20多個年頭。
但是Lua與python不同的是,python有着龐大豐富的庫,而Lua的庫並不多,所以Lua一般用來作爲一種嵌入式腳本語言,使用過Lua的項目(很多遊戲中使用到)也是令人矚目,包括偉大的魔獸世界的插件中也是使用到Lua。但是本文只做了一些簡單的語言規則的描述,以後如果有時間還是看看這門神奇的語言。下面貼出一些在網上學習Lua的好資源,如果你有興趣,不妨玩玩?!
================
引用:
[1] http://baike.baidu.com/link?url=zG3bYWFojdkaOefWrkPZFH9TkBIOmQqSDtuD9YgzwBx_h6eeGKsJx3brHfPrwvpL
[2] http://coolshell.cn/articles/10739.html
[3] http://tylerneylon.com/a/learn-lua/
更多學習:
- manual.luaer.cn lua在線手冊
- book.luaer.cn lua在線lua學習教程
- lua參考手冊Lua參考手冊的中文翻譯(雲風翻譯版本)
- LUA編程(programming in lua中文版)
- http://www.codingnow.com/2000/download/lua_manual.html Lua 5.1 中文手冊。
- http://lua-users.org/ 可以得到大量的關於 lua 的信息。
- http://www.lua.org/lua-l-stats.html 這裏可以用 web 訪問到 lua 的 maillist ,但是如果想好好用 Lua ,還是訂閱一份比較好。
- http://luaforge.net/projects/ 大量的 Lua 相關的項目可以參考。並不是所有的項目都值得直接拿來用的,儘管 Lua 5.1 已經發布了官方的 module 擴展方案。不過許多 source code 是值得借鑑的。
- http://benchmarksgame.alioth.debian.org/u32/benchmark.php?test=all&lang=lua&lang2=lua 我們可以從這裏得到許多高性能的 lua 代碼,從中瞭解如何寫出高質量的 lua 程序。
- http://luajit.org/ Lua JIT 絕對值得關注的東西。
- http://www.keplerproject.org/ 用 lua 實現的一個 web 解決方案,算是一個巨大的基於 lua 的工程了。
- http://www.codingnow.com/2000/download/The%20Implementation%20of%20Lua5.0.pdf
The Implementation of Lua 5.0 中譯(向海飛 譯)
關於Lua的標庫,你可以看看官方文檔:string, table, math, io, os。