国产久操视频-国产久草视频-国产久热精品-国产久热香蕉在线观看-青青青青娱乐-青青青青在线成人视99

  • 正文
    • Lua 是什么?
    • Lua 怎么學(xué)?
    • Lua 怎么用?
    • 總結(jié)
  • 推薦器件
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

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

2022/05/19
1840
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

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

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

Lua 是什么?

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

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

 

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

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

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

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

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

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

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

Lua 怎么學(xué)?

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

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

Lua 進(jìn)階教程:https://github.com/LewisJEllis/awesome-luaLua 入門后,我們就可以去找一些高質(zhì)量、認(rèn)可度比較高的項(xiàng)目來學(xué)習(xí)了。這個(gè)倉庫里收集了許多優(yōu)秀的 Lua 開源項(xiàng)目,找?guī)讉€(gè)自己感興趣的項(xiàng)目,研讀其代碼并不斷地編碼,足夠讓我們成為一個(gè)合格的 Lua 開發(fā)者了。

Lua 怎么用?

為了更好地感受 Lua 這門語言的用法,下面會(huì)舉 4 個(gè)不同場(chǎng)景的例子。示例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 是一個(gè)庫,用于在 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 語言編寫的,除了標(biāo)準(zhǔn)庫之外,還有大量的第三方庫。lua-periphery 60%的代碼是 C,C 負(fù)責(zé)硬件的訪問。另外的 40% 的示例代碼是 Lua 寫的。如果你想了解如何用 C 來擴(kuò)展 Lua,看這個(gè)開源項(xiàng)目就夠了。

示例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 搭建一個(gè) 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

上面的代碼實(shí)現(xiàn)了通過方向鍵控制瑪麗奧的功能,基于這個(gè)框架,最終我們可以很輕松地實(shí)現(xiàn)超級(jí)瑪麗的核心功能,效果如下:

總結(jié)

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

—— The End ——

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
SN74LV244APWG4 1 Texas Instruments Eight-channel 2-V to 5.5-V buffers with tri-state outputs 20-TSSOP -40 to 125

ECAD模型

下載ECAD模型
暫無數(shù)據(jù) 查看
M95M02-DRMN6TP 1 STMicroelectronics 2 Mbit serial SPI bus EEPROM

ECAD模型

下載ECAD模型
$2.36 查看
TLP185(GB-TPL,E) 1 Toshiba America Electronic Components X36 PB-F PHOTOCOUPLER SMD T&R

ECAD模型

下載ECAD模型
$0.55 查看

相關(guān)推薦

沙田区| 舒城县| 诏安县| 阳原县| 合阳县| 合江县| 夏河县| 改则县| 孝义市| 博客| 分宜县| 太白县| 泰来县| 易门县| 武强县| 中江县| 马鞍山市| 宝兴县| 敦煌市| 扶绥县| 准格尔旗| 东乡县| 同江市| 淳安县| 喜德县| 佛学| 波密县| 丹阳市| 深泽县| 棋牌| 东阿县| 科技| 通化县| 汾阳市| 延安市| 寿宁县| 二连浩特市| 东乌珠穆沁旗| 兰坪| 多伦县| 辽中县|