用户:Woclass/Lua Programming/序言

Lua 在巴西里约热内卢(Rio de Janeiro)的 Pontifical Catholic 大学被设计和维护。它的创造者是:Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。

"Lua" (发音 LOO-ah) 在葡萄牙语里是“月亮(moon)”的意思。因此,它既不是首字母缩写词也不是缩略词,而是一个名词。更具体地说,“Lua”是一个名字,地球的卫星——月亮的名字和一种语言的名字。像大多数名字一样,它应该首字母大写而其他部分小写,即“Lua”。请不要将它写成“LUA”。这种写法既丑陋又令人感到困惑,因为它变成了对不同人有不同含义的首字母缩写词。所以,请正确的写下“Lua”吧!

—Lua 的作者们, en: 关于 Lua

Lua 源自于两种由 TeCGraf 设计的语言:DEL 和 Sol。TeCGraf 是位于里约热内卢的 Pontifical Catholic 大学的实验室。 DEL(data entry language) 的意思是“数据条目语言”,而 Sol(simple object language) 的意思是“简单对象语言”,并且在葡萄牙语里"Sol"的意思是太阳,这也是为什么取 Lua 这个名字——因为它在葡萄牙语里意思是“月亮(moon)”。Lua 是巴西石油公司 Petrobras 创造出来的,但它也用于 TeCGraf 的许多其他项目。现在 Lua 在世界各地的众多项目中使用。Lua是嵌入式游戏开发领域的主要语言之一。

Lua 的一个主要优点是简单。有些公司完全是因为Lua具有这种优势才使用它:他们认为如果公司的员工如果能够使用编程语言来完成某些任务,员工的工作效率会更高。但他们承担不起为公司的员工提供复杂编程语言课程的费用。像Bash和Batch这样的语言又过于简单,不足以完成这些任务。而Lua简单又强大,能很好地满足公司的需求。Lua的另一个巨大的优点是:可供嵌入使用。这也是Lua开发过程中的一个重要的特征。像魔兽世界(WoW)或ROBLOX这样的游戏需要把Lua嵌入他们的程序,这样用户们就可以在程序中使用Lua。

编程,有时在嵌入式环境中也被称为脚本编程,是一种编写计算机程序的过程。编程语言是一种通过计算机程序中的代码把指令传递给计算机的语言。编程语言由两部分组成:语法和库。语法就类似英语语法。库可以类比英语的词汇,能提供基本的函数。


Hello, world! 编辑

Lua既能独立运行也能嵌入运行。本书不会涉及到如何在你的电脑上安装Lua,但是你可以在 CodepadThe Lua demo 上运行Lua代码. Lua代码的第一个例子是经典的Hello world程序。

"Hello world" 程序是一个能输出"Hello, world"到显示设备上的计算机程序。因为它是大多数编程语言中最简单的典型程序,它通常用来给新手展示最基本的语法,或者用于验证一种语言或一个新系统是否正常工作。

—维基百科, Hello World 程序

print("Hello, world!")

以上代码会输出 Hello, world! 到指定输出中。"print" 代表着输出文本到指定输出中,而不是打印在纸上。代码以"Hello, world!"字符串为参数,调用了 print 函数。具体的函数调用原理见函数章节。

值得注意的是:Lua通常嵌入到一个以较低级别运行的程序中,这意味着 print 函数的输出不一定能被用户看到。这些程序的文档中编程接口部分通常会解释如何向用户显示文本。


注释 编辑

注释就是一段被编程语言忽略的代码。注释可以用来描述一行或多行的代码、记录程序的功能、临时的注释掉某段代码或用作其他用途。注释需要以两个连词符 -- 开头,这样Lua才知道它们是注释。注释可以独立成行,也可以置于行尾:

print("正常的代码。")
-- 独立成行的注释.
print("依旧是正常的代码。") -- 行末的注释.

以上这些注释叫做短注释。我们也可以写长注释,只要在两个连词符后加两个中括号 ]]

print("正常的代码。")
--[[第一行注释...
第二行注释...
]]

长括号由两个中括号组成,两个括号之间可以有任意数数量的等号。等号的数量成为长括号的级别(level)。长括号开头的注释会一直持续到遇到同级别的括号。没有等号的长括号是0级长括号。通过在两个括号间添加等号,这样就可以在注释中输入连续的两个中括号。要注释代码块时这样做十分方便。

--[==[

这是一行包含了0级闭合中括号 ]] 的注释。

但是,这两个闭合的中括号并没有结束注释,因为这一段长注释以2级的中括号开始,只有2级的闭合中括号才能结束它。

]==]

在这个例子里,0级的闭合中括号 ]] 并不会结束注释,而2级的 ]==] 可以。


句法 编辑

编程语言的句法定义了如何用该编程语言编写语句和表达式,就像语法定义单词如何组成句子一样。语句和表达式可以类比为英语中的句子和单词。表达式是一小段能被求值的代码,而语句是由指令和参数组成的、可执行的代码段。指令的参数可以由一个或多个表达式构成。举个例子:3 + 5 是一个表达式,variable = 3 + 5 则是一个将表达式的值赋给变量 variable 的语句。

Lua的完整句法可以在Lua手册的The Complete Syntax of Lua一节找到,手册中使用了扩展巴克斯-诺尔范式(EBNF)来描述完整的句法,事实上你读了这一节也很难理解它。扩展巴克斯-诺尔范式(EBNF, Extended Backus–Naur Form) 是一种用于描述其他语言的元语言,类似于原网页是一个关于其他网页的网页、Lua里的原表格定义了其他表格的行为(稍后我们会介绍原表格)。但本书不会过多的涉及到EBNF,像Lua这样的语言可以使用一种元语言来描述它,也可以用英语的词和句子来描述它,这才是本书要做的事。

因为英语可以用来描述其他语言,所以它本身一定是一种元语言(因为它符合元语言的定义)。事实上的确如此。又因为编程语言的目的是描述指令,你用英语可以做到同样的事情,那英语一定是一种编程语言。这在某种程度上也是如此。事实上英语是一种可以描述任何事情的语言。而EBNF是一种专用的语言,编程语言也是一种专用的语言。专用意味着特别适合于做某些事情,同时不能做另一些事情。EBNF 非常适合于描述另一种编程语言,但它不能用来撰写指令或者传达消息。编程语言擅长于传递指令,但它们不能用来描述其他语言或者传达消息。

英语则能够做所有的事情:描述另一门语言、给出指令或传达消息。但它并不是每一项都很擅长。事实上英语不太适合给出指令,如果用英语像计算机发出一个指令,计算机将无法理解任何内容。这是因为计算机指令需要用非常精确且没有歧义的方式给出。


获得 Lua 编辑

Lua可以在官网的下载页面得到。

一些下载说明:如果你直接点击下载按钮,事实上你下载的是源码,估计这不是大多数人想要的。你可能在寻找编译好的二进制文件,所以你应该在页面上的其他部分寻找你想要的东西,具体你要下载什么文件这取决于你使用的系统。本书的目的是教你如何使用这个语言,而不是怎样使用Lua的各种工具。我们通常假定读者会在嵌入式的环境中使用Lua,但这并不影响本书的实用性,只是在书中我们不会提到如何独立的使用Lua。


小测验 编辑

1 "Lua"在葡萄牙语里意思是什么?

可用中文(两个字)或英文(一个单词,全小写)作答。

2 下列哪一个是lv0的注释?

--注释(Comment)
[[注释(Comment)]]
--[[注释(Comment)]]
--[=[注释(Comment)]=]
[=[注释(Comment)]=]

3 扩展巴克斯-诺尔形式(extended Backus–Naur form)是什么?

一种语言
一种编程语言
一种自然语言(普通语言)
一种记号(notation)
一种元语言
一种标记语言