編譯並使用Lua語言

Lua是一個小巧的腳本語言,該語言設計的目的是爲了嵌入應用程序中,從而爲應用程序提供靈活的擴展和定製功能。html

  1. 可擴展性。Lua的擴展性很是卓越,能夠經過Lua代碼或C代碼擴展,不少功能能夠經過外部庫來擴展。
  2. 簡單。Lua自己簡單,小巧,但功能強大,易於學習。
  3. 高效率。Lua有很高的執行效率,是目前平均效率最高的腳本語言。
  4. 平臺無關。Lua幾乎能夠運行在全部系統上,經過徹底使用ANSI C來編寫的,只要有ANSI C編譯器就能夠編譯並使用Lua。
  5. 其它特性:同時支持面向過程和函數式編程;自動內存管理;只提供一種通用類型的表table,用它能夠實現數組、哈希表、集合、對象;語言內置模式匹配;閉包;函數也能夠看作一個值;提供多線程支持,並不是操做系統中的線程;經過閉包和table能夠方便地支持面向對象所須要的一些關鍵機制,如數據抽象、虛函數、繼承、重載等。

那麼爲何要學習Lua語言了?僅僅上面這些優勢是不夠的,通常來講,Lua主要用於遊戲開發中,性能不錯,也能夠看成配置文件。而對於性能要求不高的應用,強大的Python是更好的選擇。git

要學習Lua,天然離不開實踐,我是在Win8下用VS2013來編譯Lua源代碼的,編譯完成後能夠獲得一個Lua解釋器,能夠直接運行咱們的腳本。先去官網下載Lua源代碼,而後用Visual Studio建立一個C++控制檯解決方案,默認不包含代碼。接着把src文件夾複製到項目目錄下,在VS中添加所需代碼。咱們一共須要建立3個項目,Lua5.2項目做爲靜態庫,生成Lib文件;Lua項目做爲解釋器,引用Lua5.2項目,生成exe文件;Luac做爲編譯器,引用Lua5.2項目。src文件夾中,lua.c文件不要添加到庫Lua5.2中,要單獨添加到Lua中;luac.c文件則添加到Luac項目中。須要注意的是,在編譯爲lib文件時,須要作以下配置:C/C++   -->  高級  -->  編譯爲  -->  選擇「編譯爲C++代碼(/TP)」,不然使用lua  lib庫的時候會報連接錯誤。不知道怎麼弄的能夠直接下載我提供的Lua工程代碼,點擊下載。弄好後,獲得Lua.exe,Luac.exe和Lua5.2.lib文件,咱們把這些文件放入一個Lua文件夾中,加入到系統環境變量Path中能夠直接在CMD下使用。github

那麼用什麼代碼編輯器了?這裏推薦使用sublime,加上插件確實方便,https://github.com/leitwolf/LuaTools。不過代碼提示不夠好,使用io函數時會報錯,我也不知道用什麼好,隨意吧。好了,若是你把lua.exe加入到了環境變量中,就能夠在Windows下直接運行Lua命令來啓動解釋器了。輸入print('hello')就能夠獲得輸出結果,但你確定不想這麼寫程序,因此仍是用編輯器建立一個.lua文件比較好,而後在CMD中輸入命令lua file.lua就能夠獲得運行結果了。下面總結一下這些經常使用的命令格式。編程

在CMD模式下,就是沒有直接運行lua.exe的狀況下,格式以下,前面的是命令,後面是註釋:數組

lua options script args;
lua -e "print('hello')", to execute code;
lua -i -llib, to load lib library;
lua -e "a=1" a b c, so arg[0] = "a", arg[1] = "b",
arg [-1] = "a=1", arg[-2] = "-e", arg[-3] = "lua";多線程

在運行了Lua.exe的交互模式下,格式以下:閉包

=4*3, as a calculator;
os.exit(), to exit the console;
dofile("test.lua"), to execute and load function;
use "do ... end" for a complete chunk編輯器

下面咱們建立一個test.lua測試文件,一個簡單的函數:函數式編程

function fact(n) if n < 0 then
        return nil
    elseif n == 0 then
        return 1
    else
        return n * fact(n-1) end
end

print(fact(-4)) print("filename: " .. arg[0] .. "\n")

 

function表示函數,後面是函數名和參數。能夠看到,語句之間不須要分隔符,但你使用;並無錯。if語句和函數以end做爲結尾,也不須要指定返回值類型。函數

Lua是一個自由格式的語言,變量名能夠由任意字符構成,但不能以數字開頭,也不能是經常使用的關鍵字。Lua是區分大小寫的。經常使用的關鍵字有:and, or, not, if, else, elseif, then, end, true, false, nil, goto, function, for, do, while, until, break, return, in, local, repeat。

 

Lua是動態腳本語言,這意味着「變量」沒有類型,只有「值」有類型。語言中不存在類型定義,全部的值擁有自身類型。Lua中的八種基礎數據類型,能夠用type函數查看類型:

  1. nil :表示值爲空。
  2. boolean :nil類型的值和false都表示false,其它值表示true。
  3. number :數字類型。
  4. string :不可變的字節序列,可包含任何8-bit值,包括'\0'。
  5. function :調用由Lua或C寫的函數。
  6. userdata : 指向一塊內存的指針,用於存儲C語言類型數據。有兩種userdata,full userdata的內存由Lua管理,light userdata的內存由宿主語言管理。對於userdata,沒有預約義的操做,經過使用metatables(元表),能夠爲full userdata定義相關數據操做。不能在Lua中修改和建立userdata類型的值,僅僅能夠用C API修改。
  7. thread :Lua中的coroutine(協程),在不支持多線程的系統中也可使用。
  8. table :用於實現數組,包含key和value,key不能夠是nil和NaN,value能夠包含全部類型數據,但value不能夠是nil。即不存在的key的value爲nil。

Tables,functions,threads,full userdata的value都是objects(變量並不包含值,只是這些值的引用)。

關於Lua的學習,推薦Programming in Lua第三版這本書,英文的,不懂的能夠對照第二版中文的看。本覺得Lua的知識不多,寫點東西就沒了,但學完後才發現太多了,因此就不繼續了。

推薦一個學習項目,https://github.com/xfbs/PiL3;還有這篇博文

http://www.cnblogs.com/stephen-liu74/archive/2012/06/13/2407507.html

相關文章
相關標籤/搜索