關于Lua語言的概述

關于Lua語言的概述

    @作者:evandrolg, 翻譯:cloudfeng

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

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

我不具備Lua開發者社區所具備的傳統技能。我只是一個web開發人員,主要是把Lua作為C/C++應用的嵌入腳本語言。而Lua開發者社區的焦點是因為Lua作為一種高層次的語言,它具有快速、輕量級的解釋器(Lua的解釋器大小小于200kB!),而不像其他的動態語言,比如Python和Ruby。

Lua語言中最讓我關注是它的簡單性。Lua的語法極其友好并且有一個干凈的核心,具有編程經驗的人(特別是對解釋型語言有一定了解的人),能夠在幾分鐘之內就能掌握Lua語言。實際上,我認為Lua是我學習編程語言中最為簡單的一種語言,主要是因為Lua沒有復雜的語法,而且我有JavaScript編程工作經歷(是的,Lua與JavaScript十分相似,但是這就是它的優點!)

下面列出Lua的優點和缺點是我在使用Lua所發現的:

優勢:

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

  • 在Lua中你不能通過類實現面向對象編程,但是可以像Self,JavaScript和Io一樣通過原型實現面向對象技術。

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

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

  • 支持閉包;

  • 你可以通過return語句來導出模塊。Ok,詳細的說,當我第一眼看到Lua的這種語法的時候,我感覺到特別的自然。

  • 支持協同程序

  • Lua解釋器相比于其他動態類型語言,比如PHP、Python、Ruby,甚至Node.js都要快。

  • 簡單的實現元編程技術(ok,它是一種動態語言...)

  • 盡管Lua已經減少了核心特性的數目,但是它允許程序員使用簡單的方式擴展語言的特性,比如:

  • LuaJIT 是目前動態語言中最快的即時編譯器之一。

缺陷:

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

  • Lua沒有傳統的錯誤處理方式,比如trycatchfinally。事實上,你可以用pcall函數來處理錯誤,但是我認為這種方式不是十分自然。每次我需要處理錯誤的時候,我經常使用下面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 不支持三目條件運算符。我認為它并不是語言中很重要的特性,但是我必須承認我確實喜歡它,比如我需要某些簡短的檢測存儲在變量中的值。可以把它作為附加的特性,你可以創建相關的函數來擴展三元條件運算符

可以直接使用 (cond and false-value or x),條件是cond必須為真才行。所以可以創建一個函數來實現?:運算符

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

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

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

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))
  • 在社區中沒有提供足夠的庫來解決編程領域中的常見問題。可以是這個社區的特征吧(在大的項目中打發小的解決方案,但是并不會將其開源)或表明Lua并不是很流行的語言。我碰到很多難題,比如找到一個可靠的XML解析庫(我已經找到一個很好的XML庫,但是它不是很流行。)

我所列出的Lua的缺陷是可以理解,畢竟Lua專注于一個輕、快的解釋器。Lua的優勢可以彌補其缺陷,是因為它提供了一種簡單的方式來擴展該語言的核心特性。

Lua作為其他編程工具,并非是“銀彈”。比如我并不認為它是web核心應用的理想工具。不僅是因為它自身的限制,而且也web環境中缺少成熟的項目來解決比較常見的問題--連接數據庫、緩存工具、MVC,等等。對于這些問題,Python和Ruby社區都提供成熟的庫和框架以及廣泛的測試。

然而,因為Lua是高層次的語言并且在動態語言中有一個最快的解釋器,它可以作為應用中出現語言性能問題比較好的選擇,比如通信、游戲、那些內存受限的嵌入式應用。

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

注意:本文遵守MIT 條款

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容

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