![5d8184bd02e00ede0b01b5b9e5fe606f.png](https://i-blog.csdnimg.cn/blog_migrate/1a270cd9210dd50daa61707942be35fe.png)
SAST weekly 是由电子工程系学生科协推出的科技系列推送,内容涵盖信息领域技术科普、研究前沿热点介绍、科技新闻跟进探索等多个方面,帮助同学们增长姿势,开拓眼界,每周更新,欢迎关注!欢迎愿意分享知识的同学投稿至 eesast@mail.tsinghua.edu.cn , 期待你的作品!
Part 1 简述
计算机发展到如今,编程语言的数量据统计已有数百种之多。对于我们专业而言,C/C++是培养方案要求的必修内容,而可能也有不少同学在课外对Java、Python这两门同样得到广泛应用的语言有了解。编程语言不见得是了解的越多越好,毕竟即使是我们自认为自己已经学过的C++某种意义上说我们所学的也其实只不过是C with class,只是学过课堂内容的话恐怕对其许多实用特性了解得并不深入。但另一方面不同的编程语言确实存在一些特定范围使某些语言显得更加适用。本人才疏学浅,在此仅想向大家简单介绍一下自己略了解过的Lua语言,以期有兴趣的同学能对这一门语言做更多探索。
![ca9898efb9535d151eac8abd00cf47e2.png](https://i-blog.csdnimg.cn/blog_migrate/0d0b37aab1d9c47a38fc58ef124d0028.png)
什么是Lua语言?它有什么优点?
Lua是一个小巧的脚本语言,其设计目的是为了通过灵活嵌入应用程序中从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。
——以上内容均摘自百度百科
Part 2 Lua的环境安装与基本语法
(1)环境安装
Windows:
Windows上的安装有多种IDE供选择,一种是SciTE,可以在github下载:https://github.com/rjpcomputing/luaforwindows/releases;或者LuaDist,官方下载http://luadist.org/,其他的还有ZeroBraneStudio等。
Linux:
下载源码包并在终端解压编译即可,在终端执行:
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make linux test
make install
Mac与Linux类似,只需修改''linux''为''macosx‘’即可
(2)变量
Lua本身内容不多,且又是基于我们学过的C进行开发,因此上手是比较简单的。就个人使用体验而言,我感觉Lua与python有更多相似之处,因此了解过python的同学应当不费什么力气就能理解下面的内容。接下来我最简洁地阐述一下Lua的基本语法。
Lua是一种动态语言。运行程序与python类似,可以脚本式编程,也就是类似于我们熟悉的C语言的编程方式,也可以进行交互式编程,在命令行输入lua进入交互式界面,如图(以下均以Windows为例):
![61a0d7b78ef35a3ced3eda6c522a8881.png](https://i-blog.csdnimg.cn/blog_migrate/a904a67430124409192052987b618252.png)
Lua的基本数据类型包括:nil、boolean、number、string、userdata、function、thread 和 table。boolen、number、function容易理解,无需过多解释。boolen为布尔值(true、false),number类似于python中数字,不对整数和浮点数做区分,function为函数。
nil为空值,该数据类型也仅有空值这一个变量值,一般表示非法的操作。例如,如果你定义了一个局部变量,当你想在该部分外调用这一变量时,就会发现变量为nil。
string为字符串,与python类似,Lua在变量中不严格区分字符和字符串,可以用单引号或双引号表示,即'hello,world'或"5"等。值得一提的是,Lua中的字符串有一点与C和python中都不同,即不能直接通过索引来访问字符。换句话说,string_name[n]这样的表示返回的不是字符而是空值nil。那么如何对字符串进行操作呢?实际上Lua中提供了很多字符串的方法来实现我们的需求。
table是一个较为有趣的数据类型,在C++的STL库中类似于map,在python中类似于字典(dict)。table简单来说就是一个键(key)和值(value)的对应表。key可以是任何非空(nil)的值,而value则没有限制。一个key对应的value是唯一的,但不同key对应的value却可以相同。具体的使用下面再进一步介绍。
thread为线程,userdata为用户自定义类型,这两者不作进一步介绍。
Lua中变量的声明、赋值也与python类似。变量不拘泥于特定类型。举例如下:
a=1 --定义变量a,值为1(number)
a='123' --把a的值赋为'123'(string)
Lua支持多变量赋值,如:
a,b=1,2 --等价于a=1;b=2
多变量赋值是先计算右边所有值后再赋值,故可以简单地实现交换操作:
a,b=b,a
与python不同,Lua中的变量若不加说明都默认为全局变量,局部变量用修饰词local
table的定义可以采用系统给定的默认构造器{}。即:
Table={} --定义table类型变量Table
Table['6hg']=true --定义Table中索引'6hg'对应值true
另外,Lua中相同类型的变量可以组合为数组。数组同样可以有一维或多维,用索引来访问。需要指出,数组的索引是从1开始的。例如:
a={4,5,6} --定义数组a
print(a[1]) --输出数组a的索引1的值4
print(a[0]) --输出nil,非法访问
(3)条件语句和循环语句
Lua中只认为false和nil为逻辑假,其余均为逻辑真,因此,0也是true值
条件语句:
if else语句:
if (布尔表达式)
then
--执行的语句
else
--执行的语句
end
注意用缩进来表示语句块
也可省略else部分退化为if语句
循环语句:
while循环:
while(布尔表达式)
do
--执行的语句
end
for循环:
for (begin,final,foot)
--执行的语句
end
这里begin为循环变量初始值,final为循环变量结束值,foot为变化步长(省略则默认为1),用C中的for循环表示即为:for(int i=begin;i<=final;i+=foot)。注意final值是取得到的。这里为数值for循环,另有泛型for循环略去。
repeat until循环:
repeat
--执行的语句
until (布尔表达式)
类似于do while
(4)函数
定义:
function function_name(arguments)
--函数体
return result
end
类似于python,函数可以返回多值,如return a,b
以上就是Lua的最基本的语法内容,有了C或python的基础后理解起来应当是相当容易的。当然有很多细节这里没有一一列举,实际应用很多的IO操作和面向对象编程这里也没有讲,有兴趣的同学可以自行了解。
Part 3 Lua的应用举例
(1)游戏开发
emmm...没错我把游戏开发作为Lua的应用的第一个例子就是因为这也可能是它对于我们而言的一个主要应用了。很多应用程序、游戏使用Lua作为自己的嵌入式脚本语言,以此来实现可配置性、可扩展性。这其中包括魔兽世界、博德之门、愤怒的小鸟、QQ三国、VOCALOID3、Garry's Mod、太阳神三国杀、游戏王ygocore、以撒的结合和饥荒等。嗯本人一开始也是做游戏MOD学的Lua(捂脸)。对于不同的游戏其修改也不尽相同,往往不仅涉及到lua文件的编写,还包括xml等配置文件以及素材的添加等等,因此这里也就没有作为实例写出来了。有兴趣的同学一般可以在贴吧或B站上找到对应的民间教程或者去看可能的官方文档。
![796e3f85e35f0c6979d249cb49d74a17.png](https://i-blog.csdnimg.cn/blog_migrate/ca7c9d7074366cfbbacb3df4d7b67205.jpeg)
![df3756d817fc3f72a02c47d2735b82f9.png](https://i-blog.csdnimg.cn/blog_migrate/cda0faae94a8c7ffa45f36431356aaa7.jpeg)
(2)APP开发
虽然上面提到lua并不适合用作独立应用程序的开发,但对于一些简单的程序也不失为一种方式,比如在今年在全国多所高校中传播的恶意APP中就含有lua文件代码。有兴趣的同学可以结合以前的一期讲到Android Studio的SAST weekly进行研究。
![06aeb98d992f27b3b6c74b6b9737da97.png](https://i-blog.csdnimg.cn/blog_migrate/d42311d74bd41a6634252850d96a62bc.jpeg)
![5c53495490d1ba291387a1a9705cdc31.png](https://i-blog.csdnimg.cn/blog_migrate/97adf403750d7d5b291208507ca63ae4.jpeg)
(3)编写网络脚本等
![fefb2bdcffaa8cec8abd8be8aa3f8a88.png](https://i-blog.csdnimg.cn/blog_migrate/f3dc6937d9e561b513abaf603b0095c5.jpeg)
撰稿人:谭亦钦
审稿人:陈善麟
![844e48cc50f3e3a1dbb9c4492e9e4be0.png](https://i-blog.csdnimg.cn/blog_migrate/161a92cfdc47230ff02693bc7bc72d3c.png)