加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • Lua 是什么?
    • Lua 怎么學(xué)?
    • Lua 怎么用?
    • 總結(jié)
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

Lua 教程 | 第一次接觸 Lua 的感受:相見恨晚!

2022/05/19
2857
閱讀需 12 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

我是老吳,一個愛學(xué)習(xí)的,嵌入式 Linux 驅(qū)動工程師。關(guān)注我,一起變得更加優(yōu)秀吧!

哈嘍,老吳這幾天都在了解 Lua 這門腳本語言,感覺它太適合我這種懶人了,下面記錄一下學(xué)習(xí)心得。

Lua 是什么?

Lua 是一門腳本語言,和 Shell、Python 是同一種類型。

https://www.lua.org/about.html

 

Lua 的優(yōu)點很多,下面是我感受比較深的幾點:

文檔:Lua 官方提供了非常豐富的文檔。經(jīng)過我這幾天的了解,我甚至覺得 Lua 很適合作為學(xué)習(xí)編程的第一門語言。

小巧:Lua 是 C語言寫的,5.4.4版本大約 3 萬行代碼,編譯后算上標(biāo)準(zhǔn)庫才 281K,對嵌入式平臺很友好。

簡潔:Lua 的語法簡單明了,自由度高。有經(jīng)驗的 C 語言開發(fā)者大概 1 天就可以用 Lua 寫程序了。

高效:相對于其他腳本語言而言,as fast as Lua。易移植:無依賴,在 PC / 嵌入式 、Windows / Unix 平臺上都很容易編譯,在我的筆記本上幾秒鐘就編譯完了。

強大:支持過程式編程、面向?qū)ο缶幊獭⒑瘮?shù)式編程、數(shù)據(jù)驅(qū)動編程。

Lua 設(shè)計中的一個基本概念是為實現(xiàn)特性提供元機制,而不是直接在語言中提供大量特性。例如,雖然 Lua 不是純粹的面向?qū)ο笳Z言,但它提供了用于實現(xiàn)類和繼承的元機制。和其他類似的語言進行比較:

Lua 怎么學(xué)?

下面我感覺比較好的學(xué)習(xí)資料,按照我學(xué)習(xí)的先后順序進行排列。Lua 快速入門:https://github.com/PacktPublishing/Lua-Quick-Start-Guide這是《Lua Quick Start Guide》一書的配套源碼。

這本書比較淺現(xiàn)易懂,適合快速體驗 Lua 這門語言。我快速地瀏覽了一遍書的大體內(nèi)容,然后直接看源碼,遇到不懂的地方再回頭看書。比較難的地方是第三章末尾的 metatable 相關(guān)的內(nèi)容,metatable 可能是 Lua 的精髓。http://lua-users.org/wiki/Lua 的官方 wiki,絕佳的學(xué)習(xí)資料,里面除了有 Lua 入門和進階文章,還有大量示例代碼,理論和實踐兩手抓,是 Lua 進階的最好選擇。

Lua 進階教程:https://github.com/LewisJEllis/awesome-luaLua 入門后,我們就可以去找一些高質(zhì)量、認可度比較高的項目來學(xué)習(xí)了。這個倉庫里收集了許多優(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、PWMSPI、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 語言編寫的,除了標(biāo)準(zhǔn)庫之外,還有大量的第三方庫。lua-periphery 60%的代碼是 C,C 負責(zé)硬件的訪問。另外的 40% 的示例代碼是 Lua 寫的。如果你想了解如何用 C 來擴展 Lua,看這個開源項目就夠了。

示例3:網(wǎng)絡(luò)服務(wù)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()

上面的代碼演示了如何用網(wǎng)絡(luò)庫 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)超級瑪麗的核心功能,效果如下:

總結(jié)

Lua 具有小巧、簡潔、高效、強大、文檔豐富等優(yōu)點,如同一把瑞士軍刀,非常適合嵌入式 Linux 平臺的底層開發(fā),是嵌入式開發(fā)的利器。人生苦短,一起試下用 Lua 唄。

—— The End ——

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
SN65HVD234D 1 Texas Instruments 3.3 V CAN Transceiver with Sleep Mode 8-SOIC -40 to 125

ECAD模型

下載ECAD模型
$3.95 查看
NCV7321D12R2G 1 onsemi LIN Transceiver, Stand-alone ESD Improved, 3000-REEL
$1.11 查看
CY62167EV30LL-45ZXI 1 Cypress Semiconductor Standard SRAM, 1MX16, 45ns, CMOS, PDSO48, TSOP1-48
$69.33 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜