关于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已经减少了核心特性的数目,但是它允许程序员使用简单的方式扩展语言的特性,比如:
-
你想在你的原始类型中加入属性么?Ok,你可以在你的代码中插入[对象信息]
(http://lua-users.org/wiki/ObjectProperties) -
“我是一个Python程序员,并且我喜欢为文档”。没问题,可以把Decorators And Docstrings加入到Lua中。
-
- LuaJIT 是目前动态语言中最快的即时编译器之一。
缺陷:
-
缺少debug工具的支持。我知道很多程序员并不使用debug工具,但是我真喜欢此类工具并且我一直通过print方式来debug我的代码。
-
Lua没有传统的错误处理方式,比如
try
,catch
和finally
。事实上,你可以用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是高层次的语言并且在动态语言中有一个最快的解释器,它可以作为应用中出现语言性能问题比较好的选择,比如通信、游戏、那些内存受限的嵌入式应用。
注意:本文遵守MIT 条款。
网友评论