我是老吳,一個愛學習的,嵌入式 Linux 驅動工程師。關注我,一起變得更加優(yōu)秀吧!
哈嘍,老吳這幾天都在了解 Lua 這門腳本語言,感覺它太適合我這種懶人了,下面記錄一下學習心得。
Lua 是什么?
Lua 是一門腳本語言,和 Shell、Python 是同一種類型。
https://www.lua.org/about.html
Lua 的優(yōu)點很多,下面是我感受比較深的幾點:
文檔:Lua 官方提供了非常豐富的文檔。經過我這幾天的了解,我甚至覺得 Lua 很適合作為學習編程的第一門語言。
小巧:Lua 是 C語言寫的,5.4.4版本大約 3 萬行代碼,編譯后算上標準庫才 281K,對嵌入式平臺很友好。
簡潔:Lua 的語法簡單明了,自由度高。有經驗的 C 語言開發(fā)者大概 1 天就可以用 Lua 寫程序了。
高效:相對于其他腳本語言而言,as fast as Lua。易移植:無依賴,在 PC / 嵌入式 、Windows / Unix 平臺上都很容易編譯,在我的筆記本上幾秒鐘就編譯完了。
強大:支持過程式編程、面向對象編程、函數式編程、數據驅動編程。
Lua 設計中的一個基本概念是為實現(xiàn)特性提供元機制,而不是直接在語言中提供大量特性。例如,雖然 Lua 不是純粹的面向對象語言,但它提供了用于實現(xiàn)類和繼承的元機制。和其他類似的語言進行比較:
Lua 怎么學?
下面我感覺比較好的學習資料,按照我學習的先后順序進行排列。Lua 快速入門:https://github.com/PacktPublishing/Lua-Quick-Start-Guide這是《Lua Quick Start Guide》一書的配套源碼。
這本書比較淺現(xiàn)易懂,適合快速體驗 Lua 這門語言。我快速地瀏覽了一遍書的大體內容,然后直接看源碼,遇到不懂的地方再回頭看書。比較難的地方是第三章末尾的 metatable 相關的內容,metatable 可能是 Lua 的精髓。http://lua-users.org/wiki/Lua 的官方 wiki,絕佳的學習資料,里面除了有 Lua 入門和進階文章,還有大量示例代碼,理論和實踐兩手抓,是 Lua 進階的最好選擇。
Lua 進階教程:https://github.com/LewisJEllis/awesome-luaLua 入門后,我們就可以去找一些高質量、認可度比較高的項目來學習了。這個倉庫里收集了許多優(yōu)秀的 Lua 開源項目,找?guī)讉€自己感興趣的項目,研讀其代碼并不斷地編碼,足夠讓我們成為一個合格的 Lua 開發(fā)者了。
Lua 怎么用?
為了更好地感受 Lua 這門語言的用法,下面會舉 4 個不同場景的例子。示例1:文件讀寫
function?SaveCharacterData(name,?power,?team) ????file?=?io.open("data.txt",?"w") ????file:write("name?"?..?name?..?"n") ????file:write("attack?",?power,?"n") ????file:write("team?"?..?team,?"n") ????file:close() end --?Write?data SaveCharacterData("gwen",?20,?"blue") --?Read?data file?=?io.open("data.txt") lines?=?file:lines() print("Contents?of?file:"); for?line?in?lines?do ????print("t"?..?line) end file:close()
上面的代碼演示了最簡單的文件讀寫。
示例2:控制硬件https://github.com/vsergeev/lua-peripherylua-periphery 是一個庫,用于在 Linux 的用戶空間中訪問 GPIO、LED、PWM、SPI、I2C、MMIO 等接口。
local?GPIO?=?require('periphery').GPIO --?Open?GPIO?/dev/gpiochip0?line?10?with?input?direction local?gpio_in?=?GPIO("/dev/gpiochip0",?10,?"in") --?Open?GPIO?/dev/gpiochip0?line?12?with?output?direction local?gpio_out?=?GPIO("/dev/gpiochip0",?12,?"out") local?value?=?gpio_in:read() gpio_out:write(not?value) gpio_in:close() gpio_out:close()
Lua 是 C 語言編寫的,除了標準庫之外,還有大量的第三方庫。lua-periphery 60%的代碼是 C,C 負責硬件的訪問。另外的 40% 的示例代碼是 Lua 寫的。如果你想了解如何用 C 來擴展 Lua,看這個開源項目就夠了。
示例3:網絡服務https://github.com/lunarmodules/copas
local?copas?=?require("copas") local?socket?=?require("socket") local?function?echoHandler(skt) ????skt?=?copas.wrap(skt) ????while?true?do ????????local?data?=?skt:receive() ????????if?not?data?or?data?==?"quit"?then ????????????break ????????end ????????skt:send(data) ????end end local?server?=?socket.bind("localhost",?20000) copas.addserver(server,?echoHandler) copas.loop()
上面的代碼演示了如何用網絡庫 copas 搭建一個 TCP echo server。
示例4:游戲開發(fā)https://github.com/love2d/lovelove2d 是為 Lua 而寫的 2D 游戲引擎,市面上有不少商業(yè) 2D 游戲是基于 love2d 開發(fā)的。
我們簡單看下 love2d 的用法。
--?function?called?at?start?of?game?to?load?assets function?love.load() ????love.graphics.setDefaultFilter('nearest',?'nearest') ????sprite?=?love.graphics.newImage('graphics/mario.png') ????x?=?virtualWidth?/?2?-?sprite:getWidth()?/?2 ????y?=?virtualHeight?/?2?-?sprite:getHeight()?/?2 ????push:setupScreen(virtualWidth,?virtualHeight,?640,?480,?{ ????????fullscreen?=?false ????}) end --?function?called?every?frame?with?the?delta?(dt)?since?last?frame function?love.update(dt) end --?a?callback?function?called?whenever?we?press?a?key function?love.keypressed(key) ????if?key?==?'left'?then ????????x?=?x?-?speed ????end ????if?key?==?'right'?then ????????x?=?x?+?speed ????end ????[...] end --?a?function?called?each?frame?meant?to?render?things?to?the?screen function?love.draw() ????push:apply('start') ????love.graphics.draw(sprite,?x,?y) ????push:apply('end') end
上面的代碼實現(xiàn)了通過方向鍵控制瑪麗奧的功能,基于這個框架,最終我們可以很輕松地實現(xiàn)超級瑪麗的核心功能,效果如下:
總結
Lua 具有小巧、簡潔、高效、強大、文檔豐富等優(yōu)點,如同一把瑞士軍刀,非常適合嵌入式 Linux 平臺的底層開發(fā),是嵌入式開發(fā)的利器。人生苦短,一起試下用 Lua 唄。
—— The End ——