Lua 编程/简介
Lua(不是“LUA”,尽管很常见,但这是不正确的)是一种强大、快速、轻量级且可嵌入的编程语言。它被许多框架、游戏和其他应用程序使用。虽然它可以独立使用,但它被设计为易于嵌入到其他应用程序中。它使用 ANSI C 实现,这是 C 编程语言的一个子集,非常便携,这意味着它可以在许多系统和许多设备上运行,而大多数其他脚本语言无法运行。本书的目的是向任何人都学习 Lua 编程,无论其之前的编程经验如何。本书可以作为编程的入门教程,适用于从未编程过的人,也可以作为 Lua 的入门教程,适用于之前编程过但从未使用过 Lua 的人。由于有许多使用 Lua 的开发平台和游戏,因此本书也可以用来学习如何使用 Lua,然后在该开发平台中使用它。
本书旨在教授最新版本的 Lua 的用法。这意味着它将尝试定期更新,因为 Lua 的新版本会发布(Lua 的发布频率足够低,这应该不会太难)。目前,本书的版本是 Lua 5.2。如果您在使用 Lua 的嵌入环境中使用 5.x 分支(Lua 5.0 和 Lua 5.1)的旧版本,本书的材料应该仍然对您足够有用。
Lua 由巴西里约热内卢天主教大学设计并维护。它的创建者是 Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。
“Lua”(发音为 LOO-ah)在葡萄牙语中是“月亮”的意思。因此,它既不是缩写也不是缩写,而是一个名词。更确切地说,“Lua”是一个名字,是地球月球的名字,也是该语言的名字。像大多数名字一样,它应该用小写字母写,开头大写,即“Lua”。请不要将其写成“LUA”,这既难看又令人困惑,因为这样它就变成了一个首字母缩略词,对不同的人有不同的含义。所以,请正确地写“Lua”!—Lua 作者, 关于 Lua
Lua 来自两种由 TeCGraf(里约热内卢天主教大学的一个实验室)设计的语言:DEL 和 Sol。DEL 意为“数据录入语言”,而 Sol 意为“简单对象语言”,在葡萄牙语中也意为“太阳”,这就是选择 Lua 这个名字的原因,因为它在葡萄牙语中是“月亮”的意思。它是为巴西石油公司 Petrobras 创建的,但也用于 TeCGraf 的许多其他项目,现在在世界范围内广泛使用。Lua 是嵌入式游戏开发领域领先的语言之一。
Lua 的主要优势之一是它的简单性。一些公司专门使用它是因为这个优势:他们认为他们的员工如果可以使用编程语言来执行某些任务会工作得更好,但他们无力为员工提供关于复杂编程语言的完整课程。一些非常简单的语言,如 Bash 或 Batch,在这里不够强大,无法执行这些任务,但 Lua 既强大又简单。Lua 的另一个重要优势是它可嵌入的能力,这是它在整个开发过程中最重要的特点之一。像 World of Warcraft 或 ROBLOX 这样的游戏需要能够将其嵌入到他们的应用程序中,以便应用程序的用户可以使用它。
编程,在嵌入式应用程序中运行的程序的情况下有时也称为脚本,是编写计算机程序的过程。编程语言是一种语言,用于通过包含在计算机程序中的计算机代码向计算机发出指令。编程语言包含两部分:语法,就像英语中的语法一样,以及库,由该语言提供的基本函数。这些库可以与英语中的词汇进行比较。
Lua 可以嵌入到应用程序中,也可以独立使用。本书不会描述在您的计算机上安装 Lua 的过程,但您可以使用 codepad 或 Lua 演示 执行代码。本书中第一个 Lua 代码示例将是基本且传统的“你好,世界”程序。
“你好,世界”程序是一个计算机程序,它在显示设备上输出“你好,世界”。因为它通常是大多数编程语言中最简单的程序之一,所以按照惯例,它通常用来向初学者说明编程语言中最基本的语法,或者验证语言或系统是否正常运行。—维基百科, 你好,世界程序
print("Hello, world!")
上面的代码将文本 你好,世界! 打印到输出,打印是指在输出中显示文本,而不是在纸上打印。它通过使用字符串“你好,世界!”作为参数调用 print
函数来实现。这将在关于函数的章节中解释。
请注意,Lua 大多数时候是 嵌入 在更低级别的应用程序中的,这意味着 print
函数并不总是将文本显示在用户可见的区域。这些应用程序的编程接口文档通常会解释如何将文本显示给用户。
注释是编程语言忽略的代码注释。注释可以用来描述一行或多行代码,记录程序,临时禁用代码,或任何其他原因。它们需要以两个连字符为前缀才能被 Lua 识别,并且可以放在单独的行上,也可以放在另一行的末尾
print("This is normal code.")
-- This is a comment
print("This is still normal code.") -- This is a comment at the end of a line of code.
这些注释称为短注释。也可以创建长注释,它们以长括号开头,可以继续多行
print("This is normal code")
--[[Line 1
Line 2
]]
长括号由两个括号组成,这两个括号之间可以放置任意数量的等号。这个数字称为长括号的级别。长括号将一直持续到下一个相同级别的括号,如果有的话。没有等号的长括号称为 0 级长括号。这种方法使在长注释中使用闭合双括号成为可能,方法是在两个括号中间添加等号。在使用注释禁用代码块时,这样做通常很有用。
--[==[ This is a comment that contains a closing long bracket of level 0 which is here: ]] However, the closing double bracket doesn't make the comment end, because the comment was opened with an opening long bracket of level 2, and only a closing long bracket of level 2 can close it. ]==]
在上面的示例中,0 级闭合长括号(]]
)不会关闭注释,但 2 级闭合长括号(]==]
)会。
编程语言的语法定义了如何在该编程语言中编写语句和表达式,就像语法定义了如何在英语中编写句子和单词一样。语句和表达式可以分别与句子和单词进行比较。表达式是可以计算的具有值的代码片段,而语句是可以执行的包含指令和一个或多个表达式的代码片段,以便使用该指令。例如,3 + 5
是一个表达式,而 variable = 3 + 5
是一个将 variable 的值设置为该表达式的语句。
Lua 的整个语法可以在扩展的巴科斯-诺尔范式中找到 Lua 网站上,但如果你读它,你什么也看不懂。 扩展的巴科斯-诺尔范式 是一种元语言,一种用来描述另一种语言的语言,就像元网站是一个关于网站的网站,就像元表一样,在 Lua 中,是定义其他表行为的表(你将在本书的后面学习关于元表和表的知识)。但是,你不需要在这本书中学习扩展的巴科斯-诺尔范式,因为像 Lua 这样的语言可以使用元语言进行描述,也可以使用英语中的单词和句子进行描述,而这正是本书要做的。
由于英语可以用来描述另一种语言,那么它本身一定是一种元语言(因为它符合元语言的定义)。事实确实如此。由于编程语言的目的是描述指令,而你可以用英语来做到这一点,因此英语也必须是一种编程语言。这,**在某种程度上**,也是事实。实际上,英语是一种可以用于多种用途的语言。但扩展的巴科斯-诺尔范式是一种专门的语言,编程语言也是专门的语言。专门化是指在特定领域非常擅长,但在其他方面则无能为力。扩展的巴科斯-诺尔范式非常擅长描述其他语言,但它不能用来编写指令或传递信息。编程语言非常擅长给出指令,但它们不能用来描述语言或传递信息。
英语能够做到所有事情:描述语言、给出指令和传递信息。但它在做这些事情中并不擅长。事实上,它在给出指令方面非常糟糕,以至于如果用它来给计算机下达指令,计算机将无法理解任何内容。这是因为计算机需要指令非常精确和明确。
Lua 可以从官方 Lua 网站获取,在下载页面。那里也有说明:下载按钮是用于获取源代码的,这可能不是你想要的。你可能在寻找二进制文件,因此你应该在页面上查找有关这些文件的信息(你到底要找什么取决于你正在使用的平台)。本书的目的是教授 Lua 语言,而不是教授 Lua 工具的使用方法。一般假设读者将在嵌入式环境中使用 Lua,但这对于本书的实用性来说并不必要,只是意味着本书不会描述将 Lua 作为独立语言的使用方法。