關(guān)于Lua語言的概述

關(guān)于Lua語言的概述

    @作者:evandrolg, 翻譯:cloudfeng

我在2013年的時(shí)候才是玩Lua,是受到一個(gè)使用Lua有段時(shí)間,并且告訴我關(guān)于它好玩的事情的朋友影響。在那時(shí),我已經(jīng)有幾年的編程的經(jīng)驗(yàn)了,我已經(jīng)與不同的語言模式都打過交道,比如Python、Ruby、JavaScript、Shell、C#和Java,并且使用它們有一定程度的專家水平。

從那以后,我使用經(jīng)常使用Lua編程,并且在一定程度上把Lua當(dāng)作工作之外最喜歡的語言來做開發(fā)。此外,我在周末的時(shí)間做了一個(gè)小應(yīng)用程序:Pegasus.lua,在空余時(shí)間開發(fā)了以開源的http服務(wù)器,它完全是用Lua編寫的。

我不具備Lua開發(fā)者社區(qū)所具備的傳統(tǒng)技能。我只是一個(gè)web開發(fā)人員,主要是把Lua作為C/C++應(yīng)用的嵌入腳本語言。而Lua開發(fā)者社區(qū)的焦點(diǎn)是因?yàn)長ua作為一種高層次的語言,它具有快速、輕量級(jí)的解釋器(Lua的解釋器大小小于200kB?。?,而不像其他的動(dòng)態(tài)語言,比如Python和Ruby。

Lua語言中最讓我關(guān)注是它的簡(jiǎn)單性。Lua的語法極其友好并且有一個(gè)干凈的核心,具有編程經(jīng)驗(yàn)的人(特別是對(duì)解釋型語言有一定了解的人),能夠在幾分鐘之內(nèi)就能掌握Lua語言。實(shí)際上,我認(rèn)為Lua是我學(xué)習(xí)編程語言中最為簡(jiǎn)單的一種語言,主要是因?yàn)長ua沒有復(fù)雜的語法,而且我有JavaScript編程工作經(jīng)歷(是的,Lua與JavaScript十分相似,但是這就是它的優(yōu)點(diǎn)?。?/p>

下面列出Lua的優(yōu)點(diǎn)和缺點(diǎn)是我在使用Lua所發(fā)現(xiàn)的:

優(yōu)勢(shì):

  • Lua實(shí)際上有8種類型:nil,string(字符串),number(數(shù)值類型),function(函數(shù)),boolean(布爾類型),thread(線程), userdata(用戶類型)和table(表) (表是此語言中最牛的魔術(shù))

  • 在Lua中你不能通過類實(shí)現(xiàn)面向?qū)ο缶幊?,但是可以像Self,JavaScript和Io一樣通過原型實(shí)現(xiàn)面向?qū)ο蠹夹g(shù)。

  • 元表是一個(gè)很棒的主意!盡管剛開始的時(shí)候我對(duì)它感到十分困惑,但是員表的概念在Lua中是十分棒的。它是一種顯示的技術(shù)實(shí)現(xiàn)操作符的重載,同時(shí)也可以擴(kuò)展對(duì)象(表)的屬性。

  • 在Lua中,函數(shù)是第一類值,與JavaScript十分相似。這意味著,Lua允許程序員可以把函數(shù)做為函數(shù)的參數(shù)、可以把它聲明為變量、可以把它存在數(shù)據(jù)結(jié)構(gòu)中,在JavaScript中對(duì)函數(shù)的操作都可以應(yīng)用到Lua中。我最為喜歡Lua中對(duì)函數(shù)如此方便操作。

  • 支持閉包;

  • 你可以通過return語句來導(dǎo)出模塊。Ok,詳細(xì)的說,當(dāng)我第一眼看到Lua的這種語法的時(shí)候,我感覺到特別的自然。

  • 支持協(xié)同程序

  • Lua解釋器相比于其他動(dòng)態(tài)類型語言,比如PHP、Python、Ruby,甚至Node.js都要快。

  • 簡(jiǎn)單的實(shí)現(xiàn)元編程技術(shù)(ok,它是一種動(dòng)態(tài)語言...)

  • 盡管Lua已經(jīng)減少了核心特性的數(shù)目,但是它允許程序員使用簡(jiǎn)單的方式擴(kuò)展語言的特性,比如:

  • LuaJIT 是目前動(dòng)態(tài)語言中最快的即時(shí)編譯器之一。

缺陷:

  • 缺少debug工具的支持。我知道很多程序員并不使用debug工具,但是我真喜歡此類工具并且我一直通過print方式來debug我的代碼。

  • Lua沒有傳統(tǒng)的錯(cuò)誤處理方式,比如try,catchfinally。事實(shí)上,你可以用pcall函數(shù)來處理錯(cuò)誤,但是我認(rèn)為這種方式不是十分自然。每次我需要處理錯(cuò)誤的時(shí)候,我經(jīng)常使用下面try-catch方案

-- try-catch.lua
function catch(what)
    return what[1]
end

function try(what)
    status, result = pcall(what[1])
    if not status then
        what[2](result)
    end
    return result
end
require "try-catch"
try {
    function()
        error('oops')
    end,
    catch {
        function(error)
            print('caught error: ' .. error)
        end
    }
}
  • Lua 不支持三目條件運(yùn)算符。我認(rèn)為它并不是語言中很重要的特性,但是我必須承認(rèn)我確實(shí)喜歡它,比如我需要某些簡(jiǎn)短的檢測(cè)存儲(chǔ)在變量中的值??梢园阉鳛楦郊拥奶匦?,你可以創(chuàng)建相關(guān)的函數(shù)來擴(kuò)展三元條件運(yùn)算符。

可以直接使用 (cond and false-value or x),條件是cond必須為真才行。所以可以創(chuàng)建一個(gè)函數(shù)來實(shí)現(xiàn)?:運(yùn)算符

-- T 和 F必須可以求值的
function ternary(cond, T, F)
    if cond then 
        return T 
    else 
        return F
    end
end

print("blah: " .. ternay(a == true, "blah", "nahblah"))

一種更為廣泛的方式是使用函數(shù)作為參數(shù)

function ternay (cond, T, F, ...)
    if cond then
        return T(...)
    else
        return F(...)
    end
end
print("blah: " .. ternary(a == true ,function() return "blah" end ,function() return "nahblah" end))
  • 在社區(qū)中沒有提供足夠的庫來解決編程領(lǐng)域中的常見問題。可以是這個(gè)社區(qū)的特征吧(在大的項(xiàng)目中打發(fā)小的解決方案,但是并不會(huì)將其開源)或表明Lua并不是很流行的語言。我碰到很多難題,比如找到一個(gè)可靠的XML解析庫(我已經(jīng)找到一個(gè)很好的XML庫,但是它不是很流行。)

我所列出的Lua的缺陷是可以理解,畢竟Lua專注于一個(gè)輕、快的解釋器。Lua的優(yōu)勢(shì)可以彌補(bǔ)其缺陷,是因?yàn)樗峁┝艘环N簡(jiǎn)單的方式來擴(kuò)展該語言的核心特性。

Lua作為其他編程工具,并非是“銀彈”。比如我并不認(rèn)為它是web核心應(yīng)用的理想工具。不僅是因?yàn)樗陨淼南拗疲乙瞱eb環(huán)境中缺少成熟的項(xiàng)目來解決比較常見的問題--連接數(shù)據(jù)庫、緩存工具、MVC,等等。對(duì)于這些問題,Python和Ruby社區(qū)都提供成熟的庫和框架以及廣泛的測(cè)試。

然而,因?yàn)長ua是高層次的語言并且在動(dòng)態(tài)語言中有一個(gè)最快的解釋器,它可以作為應(yīng)用中出現(xiàn)語言性能問題比較好的選擇,比如通信、游戲、那些內(nèi)存受限的嵌入式應(yīng)用。

來源:
https://medium.com/@evandrolg/lua-a-general-view-and-personal-about-the-language-2744aa5665cb#.wo5a96a66

注意:本文遵守MIT 條款

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,322評(píng)論 0 17
  • 第一篇 語言 第0章 序言 Lua僅讓你用少量的代碼解決關(guān)鍵問題。 Lua所提供的機(jī)制是C不擅長的:高級(jí)語言,動(dòng)態(tài)...
    testfor閱讀 2,936評(píng)論 1 7
  • 1. 寫在前面 很多時(shí)候我們都需要借助一些腳本語言來為我們實(shí)現(xiàn)一些動(dòng)態(tài)的配置,那么就會(huì)涉及到如何讓腳本語言跟原生語...
    杰嗒嗒的阿杰閱讀 3,500評(píng)論 9 31
  • 本文把程序員所需掌握的關(guān)鍵知識(shí)總結(jié)為三大類19個(gè)關(guān)鍵概念,然后給出了掌握每個(gè)關(guān)鍵概念所需的入門書籍,必讀書籍,以及...
    dle_oxio閱讀 11,384評(píng)論 6 244
  • 以前大概不愛看書 愛看電視 捧著電視機(jī)度過一天又一年 廣告也被啃完 然后漫無目的地搬著凳子坐在天臺(tái)上面發(fā)呆 一秒又...
    思索_BeautyLin閱讀 326評(píng)論 0 2

友情鏈接更多精彩內(nèi)容