Lua作为通用脚本语言?

39

每当我看到Lua,我唯一读到的是“嵌入式非常好”,“速度快”,“轻量级”等等,最常见的是“魔兽世界”或简称“WoW”。

为什么它只限于将整个东西嵌入到另一个应用程序中?为什么不能像Python或Perl一样编写通用脚本呢?

Lua在速度和内存使用等方面表现出色(据我所知是最快的脚本语言),那么为什么我从来没有看到Lua被用作“桌面脚本语言”来自动化任务呢?例如:

  • 重命名一堆文件
  • 从网上下载一些文件
  • 网页抓取

是标准库的缺乏吗?


6
请编写与您问题内容相符的问题标题。如果您的问题标题的直觉答案是“Yes”,但对于您问题正文的直觉答案是“Well,没有人为LUA实现了一个好的独立脚本执行运行程序”,那么问题标题就不太好。这就像有一个标题是“奶牛是神吗?”而问题正文却是“当我喝牛奶时,我感到想呕吐,为什么?”。 - Lasse V. Karlsen
11个回答

40
Lua是一种很酷的语言,轻量级且极快!但问题是:对于你提到的那些任务,性能如此重要吗?你只需编写这些程序一次,并且也只需运行一次。为什么你会如此关心一次性运行的程序的性能呢?
例如:
  1. 花费3小时编写C/C++程序,处理数据一次,程序将需要1小时运行。
  2. 花费30分钟编写Python程序,处理数据一次,程序将需要10小时运行。
如果你选择第一个,你可以节省运行程序的时间,但你需要花费时间来开发程序。
另一方面,如果你选择第二个,你浪费了运行程序的时间,但在程序运行时,你可以做其他事情。比如玩《魔兽世界》,用你的术士杀死怪物!吃我的D.O.T!:P
就是这样!虽然Lua编写起来不难,但Lua的所有内容都被设计为高效。而且,Lua的模块很少,但Python的模块非常多。你不想为了一次性运行的程序移植一个C库到Lua,是吧?相反,选择Python并使用这些模块轻松完成任务可能是一个更好的想法。
FYI: 实际上,我曾经尝试使用Lua进行网页抓取, 但最终我意识到我不必太在意语言的性能。网页抓取的瓶颈不在于语言的性能,而在于 网络I/O、HTML解析和多任务。我所要做的就是确保程序正常运行并找到瓶颈。 最终,我选择了Python而不是Lua。有很多优秀的Python模块;我没有理由自己编写。

根据我的网页抓取经验,我选择使用Twisted作为网络I/O和lxml作为html解析的后端 来编写我的网页抓取程序。我已经写了一篇文章介绍这项技术。

从网站获取数据的最佳选择:Python + Twisted + lxml

希望这对你有所帮助。


5
不错的答案,尽管我在思考你能想出什么疯狂的一次性使用方案,在Python下运行比C慢10倍……大多数这些一次性脚本通常都受限于磁盘。 - TM.
@TM,同意。通常情况下,您可以利用节省的2.5小时来使用更好的算法,最终比C语言运行得更快,更重要的是,您可以更有信心它能够正常工作并且更易于维护。 - Peter Hansen

23
Lua的库比Python少。但请务必看看LuaForge。它有许多有趣的库,如LuaCURL, wxLuagetopt
那么,请访问LuaRocks,这是Lua的包管理系统。通过它,您可以搜索并安装大多数成熟的具有依赖关系的Lua模块。感觉就像RubyGemsaptitude
网站lua-users.org也有很多有趣的资源,例如教程或Lua Wiki
我喜欢Lua不是因为它的速度,而是因为其核心语言的简洁性、灵活性和可扩展性。
话虽如此,对于您提到的任务,我可能会选择使用Python,因为在Python中做这些事情的社区更大。

12

仅仅因为某种程度上它被“推广”为嵌入式脚本引擎的特殊用途语言,并不意味着它局限于此。实际上,WoW 可以同样选择 Python 作为他们的嵌入式脚本语言。


16
我认为Python不是一个很好的选择。在嵌入方面,Lua和Python之间的区别在于,Lua的语义被设计成最小化与其他代码一起工作时出现问题的可能性,而Python通常假设它是控制者。 - Charles Stewart

10

这可能是因为Lua被设计为一种脚本和扩展语言。在官方网站上,它被描述为一种强大、快速、轻巧、可嵌入的脚本语言。虽然你可以编写通用程序(如果我没记错的话,它带有解释器和编译器),但语言设计者主要意图让它作为嵌入式语言使用(因此它是轻量级的)。


9
这是一个社会学问题,而不是编程问题。
我几乎专门使用Lua进行通用脚本编写。但是我不得不编写几百行代码,以便Lua能够更好地与shell配合使用。这包括以下技巧:
- 引用字符串,使其被shell视为一个单词 - 编写函数以捕获命令的输出,就像在shell中使用$(command)一样 - 使用Lua posix库编写函数来遍历文件系统并扩展shell globbing模式
(对于那些感兴趣的人,我已经把代码放在我的 Lua 云盘 中,里面还包含其他一些东西。有趣的东西可能在 osutilos.quoteos.runfos.capture 以及也许是 os.execve 中。通配符匹配在 posixutil.lua 中。它们都使用了 Luiz Henrique de Figuereido 的 Lua Posix 库。)
(对我来说,额外的努力是值得的,因为我可以处理简单的语法和强大的数据结构。但对于其他人来说,更直接的与 shell 的连接可能更受欢迎。)

你有那几百行代码的链接吗? - RyanE

6

显然,缺乏标准库。相比Python、Perl或Ruby,它的知名度较低。


6
最近有一个推动力度,为Windows上的Lua创建一个“电池包含”安装。结果可以在LuaForge的Lua for Windows项目中找到。它包括解释器和大量额外的模块,允许编写有用的脚本和应用程序,可以直接使用。
我知道各种Linux发行版现在都包含Lua和一些模块,未来还会有更多。
邮件列表中也有几个提议中的模块库正在讨论中,但社区尚未确定一个作为“官方”机制的模块库。
我将Lua用作脚本语言和我的典型应用程序的“主”循环,支持一个或多个DLL,其中包含最好以C实现的代码,或者包装现有库或特定项目所需的API函数。与GUI工具包(如IUPwxLua)配合使用,Lua使得编写小到中型GUI应用程序非常愉快。

你更喜欢哪个GUI工具包,IUP还是wxLua? - Jimmy
@Jimmy,就我个人而言,我已经在几个小项目中使用了IUP,并且非常满意。它最大的优点也是它的缺点:它喜欢使用盒子和胶水模型来布局控件,因此很容易指定一个充满控件的对话框,但很难使其布局完全匹配其他具有不同控件组合的对话框。我尝试过wxLua演示文稿,它显然是一个高质量的产品,但我没有个人理由去切换。 - RBerteig

4

缺乏标准库。这是事实。即使只是列出目录中的所有文件,也需要一个非标准模块

虽然这样做有很好的理由(保持严格的ANSI可移植性,不要求POSIX),但对于一般编程来说,我更喜欢Python。


4
Lua被用于TeX扩展LuaTeX中作为嵌入式语言,因此在TeX开发者中迅速走红。它被用作TeX Live分发中某些实用程序的脚本语言,这是因为现在有一个luatex二进制文件,在所有平台上都可用,也可以作为Lua解释器使用(添加了一些重要模块 - slnunicode、luafilesystem等)。这对于先前依赖其他Unix脚本工具(ActivePerl等)的Windows安装非常重要。现在,ConTeXt宏语言广泛使用Lua脚本。这显然是一个非常特殊的领域,但与游戏完全无关!

4
我认为关于这是一个“营销”事情的答案可能是正确的,加上缺乏大量可供选择的库。我想指出另一个例子:Ruby。 Ruby旨在成为一种通用脚本语言。问题在于,由于Ruby on Rails已经变得如此流行,因此很难找到与Rails无关的东西。我担心Lua也会因为一些重要的事物而变得流行,但永远无法摆脱这种污名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接