Lua 是怎樣一門語言?

記得在豆瓣看到有人說喜歡 Lua 是因為她像 Javascript,

後來我就看到了 MoonScript 模仿 CoffeeScript 出現了。

然後我在張開川大俠的 Ruby 教程裡面看到了圖片,

見:http://lionel.bokee.com/inc/language.tree.JPG

這時的 Lua 放在個 Ruby Python 一類位置,這種感覺。

那麼 Lua 有內些神奇之處和意義呢?


lua 就像一個語言模版,當你的應用需要發明一個自創語言提供給用戶時,它很可能成為你的選擇。

但是它只是個模版,你需要有補足內容的能力。


Lua 是一門非常之小,但五臟俱全的動態語言。它由 Roberto Ierusalimschy、Luiz Henrique de Figueiredo 和 Waldemar Celes在1993年創建。Lua 擁有一組精簡的強大特性,以及容易使用的 C API ,這使得它易於嵌入與擴展來表達特定領域的概念。Lua在專有軟體界聲名顯赫。例如,在諸多遊戲中,比如 Blizzard(暴雪)公司的《魔獸世界》和 Crytek GmbH 公司的《孤島危機》,還有 Adobe 的 Photoshop Lightroom ,都使用它來作腳本 和 UI 方面的工作。它繼承了 Lisp 和 Scheme,或許還有 AWK 的血脈 ; 在設計上類似於 JavaScript、Icon 和 Tcl。

來看看Lua的創始人是怎麼說的吧!

你是如何定義 Lua 的?

Luiz Henrique de Figueiredo:一種可嵌入,輕量,快速,功能強大的腳本語言。

Roberto Ierusalimschy:不幸的是,越來越多的人們使用「腳本語言」作為「動態語言」的代名詞。現在,甚至是 Erlang 或者 Scheme 都被稱為腳本語言。這非常糟糕,因為我們無法精確的描述一類特定的動態語言。在最初的含義解釋中,Lua 是一種腳本語言,這種語言通常用來控制其它語言編寫的其他組件。

人們在使用Lua設計軟體時,應該注意些什麼呢?

Luiz:我想應該是用 Lua 的方式來做事。不建議去模擬出所有你在其它語言中用到的東西。你應該真的去用這個語言提供的特性,我想對於使用任何一門語言都是這樣的。就 Lua 來講,語言的特性主要指用 table 表示所有的東西,用 metamethod 做出優雅的解決方案。還有 coroutine 。

Lua 的用戶應該是哪些人呢?

Roberto :我認為大多數沒有腳本功能的應用程序都能從 Lua 中受益。

Luiz:問題在於,大多數設計者很長時間都不會意識到有這種需求。當已經有了諸多用 C 或 C++ 編寫的代碼,為時已晚。應用程序設計者應該從一開始就考慮腳本。這會給它們帶來更多的靈活性。而且這樣做還可以更好的把握性能問題。因為這樣做以後,會迫使他們去考慮程序中到底哪裡是性能關鍵,而哪些地方無傷大雅。而這些性能不太重要之處,就交給腳本去處理,開發周期短,速度快。

從安全性的觀點來看,Lua 能為程序員提供些什麼呢?

Roberto:Lua 解釋器的核心部分被構建為一個 「獨立的應用程序(freestanding application)」。這個術語來自 ISO C,大意是說,這部分不使用任何跟外部環境有關的東西(不依賴 stdio、malloc 等)。所有那些功能都由擴展庫來提供。使用這種體系結構,很容易讓程序限制對外部資源的訪問。具體來說,我們可以在 Lua 自身的內部創建出一個沙盒,把如何我們認為危險的操作從沙盒的外部環境中剔除。(比如打開文件等)

Luiz:Lua 還提供了用戶自定義的調試鉤子,用它可以監視 Lua 程序的執行。這樣,在 lua 中運行時間過長或是使用了過多內存的時候,我們可以從外部中斷它的執行。

對於你做的這些,你如何定義成功?

Luiz:一種語言的成功,取決於使用該語言的程序員數量以及使用它的應用程序的成功。其實,到底有多少人在使用 Lua 編程,我們並沒有確切的答案,不過毫無疑問的是,有很多成功使用 Lua 的應用程序,其中包括一些非常成功的遊戲。同樣地,使用 Lua 的應用程序的範圍,從桌面圖像處理到嵌入式機器人控制。這表明 Lua 具有一個非常明確的小眾市場。最後,Lua 是唯一一種由發展中國家創建並在全球獲得廣泛應用的語言。它也是 ACM HOPL 唯一重點推介的語言。

Roberto:這很難定義。我曾經在多個領域工作過,在每個領域我從不同的方式在感受了成功。總之,我想說這些的共通之處在於:「被人知曉」。被認可,被公認,被人們推薦,這些都讓人非常開心。

以上答案全部引用自雲風的博文:《採訪 Lua 發明人的一篇文章》。

如有不妥之處請指出。

更多詳情請見:雲風的 BLOG: 採訪 Lua 發明人的一篇文章


說說Lua。
作為一個遊戲開發者,我對Lua非常熟悉。
Lua有很多亮點,下面這幾個,最值得說一說。

--
Lua非常「小」。
--

有多小?

源碼包只有200多KB:

二進位包也只有200KB左右:

帶有豐富示例的完整語法描述,列印成A4紙不到20頁。(是的我打過~手動哭笑不得)

Lua:小就是美,對不對,對不對嘛?

--
Lua性能高。
--

在解釋型語言中,Lua是性能很高的。在遊戲領域,Lua常常被拿來和JS做對比。
JS比Lua的好處是,瀏覽器也可以運行。
但是Lua比JS的好處是,性能高,而且語言簡單,容易上手。
LuaJIT還可以執行編譯後的Lua位元組碼,速度更快。
參見這裡的討論: Cocos2dx+lua合適還是Cocos2dx+js合適? - JavaScript - 知乎

--
Lua不限制編程範式。

--

很多語言對類提供了語言一級的支持,Lua並沒有這麼做。
Lua是基於原型的語言(prototype-based language)。在Lua里非常容易地模擬面向對象。

這裡安利一下我以前寫的lua-oop: dingshukai/lua-oop
一個面向對象編程的lua框架,支持多繼承,性能棒棒噠,在多個線上遊戲中使用。
我本人非常喜歡基於組件的編程,這個說起來又是一個長篇(贊多的話可以考慮寫一寫。。。),我在lua中實現組件編程的方式就是多繼承。非常好用!
另外,在寫這個框架之前,我使用過lua官方網站推薦的幾個面向對象庫,基本都是玩具級的,在複雜使用環境下,性能瓶頸大。
所以,就寫了這麼一個框架,遊戲開發狗可以試試。

--
Table是Lua里最基本的、最常用的、幾乎唯一的、幾乎萬能的數據結構。
--

這麼神奇的數據結構,到底怎麼構造的?

簡單來說,Table是數組+哈希表。

下面是隨手寫的示例代碼:

看到前面有同學提到了PHP的Array。

看到前面有同學提到了PHP的Array。

這裡強調一下,Lua的Table和PHP的Array相比,表達能力差不多,但是性能更好,因為存儲結構不同。

Lua的Table,是·真·數組+·真·哈希,即以數組方式寫的元素放在數組裡,以key-value方式寫的元素,放在哈希表中。這個哈希表是無序的。

PHP的Array,官方文檔有提到:

PHP的Array是有序關聯數組,針對不同的使用情況做了優化。因為是有序的,必然不如hash快。

PHP的Array是有序關聯數組,針對不同的使用情況做了優化。因為是有序的,必然不如hash快。

最後,貼一段我以前遊戲里的UI布局文件,模仿CSS,支持自定義控制項,屏幕自適應,開發UI效率奇高無比。整個都是以Table寫成的。

-- Lua中的注釋是以兩個減號開頭的。

我的公眾號dingshukai666,教編程,歡迎關注~

http://weixin.qq.com/r/yzhMVE3EShA1rQk3923Z (二維碼自動識別)


Lua 是一門 sophisticatedly simple 的語言。

目前我見到的對 Lua 的最簡潔準確的描述來自一段轉述 [1] [2]:

Lua is an elegant, easy-to-learn language with a mostly procedural syntax, featuring automatic memory management, full lexical scoping, closures, iterators, coroutines, proper tail calls, and extremely practical data-handling using associative arrays.

但這段描述「忽略」了 Lua 最重要的兩個因素:Extensible 和 Embed-able。不過這裡的忽略是加引號的。因為:第一、這兩個因素如此明顯,以至於 Hirschi 為了簡潔的介紹語言本身的特性而認為根本不必提。第二、如果你是給像 Adobe Lightroom 那樣選擇架構,那麼 Lua 的這兩個特性當然是要銘記於心。如果你是給 WOW 或者 Nginx+Lua 做開發,那麼 Lua 語言本身的特性更適合上面這句描述。

所以,暫且不談 Lua 著名的 Extensibility/Embed-ability,只說語言本身。我認為 Lua 達到了高級動態語言的最佳平衡。

在另一篇答案中 [3] 我回答了高級動態語言的度量。目前來看,Lisp 可以被認為是高級動態語言功能的「全集」,其它語言都或多或少有所裁減。Lua 只裁減了兩個功能:宏和 Full-continuation。另一方面,Lua 提供了非常強也非常快的 load,也不能說沒有 code-as-data。Lua 沒有 full-continuation,不過實現了 coroutine 可以認為是 one-shot semi-continuation。注意不是所有的號稱 coroutine 的機制都能叫做 one-shot semi-continuation。Lua 實現的是 full asymmetric coroutine。其能力參見 [6]。最近分析了 Lua 的 coroutine 實現 [4] [5],我認為對 extensible/embedded 語言的 continuation 的把握,即使是提供號稱 full-continuation 的各種 Lisp 實現也未必能及。

注釋:

  1. Hirschi, A. 2007. Traveling light, the Lua way. IEEE Software 24(5)(September/ October) 。
  2. 轉述自 Takhteyev, Yuri (2012-09-27). Coding Places (Acting with Technology) MIT Press.
  3. Objective-C是動態語言嗎?為什麼?
  4. Programming in Lua(五)

  5. Programming in Lua(三)
  6. Revisiting Coroutines, PUC-RioInf.MCC15/04 June, 2004, Ana Lu ?cia de Moura and Roberto Ierusalimschy


Lua天生的定位就是做為一門"膠水語言"出現的.它沒有自己獨立的環境,必須依附在宿主語言的環境中才能起作用.所以從一開始,Lua就非常清楚自己的定位:它不想自己做大,而是做的夠精簡夠小,嵌入在宿主語言中,幫忙提供一些動態特性.

明白了這一點,就明白了Lua的許多設計思路--小,自提供庫少,天生的膠水語言---因此任何CC++能出現的地方,Lua就能輕鬆的嵌入其中.除了CC++之外,其他語言也開始意識到了Lua的價值,開始支持它了.obj-C,as等.


Javascript一般只被集成在瀏覽器中

LUA基本可以被各種平台使用

另外LUA中也可以使用該平台的類庫,即可以反向引用


Lua的一個神奇的地方啊就在於它很小巧,小巧到可以嵌入到其他任何語言中使用。就讓我們把它稱為「外掛語言」吧。

可以用它來為其他非腳本語言提供更靈活的動態特性吧,或者用來寫配置文件,或者寫界面,或者做插件腳本啊什麼的。


我用一句話來概括, "小身材, 大味道"


這種問題看維基百科就可以了。

Lua 好像主要用作配置文件,比如 Awesome 窗口管理器、SciTE 文本編輯器。Vim 現在也支持 Lua 了。


lua 就是填平了無數坑卻又挖了一個坑(字元串沒用 unicode)的 javascript。


lua的神奇之處就是,下標從1開始


感覺沒人答到點子上。元編程你懂嗎?lua相當於一個造了一半的編程語言,剩下的一半你自己造。幫你造了那部分容易出錯的。剩下的你要面向對象,還是函數式編程;單重繼承還是多重繼承...都可以自己改造。你有多高水平就可以玩出多少花樣。


這樣說吧,lua+Xml 可以搞定絕大部分項目的配置以及頻繁變動的業務需求


我覺得lua非常適合作為別的程序的插件開發和功能擴展,比如redis,openresty,heka,wrk,wireshark等。

多看看這些程序是怎麼用lua的,應該會體會到lua的神奇之處。


在遊戲開發領域,Lua是最好的腳步語言選擇,簡潔,性能足夠用,支持熱更新


lua和Python都用過,不精深,自我感覺只是寫輔助工作的小工具的話,Python真的特別好使。lua嵌入程序中比Python簡單,依賴也小。


語言本身小,嵌入到其他程序不用擔心size問題。比配置文件更靈活,比c或者c++更簡單。用來寫腳本邏輯更多。


一開始不少人都覺得 lua 很靈活,設計的很清晰,甚至幾小時入門

但後來發現 lua 越來越不適合互聯網環境和各種業務,最主要的問題是出現在數組和 json 上

比如 lua 中分不出

{}, []

導致 table 在轉成 json 的時候還需要通過外部設置來處理

在數組中如果中間有 nil,luajit 和 lua 的結果也會不同,如果不了解 lua 的數組是關聯數組(associative arrays) 的話,很多人都會踩這個坑

很多東西也需要自己封裝,基礎函數缺失,包管理困難,總得來說 Lua 做膠水語言是合格的,但和 Javascript 比還差了點

如果你的項目同時支持 Javascript 或者 Lua,聽我一句請選擇 Javascript


具體的概念什麼我也不太清楚,但我之前修改和做魔獸世界插件是用這個,其他一些遊戲也用LUA做插件的。


推薦閱讀:

熟練使用小工具讓自己從機械工作中解脫

TAG:編程語言 | 腳本語言 | Lua |