Lua,一种被误解的语言

2021-01-16 06:10:12

Lua是我最喜欢的编程语言之一。我用它为我的旧教育网站构建了CMS,创建了很酷的IoT硬件项目,构建了小游戏,并尝试了网络分散化。不过,我一点也不认为自己是这方面的专家,我最多是一位称职的用户。这就是说,我在各种环境下接触了很多年,但是我对它的实施或生态系统并不了解。因此,当我阅读有关Lua的博客文章和文章时,似乎完全错过了该语言的目标和背景,这让我有些痛苦。通常,这些帖子读起来像是一声怒吼或一堆需求。最近,我在LWN上看到有关Lua的电池不足的帖子,并且在Hacker News上对此帖子的讨论使我想回信。在这篇文章中,我将介绍我在原始文章和《黑客新闻》上看到的一些评论。

我认为是Hisham在LuaConf 2017的演讲中说Lua是极简主义的(也就是:“有零种方法可以做到这一点”)。当然,这是关于Lua提供的策略机制,或者是Lua如何通过允许开发人员调整语言以适应其环境来解锁开发人员中的代理,反之亦然。 Lua应该被视为您添加任何所需成分的基本成分。如果您要制作水果冰沙,那么Lua是牛奶,您可以添加所需的任何水果。

想要电池的人需要现成的电动工具,这些工具充满了意见。他们并没有在Lua想要存在的环境中寻找Lua。就像看着船在抱怨它不能飞。它不是要飞的。除非您建造了其余的地方,然后用它制作了水上飞机。完全由您决定,Lua不在乎。

Lua一直是脚本应用程序的语言。一直假设您会使用其他方法构建特定于域的代码,并将Lua引擎嵌入其中以使其更加灵活。您在制作游戏吗?您可以使用对您的游戏有意义的任何一种语言来构建整个引擎,包括只有您的游戏才关心的领域特定内容,然后将Lua添加到其中,以便您可以编写和调整游戏而无需重新编译源代码。

相同的上下文适用于其他提供Lua作为其插件或附加组件的脚本语言的软件,这正是Lua的目标,它为这种方法提供了优势。可以用Lua编写整个软件的事实是它是一种好的语言的副作用,但它并不是它的主要用例。

想要使用电池的Lua的人们并没有意识到野外有很多使用电池的Lua发行版。其他开发人员选择了Lua,添加了他们认为良好的基准,并交付了完整的软件包。您也可以构建自己的包含电池的Lua,其中包含您想要的东西。我们并不需要PUC的Lua团队的祝福。这是应该如何工作的。您选择语言并组合所需的内容。

由于开发人员负责进行呼叫,因此这会导致软件功能强大。您完全可以控制,可以做出适合您的开发的决策。 Lua团队或LuaRocks团队在任何情况下都无法阻止您像榆树社区内部发生的戏剧那样做自己想做的事情。您可以获取所需版本的源,然后再也不必关注Lua社区。

我认为,只有将Lua嵌入到自己的软件中时,您才能欣赏它。除非您要构建的是将其他语言(例如C)和Lua的代码组合在一起,否则Lua的强大功能将无法满足您的需求。 Lua的能力不仅强大,而且不会为您效劳。如果您使用的只是100%Lua源代码,它将感觉就像是另一种脚本语言-与Python或Ruby不同-并且您将开始尝试使用其他语言来分析Lua,因为它们与La并没有真正的可比性他们有不同的目标。

在此评论中提及。我经常看到有人认为C做事是唯一有效的方法。如果人们花更多时间思考为什么使用基于0的索引,那将是很好的。 C使用此类索引,因为该值实际上是一个乘数,您可以使用该乘数来查找数据位置的内存偏移量。如果您有一个数组,因此有一个指向该数据在内存中起始位置的指针,并且知道数组元素的大小,则可以将大小乘以索引,将其与指针值相加,然后获取对应于该索引引用的元素。这就对了。索引从零开始,以帮助您在有一个指针(基本上是C所提供的全部指针)时在内存中查找内容。

当您像人类一样说话时,使用1作为数组的初始位置很有意义。当您和您的朋友在排队等待您的热狗时,您可能会告诉他们您排在第一位。我怀疑您会说您排在第零。我们通常从一个开始计数。当婴儿完成第一次围绕太阳的往返旅行时,他们是1岁而不是0岁。此外,基于1的索引编制在您进行迭代时提供了帮助,您不需要诸如i-1之类的黑客或直到i总计的事情。您可以从1到总数进行计数,并且可以像正常人那样做。如果我没记错的话,那是一个Pascal约定。 Pascal是一种值得一见钟情的语言,恕我直言。

Lua不是面向对象的。这就对了。 Lua的表是非常灵活的数据结构。 Lua具有元表,在使用表时可以提供更大的灵活性。应该将其作为工具箱使用(您可以在此处看到主题吗?)。使用表和元表,您可以构建大量很棒的东西,例如名称空间和精美的OOP系统。一切尽在您的掌握之中。您是否要构建具有双父原型继承的NewtonScript之类的系统?好吧,将其编码掉。 Lua提供机制而不是策略。您可以使用这些机制来构建适合您的内容。您不受PUC或图书馆作者提供的服务的束缚。

在此评论中提及。请注意,我不是在这里选珍妮特,我真的很喜欢珍妮特。许多人没有意识到Lua非常敏捷。编译器可以使用c89标准(即使默认值为c99 IIRC)构建Lua,而对其运行的硬件的假设很少。这使其成为在硬件和您自己的应用程序中进行嵌入式工作的主要候选人。被吹捧为Lua替代品的许多语言需要更多资源,并对它们所运行的硬件和操作系统进行更多假设。珍妮特仍然很棒(它使用c89 IIRC构建)。

Lua很小,我不是在说二进制大小和资源使用情况。我说的是源代码的复杂性。 Lua非常小,新手开发人员可以很好地了解其内部结构并牢记在心。这使其成为学术研究的绝佳语言。您可以轻松理解的语言将促进实验。 Lua地理位置优越,可用于研究和实际用途。

最初,我将这一部分称为“结论”,但那感觉是错误的。这是一篇关于Lua的文章,因此,除了给您一个结论外,我还是给您最后的几句话-工具包中的另一篇文章-这样您就可以得出自己的结论。

我不是计算机科学家。我从1998年到2001年是PUC-Rio的学生,虽然在那里我当时使用旧的CGILua进行工作,但在那里我从未见过Lua团队。我退出了工程专业,并从另一所大学毕业,担任电影制片人和编剧。我没有很多人都拥有所有的学术背景,但阅读这篇文章并没有阻止我使用Lua。我曾在2017年LuaConf大会上发表演讲,并介绍了我建造的一个互联网连接的自动饮料搅拌机。我为该机器选择了Lua,因为它感觉不错。我想要的不是一种充满毅力和意见的语言。我需要工具包中的另一个工具,该工具为我提供了足够的机制来构建所需的工具。

当您接触Lua时,请不要将其视为一种产品。像对待乐高玩具一样接近它。 Lua为您提供积木,您提供想象力,设计,最后构建产品。

您可以通过Twitter或Mastodon,Secure Scuttlebutt或通过WebMentions与我联系。