成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Lua:只有少數(shù)程序員知道的最簡(jiǎn)單、功能齊全的語(yǔ)言

開發(fā) 前端
Lua 是一種被低估的語(yǔ)言,只有游戲開發(fā)者才知道。然而,它有潛力發(fā)展成為一種最小的動(dòng)態(tài)類型腳本語(yǔ)言,并與 Python 和 Ruby 競(jìng)爭(zhēng)。任何人都可以在幾分鐘內(nèi)學(xué)會(huì) Lua,因?yàn)樗怯惺芬詠?lái)最簡(jiǎn)單、功能齊全的編程語(yǔ)言!

創(chuàng)建一種簡(jiǎn)單易學(xué)的解釋型編程語(yǔ)言并非難事。我們只需根據(jù)簡(jiǎn)單的語(yǔ)言規(guī)范,使用任何喜歡的編程語(yǔ)言編寫一個(gè)解析器和語(yǔ)句運(yùn)行程序。為了提高性能,我們可以使用基于字節(jié)碼的執(zhí)行系統(tǒng),而不是像 Bash 解釋器那樣直接執(zhí)行解析后的源代碼。任何人都可以創(chuàng)造出簡(jiǎn)單易學(xué)的語(yǔ)言,但每一種易學(xué)的語(yǔ)言都不會(huì)成為有用的通用語(yǔ)言。例如,創(chuàng)建一種只支持基本算術(shù)運(yùn)算的簡(jiǎn)單腳本語(yǔ)言,并不會(huì)成為一種人人都能用來(lái)編程的有用語(yǔ)言。

大多數(shù)開發(fā)人員認(rèn)為 Python、Ruby 和 JavaScript 是易于學(xué)習(xí)、簡(jiǎn)單且有用的語(yǔ)言。這些簡(jiǎn)單的語(yǔ)言提供了開發(fā)人員友好、高效、簡(jiǎn)單的語(yǔ)法,激勵(lì)每個(gè)程序員在基于社區(qū)的庫(kù)的幫助下使用它們來(lái)構(gòu)建任何軟件項(xiàng)目。毫無(wú)疑問(wèn),Python 提供了比 JavaScript 語(yǔ)言更簡(jiǎn)單的語(yǔ)法——對(duì)于大多數(shù)程序員來(lái)說(shuō),編寫 Python 代碼就像編寫偽代碼一樣。Python 是有史以來(lái)最簡(jiǎn)單(但有用)的語(yǔ)言嗎?

Lua 是一種動(dòng)態(tài)類型、輕量級(jí)、可嵌入、功能齊全的通用語(yǔ)言,比 Python 更容易學(xué)習(xí)。大多數(shù)游戲開發(fā)人員都知道 Lua 語(yǔ)言,因?yàn)樗鼜V泛用作基于 C/C++ 的游戲引擎中的嵌入式腳本語(yǔ)言。然而,大多數(shù)非游戲開發(fā)者并不了解 Lua——他們?nèi)匀徽J(rèn)為 Python 是世界上最簡(jiǎn)單的語(yǔ)言。在這個(gè)故事中,我們將探索 Lua 提供的簡(jiǎn)單性。

Lua,一種只需幾分鐘即可掌握的語(yǔ)言,而不是幾年

編程語(yǔ)言的學(xué)習(xí)曲線各不相同。有些語(yǔ)言關(guān)鍵字少、語(yǔ)法簡(jiǎn)單、獨(dú)特的核心概念少,因此學(xué)習(xí)起來(lái)比較快。與此同時(shí),如果某些語(yǔ)言引入的獨(dú)特概念超出了傳統(tǒng)的理論編程概念,那么對(duì)于新手來(lái)說(shuō)就會(huì)變得更加復(fù)雜。

Lua 是一種簡(jiǎn)單的語(yǔ)言,您可以使用所擁有的計(jì)算機(jī)科學(xué)知識(shí)來(lái)掌握它 - 您不需要學(xué)習(xí)任何超出核心編程基礎(chǔ)知識(shí)的獨(dú)特語(yǔ)言即可成為 Lua 專家。

Lua 只有 22 個(gè)關(guān)鍵字、8 種數(shù)據(jù)類型和一種可以用來(lái)構(gòu)建任何復(fù)雜結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)。如果你知道如何編寫理論上的偽代碼,你就可以用 Lua 編寫計(jì)算機(jī)程序——編寫 Lua 代碼就像在紙上寫偽代碼一樣:

function fact(n)
    if n == 1 then 
        return 1
    end
    return n * fact(n - 1)
end

print("fact(3) = " .. fact(3))   -- fact(3) = 6
print("fact(5) = " .. fact(5))   -- fact(5) = 120

看看上面的遞歸階乘數(shù)生成程序的簡(jiǎn)單性。它沒有使源代碼變得復(fù)雜的花哨語(yǔ)法——語(yǔ)言語(yǔ)法對(duì)于大多數(shù)開發(fā)人員來(lái)說(shuō)是不言自明的。Lua 定義了一個(gè)帶有 end 關(guān)鍵字的控制塊,類似于經(jīng)典的偽代碼。它使用 .. 進(jìn)行串聯(lián),并使用 -- 作為單行注釋的前綴。

您甚至可以編寫一行 if 塊,如下所示:

function fact(n)
    if n == 1 then return 1 end
    return n * fact(n - 1)
end

Lua 提供了比 Python 更簡(jiǎn)單的數(shù)值 for 循環(huán)語(yǔ)法:

for i = 1, 10 do
    print(i)
end

在幾乎所有情況下,Lua 都致力于通過(guò)保持整體語(yǔ)言的簡(jiǎn)單性來(lái)最佳地重用現(xiàn)有語(yǔ)法,而不引入新語(yǔ)法。看看上面的數(shù)值 for 循環(huán)是如何使用賦值運(yùn)算符的。有些語(yǔ)言看起來(lái)很簡(jiǎn)單,但它們有許多隱藏的概念和語(yǔ)法,因此開發(fā)人員可能需要花費(fèi)數(shù)年時(shí)間來(lái)掌握它們,即使他們可以在幾分鐘內(nèi)開始使用這些語(yǔ)言。

一切都只有一種數(shù)據(jù)結(jié)構(gòu)

現(xiàn)代編程語(yǔ)言通常提供多種預(yù)開發(fā)的數(shù)據(jù)結(jié)構(gòu),如數(shù)組、列表、映射、隊(duì)列、向量、集合等,但我們?cè)诖蠖鄶?shù)程序中只使用少數(shù)幾種數(shù)據(jù)結(jié)構(gòu)。當(dāng)一種特定的編程語(yǔ)言增加了新的數(shù)據(jù)結(jié)構(gòu)時(shí),它可能會(huì)通過(guò)影響語(yǔ)言的最小設(shè)計(jì)來(lái)為每種結(jié)構(gòu)引入一種新的語(yǔ)法,例如,Python 有三種初始化三種數(shù)據(jù)結(jié)構(gòu)的語(yǔ)法:

type([1, 2])                # 
type((2, 5))                # 
type({"a": 10, "b": 20})    #

Lua 僅使用稱為表結(jié)構(gòu)的關(guān)聯(lián)數(shù)組結(jié)構(gòu)來(lái)處理所有事情。它允許用戶僅使用一種基于大括號(hào)的語(yǔ)法來(lái)創(chuàng)建數(shù)組、映射和任何其他內(nèi)容:

local array = {1, 4, 10, 12}
array[1] = 10

print(array[1])                 -- 10 (array index starts from 1 in Lua)

local map = {width = 200, height = 100}
map["width"] = 250
map.width = 350

print(map.width)                -- 350

print(type(array), type(map))   -- table   table

上面的代碼片段創(chuàng)建了帶有表的 array 數(shù)組。當(dāng)我們不使用關(guān)聯(lián)鍵值對(duì)時(shí),表實(shí)例可以作為具有數(shù)字索引的傳統(tǒng)數(shù)組進(jìn)行訪問(wèn)。Lua 允許您使用帶有類似于 C 結(jié)構(gòu)體初始化的賦值運(yùn)算符的表來(lái)創(chuàng)建映射。當(dāng)您使用表結(jié)構(gòu)創(chuàng)建地圖時(shí),您可以使用類似 JavaScript 的屬性訪問(wèn)語(yǔ)法,如上面的 map 變量所示。

上面的代碼片段使用 local 關(guān)鍵字使這些變量成為本地變量,因?yàn)?Lua 是一種詞法范圍的簡(jiǎn)單語(yǔ)言。Lua 擁有有史以來(lái)最簡(jiǎn)單的語(yǔ)法來(lái)獲取數(shù)組的長(zhǎng)度:

print(#{1, 2, 5, 1})      -- 4

local arr = {1, 2}
print(#arr)               -- 2

為現(xiàn)代開發(fā)人員提供友好、高效的環(huán)境

每種極簡(jiǎn)語(yǔ)言都可能無(wú)法為現(xiàn)代開發(fā)人員提供友好、高效的語(yǔ)法和功能。例如,C 語(yǔ)言無(wú)疑是一種只有 32 個(gè)關(guān)鍵字的極簡(jiǎn)語(yǔ)言,但它并沒有為現(xiàn)代開發(fā)人員提供友好、高效的環(huán)境,因?yàn)樗鼪]有映射結(jié)構(gòu)、動(dòng)態(tài)列表、高效的字符串處理方法、自動(dòng)內(nèi)存管理(垃圾回收)、基于 OOP 的功能以及注重生產(chǎn)力的速記功能。

Lua 是一種極簡(jiǎn)語(yǔ)言,但它經(jīng)過(guò)精心設(shè)計(jì),以極簡(jiǎn)的方式滿足開發(fā)人員的每一個(gè)需求。Lua 允許您使用類似 Python 的現(xiàn)代方法迭代數(shù)組和映射:

local vowels = {"a", "e", "i", "o", "u"}
for i, v in ipairs(vowels) do
    print(i, v)
end

print("----")

local scores = {john = 120, david = 80, ann = 120, julia = 52}
for k, v in pairs(scores) do
    print(k, v)
end

上面的Lua代碼片段通過(guò)使用 ipairs() 和 pairs() 全局可迭代函數(shù)打印 vowels 和 scores 結(jié)構(gòu)體的內(nèi)容,如下所示以下預(yù)覽:

圖片圖片

Lua 支持多重賦值和多個(gè)函數(shù)返回值,作為一種對(duì)開發(fā)人員友好的現(xiàn)代語(yǔ)言:

local a, b = 10, 20
print(a, b)        -- 10   20

function getsize()
    return 20, 30
end

local w, h = getsize()
print(w, h)        -- 20    30

Lua 是一種多范式語(yǔ)言,因此它提供了函數(shù)式和面向?qū)ο箫L(fēng)格的功能。例如,它允許您創(chuàng)建 lambda 函數(shù),如下所示:

function exec(func)
    print("Running lambda...")
    func()
end

exec(function() print("Lua") end)   -- Lua
exec(function() end)                -- (empty function)

Lua 不像 C# 或 Java 等大多數(shù)以行業(yè)為中心的編程語(yǔ)言那樣提供那么多內(nèi)置的 OOP 功能,但它提供了類似 Go 的最小類創(chuàng)建,而沒有內(nèi)置的繼承功能:

Rect = {}

function Rect:new(width, height)
    self.width = width
    self.height = height
    return setmetatable({}, {__index = self})
end

function Rect:area()
    return self.width * self.height
end

local rect = Rect:new(100, 50)
print(rect:area())               -- 5000

local square = Rect:new(50, 50)
print(square:area())             -- 2500

在這里,我們使用 Rect 表結(jié)構(gòu)創(chuàng)建了一個(gè)類,并通過(guò) setmetatable() 內(nèi)置函數(shù)和 __index 創(chuàng)建元表,將類屬性和方法附加到表中元方法。您還可以通過(guò)使用元表構(gòu)建原型系統(tǒng)來(lái)實(shí)現(xiàn)繼承。從官方文檔中了解有關(guān)元表的更多信息。

最小但功能強(qiáng)大的標(biāo)準(zhǔn)庫(kù)

Lua 有一個(gè)最小但功能強(qiáng)大的預(yù)導(dǎo)入標(biāo)準(zhǔn)庫(kù),提供數(shù)學(xué)函數(shù)、文件處理、操作系統(tǒng)函數(shù)、非搶占式多線程、調(diào)試、字符串操作、表操作以及與動(dòng)態(tài)鏈接庫(kù)通信的功能。Lua的標(biāo)準(zhǔn)庫(kù)也是多范式的,這意味著,你可以通過(guò)傳遞標(biāo)識(shí)符來(lái)調(diào)用標(biāo)準(zhǔn)庫(kù)函數(shù),也可以將它們作為綁定對(duì)象的方法來(lái)調(diào)用。

例如,請(qǐng)參閱以下示例 Lua 代碼片段如何調(diào)用字符串函數(shù)/方法:

local msg = "Lua"

print(string.lower(msg))     -- lua (Using the functional style)
print(msg:lower())           -- lua (Using the OOP style)

print(string.reverse(msg))   -- auL
print(string.sub(msg, 1, 2)) -- Lu

在標(biāo)準(zhǔn)庫(kù)中 OOP 風(fēng)格的支持下,您可以高效地鏈接字符串方法,如下所示:

local msg = "Hello Lua"

print(msg:sub(7):lower():reverse())   -- aul

Lua 沒有實(shí)現(xiàn) Regex,因?yàn)樗鼤?huì)影響 Lua 嵌入程序的大小和 Lua 參考實(shí)現(xiàn)的復(fù)雜性,因此它提供了一個(gè)輕量級(jí)的類似 Regex 的但最小模式匹配的實(shí)現(xiàn),如以下示例所示:

local productcode = "BL-202 AL-233"

for prefix, num in string.gmatch(productcode, "([A-Z]+)-(%d+)") do
    print(prefix, num) -- BL  202 .. AL 233
end

典型的 Regex 實(shí)現(xiàn)需要編寫 4000 多行代碼,但 Lua 用不到 500 行代碼實(shí)現(xiàn)了自己的類似 Regex 的輕量級(jí)模式匹配解決方案:

圖片圖片

Lua 提供了一種讀取標(biāo)準(zhǔn)輸入流的簡(jiǎn)單方法,因此構(gòu)建 REPL 程序非常高效,如以下示例所示:

local lastname = ""
while 1 do
    io.write("Enter your name: ")
    input = io.read()
    if input == ":exit" then 
        print("Goodbye " .. lastname)
        break 
    end
    
    print(string.format("Hello %s, Welcome", input))
    lastname = input
end

圖片圖片

Lua 中的文件操作確實(shí)也非常高效。看下面讀取并打印 Lua 源文件內(nèi)容的示例:

local file = io.open("main.lua", "rb")
print(file:read("*all"))

Lua還通過(guò) os 模塊導(dǎo)出操作系統(tǒng)級(jí)操作,并提供一種通過(guò) package 模塊調(diào)用動(dòng)態(tài)鏈接庫(kù)函數(shù)的方法。您可以從官方文檔中探索所有可用的 Lua 標(biāo)準(zhǔn)庫(kù)模塊。

不會(huì)讓程序員感到困惑的錯(cuò)誤處理策略

程序員應(yīng)該正確處理程序中的錯(cuò)誤。否則,特定程序可能會(huì)因嚴(yán)重錯(cuò)誤而停止或產(chǎn)生無(wú)效輸出。使用面向 try-catch 的異常是現(xiàn)代軟件開發(fā)行業(yè)中最常用的錯(cuò)誤處理策略。如果使用得當(dāng),使用 try-catch 異常是一個(gè)很好的策略,但異常通常會(huì)使代碼庫(kù)變得復(fù)雜。由于這個(gè)問(wèn)題,Google C++ 代碼風(fēng)格指南不建議使用異常,Golang 也沒有實(shí)現(xiàn)對(duì)使用基于 try-catch 的異常的支持。老式的類似 C 的錯(cuò)誤代碼返回方法是簡(jiǎn)化錯(cuò)誤處理要求的方法。

Lua 不提供類似 Java 的基于 try-catch 的異常,但它提供了類似 Go 的基于錯(cuò)誤代碼的簡(jiǎn)化錯(cuò)誤處理策略,您可以將其用作基于異常的錯(cuò)誤處理方法。

看下面的例子:

function getresult(score)
    if score > 100 then
        error({code = 1002, msg = "Score shouldn't be higher than 100"})
    elseif score >= 50 then
        return 'P'
    else
        return 'F'
    end
end

for _, v in pairs({20, 120, 60}) do
    local ok, res = pcall(getresult, v)
    if ok then
        print("Result: " .. res)
    else
        print(string.format("Error [%s]: %s", res.code, res.msg))
    end
end

默認(rèn)情況下,Lua 會(huì)在錯(cuò)誤時(shí)停止代碼執(zhí)行,因此如果您的程序嘗試對(duì)兩個(gè)包含字母的字符串執(zhí)行算術(shù)運(yùn)算,程序?qū)伋鲥e(cuò)誤并停止。pcall() 全局函數(shù)允許您捕獲這些錯(cuò)誤并通過(guò)在受保護(hù)執(zhí)行模式下執(zhí)行代碼來(lái)繼續(xù)執(zhí)行代碼。

上面的代碼片段通過(guò)在 getresult() 函數(shù)實(shí)現(xiàn)中調(diào)用 error() 全局函數(shù)來(lái)引發(fā)錯(cuò)誤。它通過(guò)使用 pcall() 調(diào)用 getresult() 函數(shù)來(lái)檢查錯(cuò)誤狀態(tài)。因此,上面的代碼片段在屏幕上打印錯(cuò)誤負(fù)載并繼續(xù)執(zhí)行,如下所示:

圖片圖片

使用這種技術(shù),我們可以簡(jiǎn)單地進(jìn)行錯(cuò)誤處理,而不是像其他流行的現(xiàn)代語(yǔ)言那樣使用冗長(zhǎng)的 try-catch 塊。如果拋出錯(cuò)誤, pcall() 函數(shù)會(huì)動(dòng)態(tài)設(shè)置第二個(gè)參數(shù)的錯(cuò)誤表,否則,它會(huì)設(shè)置典型的返回值。

不使用任何特殊關(guān)鍵字的模塊系統(tǒng)

如果您使用過(guò) JavaScript,您就會(huì)知道 JavaScript 模塊系統(tǒng)的復(fù)雜性。早些時(shí)候,Node.js 運(yùn)行時(shí)使用 CommonJs 模塊系統(tǒng)。ECMAScript (ES) 標(biāo)準(zhǔn)引入了創(chuàng)建 JavaScript 模塊的新標(biāo)準(zhǔn),然后 Node.js 開始支持 ES 模塊。因此,每個(gè)模塊系統(tǒng)都有不同的文件擴(kuò)展名,即 .cjs 、 .mjs 、 .cts 等。標(biāo)準(zhǔn) ES 模塊系統(tǒng)添加了三個(gè)新的文件擴(kuò)展名JavaScript 的關(guān)鍵字/特殊標(biāo)識(shí)符:export 、 import 和 as 。類似地,大多數(shù)流行的編程語(yǔ)言為模塊系統(tǒng)保留專用關(guān)鍵字。

Lua的模塊系統(tǒng)僅使用主要的 return 關(guān)鍵字和內(nèi)置的 require() 全局函數(shù)。Lua 的模塊沒有實(shí)現(xiàn)任何保留的全局標(biāo)識(shí)符,如 CommonJs 中的 module —— 它使用內(nèi)置的表結(jié)構(gòu)來(lái)定義模塊,如下例所示:

-- calc.lua
local calc = {}

function calc.add(a, b)
    return a + b;
end

return calc

上面的代碼片段通過(guò)添加 add() 函數(shù)在 calc.lua 文件中定義了一個(gè)名為 calc 的模塊。現(xiàn)在,您可以使用 require() 函數(shù)導(dǎo)入和調(diào)用模塊函數(shù):

-- main.lua
local calc = require("calc")

print(calc.add(10, 2))   -- 12

不涉及花哨的語(yǔ)法,也沒有引入新的專用關(guān)鍵字——這個(gè)最小的模塊系統(tǒng)可以在任何復(fù)雜的 Lua 項(xiàng)目中使用!

結(jié)論

在這個(gè)故事中,我們通過(guò)開發(fā)實(shí)用的 Lua 代碼示例來(lái)探索 Lua 腳本語(yǔ)言的簡(jiǎn)單性。Lua 是一種對(duì)初學(xué)者友好的語(yǔ)言,具有最少的語(yǔ)法、少量的數(shù)據(jù)類型、只有一個(gè)內(nèi)置的數(shù)據(jù)結(jié)構(gòu)和一個(gè)簡(jiǎn)單的標(biāo)準(zhǔn)庫(kù)。它也是一種功能齊全的語(yǔ)言,支持非搶占式多線程,并提供最小但功能齊全的標(biāo)準(zhǔn)庫(kù)。Lua 社區(qū)開發(fā)了一個(gè) JIT 編譯器、一個(gè)托管數(shù)千個(gè)開源模塊的包管理器以及各種 C 庫(kù)的綁定,因此使用 Lua 構(gòu)建生產(chǎn)軟件系統(tǒng)無(wú)疑是可能的。

然而,Lua 是一種被低估的語(yǔ)言,只有游戲開發(fā)者才知道。然而,它有潛力發(fā)展成為一種最小的動(dòng)態(tài)類型腳本語(yǔ)言,并與 Python 和 Ruby 競(jìng)爭(zhēng)。任何人都可以在幾分鐘內(nèi)學(xué)會(huì) Lua,因?yàn)樗怯惺芬詠?lái)最簡(jiǎn)單、功能齊全的編程語(yǔ)言!

原文:https://levelup.gitconnected.com/lua-the-easiest-fully-featured-language-that-only-a-few-programmers-know-97476864bffc

責(zé)任編輯:武曉燕 來(lái)源: 獨(dú)立開發(fā)者張張
相關(guān)推薦

2014-11-26 09:45:48

程序員

2013-11-01 17:24:39

程序員命名

2014-07-30 13:44:57

2015-04-13 14:07:01

程序員100到1的輸出

2016-03-25 11:57:23

Java程序員C++

2010-08-09 13:13:00

Flex程序員

2017-12-04 23:25:24

2013-06-17 11:01:49

程序員離職

2015-12-04 08:49:00

程序員夢(mèng)魘

2011-09-15 09:12:00

程序員蘋果

2015-12-07 10:09:40

程序員噩夢(mèng)

2014-10-15 10:49:27

程序員

2015-06-03 11:15:20

程序員真相

2010-12-30 10:10:06

NetLinux學(xué)習(xí)

2016-12-19 16:55:10

PHP程序員運(yùn)維

2013-12-16 09:36:49

程序員編程語(yǔ)言

2013-12-12 15:59:23

Lua腳本語(yǔ)言

2013-04-28 11:03:41

編程語(yǔ)言程序員私有云

2009-05-13 11:40:19

編程語(yǔ)言開發(fā)語(yǔ)言Perl

2011-05-19 08:19:50

Lisp
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩在线中文 | 欧美日韩一区二区三区在线观看 | 特级丰满少妇一级aaaa爱毛片 | 91国产精品在线 | 国产精品揄拍一区二区 | 又黑又粗又长的欧美一区 | 欧美一级高清片 | 亚洲精品成人在线 | 日韩国产中文字幕 | 国产精彩视频在线观看 | 91在线免费观看网站 | 国产色99 | 亚洲视频一区在线观看 | 色999视频| 天天影视综合 | 美女三区 | 亚洲一区二区三区桃乃木香奈 | 日韩精品一二三 | 午夜免费成人 | 国产精品中文在线 | 亚洲成av人影片在线观看 | 色综合av | 在线成人免费视频 | 国产电影一区二区三区爱妃记 | 91国内视频在线 | 国产黄色大片在线免费观看 | 久久久男人的天堂 | 久久精品99| 一区二区免费在线观看 | 日韩精品1区2区 | 黄免费观看| 欧美男人亚洲天堂 | 97国产在线视频 | 日韩精品久久久久久 | 欧美成人精品一区二区男人看 | 操人网站 | 亚洲免费高清 | 亚洲高清在线 | 99色综合 | 黄片毛片免费观看 | caoporn国产精品免费公开 |