LUA快速使用指南

LUA快速使用指南_第1张图片
Lua在葡萄牙语中是月亮的意思,是一个有效的轻量级的可嵌入式脚本语言。它支持面向对象和面向过程的编程方式。从1993年被开发出来至今已经有25岁的高龄了。老当益壮,不坠青云之志,Lua仍然非常地活跃,比如深度学习的开源框架Torch就使用Lua和C作为开发的主要语言。

曾经在游戏开发者杂志的编程工具分类获得2011年的Front Line Award奖项,Lua得到了很高的评价:Lua成为了一们非常流行的编程语言,在游戏领域尤其如此。部分原因是由于它的速度和易用性,开发者可以将Lua嵌入到游戏引擎中。同时,Lua还有很高的可扩展性。另外在源码文件以及运行所需的内存使用量方面都是相对较小。游戏开发者杂志对Lua进行了不遗余力的赞美,详细可以参看如下链接:

URL http://www.gamasutra.com/view/news/129084/Announcing_Game_Developer_magazines_2011_Front_Line_Award_winners.php

基本信息

项目 说明
官方网站 http://www.lua.org/
开源/闭源 开源
License类别 MIT License
代码管理地址 http://www.lua.org/ftp/
开发语言 C
更新频度 平均每年数次更新
提供者 Waldemar, Roberto, Luiz
支持平台 使用ANSI C开发的Lua可以支持任何能够运行ANSI C的平台,基本常见的OS都可以从源码进行编译和安装
当前版本 5.3.4(2017/01/12)

Lua的开发者

LUA快速使用指南_第2张图片

版本演进

这里写图片描述

功能特色

相较于其他脚本余元,Lua有显著的自身特色:

快速

官方号称Lua在性能方面有较好的名声,而其他编程语言也有强烈的愿望能够”as fast as Lua”, 据称在一些对标中Lua都在交互式的脚本语言中是最快的。

可移植

由于Lua使用了ANSI C的开发,而几乎所有的操作系统对ANSI C提供支持,所以Lua可以运行在Unix/Windows/IBM大型机/诸如Android,iOS,Symbian等移动设备上。

可嵌入

Lua提供简单而强大的API方便集成到其他语言中,可以使用其他语言写的库对Lua进行扩展,同时也可以使用其他语言和Lua一起对应用程序进行更好地扩展。Lua不仅仅支持C/C++,同时对Java/C#/Perl/Ruby/Smalltalk/Ada/Fortran/Erlang等进行结合使用。

强大且简单

在特性开发上Lua秉承所谓的meta-mechanisms的重要设计理念,通过这种方式实现了很多重要的功能,比如Lua虽然不是纯粹的面向对象语言,但是通过meta-mechanisms机制可以实现类和继承。

small

最新的5.3.4的tar包,压缩之后只有297K,而解压后也仅有1.1M。Lua的源码仅有24000行左右,在64位的Linux下,Lua的解释器和标准库也仅有几百K的大小。

免费

Lua采用了对商业非常友好的MIT License,可用于商业目的,你所需要的只是下载下来。

安装部署

在本文中使用源码编译的方式进行Lua的安装

事前准备:yum install -y gcc readline-devel

使用gcc是为了编译,而readline-devel则是因为在Lua的源码中使用了相关模块

[root@devops lua-5.3.4]# find . -type f |xargs grep readline.h
./src/lua.c:#include 
./src/lua.c:#include 
[root@devops lua-5.3.4]# 

具体5.3.4的源码安装命令如下:

curl -R -O http://www.lua.org/ftp/lua-5.3.4.tar.gz
tar zxf lua-5.3.4.tar.gz
cd lua-5.3.4
make linux test

安装日志:

[root@devops ~]# curl -R -O http://www.lua.org/ftp/lua-5.3.4.tar.gz
...省略
[root@devops ~]# tar zxf lua-5.3.4.tar.gz
[root@devops ~]# cd lua-5.3.4
[root@devops lua-5.3.4]# make linux test
cd src && make linux
make[1]: Entering directory `/root/lua-5.3.4/src'
make all SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl -lreadline"
make[2]: Entering directory `/root/lua-5.3.4/src'
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lapi.o lapi.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lcode.o lcode.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lctype.o lctype.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o ldebug.o ldebug.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o ldo.o ldo.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o ldump.o ldump.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lfunc.o lfunc.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lgc.o lgc.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o llex.o llex.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lmem.o lmem.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lobject.o lobject.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lopcodes.o lopcodes.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lparser.o lparser.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lstate.o lstate.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lstring.o lstring.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o ltable.o ltable.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o ltm.o ltm.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lundump.o lundump.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lvm.o lvm.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lzio.o lzio.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lauxlib.o lauxlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lbaselib.o lbaselib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lbitlib.o lbitlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lcorolib.o lcorolib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o ldblib.o ldblib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o liolib.o liolib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lmathlib.o lmathlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o loslib.o loslib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lstrlib.o lstrlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o ltablib.o ltablib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lutf8lib.o lutf8lib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o loadlib.o loadlib.c
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o linit.o linit.c
ar rcu liblua.a lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o lbitlib.o lcorolib.o ldblib.o liolib.o lmathlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o loadlib.o linit.o 
ranlib liblua.a
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o lua.o lua.c
gcc -std=gnu99 -o lua   lua.o liblua.a -lm -Wl,-E -ldl -lreadline 
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX    -c -o luac.o luac.c
gcc -std=gnu99 -o luac   luac.o liblua.a -lm -Wl,-E -ldl -lreadline 
make[2]: Leaving directory `/root/lua-5.3.4/src'
make[1]: Leaving directory `/root/lua-5.3.4/src'
src/lua -v
Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
[root@devops lua-5.3.4]#

在结果的最后已经看到了Lua 5.3.4的信息

安装结果确认

可以看到Lua的Size像它宣称的一样,非常之小,仅仅248K,从3.5寸软盘和DOS时代走过来的应用程序自然对大小有特殊的注意。

[root@devops lua-5.3.4]# du -k src/lua
248 src/lua
[root@devops lua-5.3.4]#

确认版本信息

[root@devops lua-5.3.4]# src/lua -v
Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
[root@devops lua-5.3.4]#

当前的机器已经安装了lua,版本为5.1.4, 将其更新为刚刚编译的5.3.4版本,仅仅需要将可执行文件覆盖即可

[root@devops lua-5.3.4]# cp src/lua /usr/bin/
cp: overwrite ‘/usr/bin/lua’? y
[root@devops lua-5.3.4]# which lua
/usr/bin/lua
[root@devops lua-5.3.4]# lua -v
Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
[root@devops lua-5.3.4]# 

C语言时代的软件,对细节还是把握的很好的

[root@devops lua-5.3.4]# ldd /usr/bin/lua
    linux-vdso.so.1 =>  (0x00007fff306e5000)
    libm.so.6 => /lib64/libm.so.6 (0x00007fda590e4000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007fda58ee0000)
    libreadline.so.6 => /lib64/libreadline.so.6 (0x00007fda58c99000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fda588d6000)
    /lib64/ld-linux-x86-64.so.2 (0x0000562cd2f9d000)
    libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fda586ac000)
[root@devops lua-5.3.4]# 

使用简例

第一个Hello World:交互方式

接下来使用lua来进行第一个Hello World的使用

[root@devops lua-5.3.4]# lua -i
Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
> print("Hello World")
Hello World
> 

也可以这样:

> print "Hello World"
Hello World
> 

也可以这样:

> print 'Hello World'
Hello World
> 

还可以这样:

> print('Hello World')
Hello World
> 

但是不能这样:

> print "Hello world'
>> 
stdin:1: unfinished string near '"Hello world''
> 

使用Ctrl + d可以退出交互模式

第一个Hello World程序:文件方式

除了交互式,也可以使用文件方式保存可执行的代码,然后通过lua进行执行,比如代码信息如下

[root@devops ~]# cat Hello.lua 
print("Hello World")
print('Hello World')
print "Hello World"
print 'Hello World'
[root@devops ~]# 

执行Hello.lua

[root@devops ~]# lua Hello.lua 
Hello World
Hello World
Hello World
Hello World
[root@devops ~]#

也可以使用如下方式,在文件中指定解析的程序并赋予可执行权限并执行

[root@devops ~]# cat Hello.lua 
#!/usr/bin/lua

print("Hello World")
print('Hello World')
print "Hello World"
print 'Hello World'
[root@devops ~]# chmod +x Hello.lua 
[root@devops ~]# ./Hello.lua 
Hello World
Hello World
Hello World
Hello World
[root@devops ~]#

基本语法

注释

单行注释

使用两个减号作为单行注释: –注释内容

多行注释

使用如下方式进行多行注释

--[[
注释内容
--]]

具体例子

[root@devops ~]# cat Hello.lua 
#!/usr/bin/lua

--single line comment
print("Hello World") --single line comment
print('Hello World')

--[[
multiple lines comment
multiple lines comment
multiple lines comment
--]]
print "Hello World"
print 'Hello World'
[root@devops ~]#

关键字

Lua具有如下关键字

  • if
  • elseif
  • else
  • then
  • end
  • for
  • while
  • do
  • until
  • break
  • return
  • rue
  • false
  • nil
  • and
  • not
  • or
  • in
  • function
  • local
  • repeat

八种基本数据类型

Lua中变量无需进行类型定义,默认情况下变量生命域为全局,在Lua中,全局变量不需要事先声明,赋值后即创建,访问没有初始化的变量也不会出错,只是会得到nil,而将一个变量赋值成nil时可以相当于删除了此变量。nil为Lua的基本数据类型的一种,Lua有如下八种数据类型

类型 说明
nil 表示无效值
boolean 布尔值:true或false
string 字符串:使用单引号或者双引号来表示
number 数字型:双精度类型
function 函数类型
thread Lua中使用coroutine实现类似线程的功能
table 关联数组
userdata 用户自定义类型

变量生命域

Lua中默认情况变量生命周期为全局,可以通过local来指定变量生命域

[root@devops ~]# cat lua1.lua 
#!/usr/bin/lua

var_global='liumiaocn'

function sayHello()
  local var_local='hello'
  print("In function:",var_local)
end

print (var_local,var_global)
sayHello()
[root@devops ~]#

可以看到local修饰的变量在函数之外无法取到值

[root@devops ~]# ./lua1.lua 
nil liumiaocn
In function:    hello
[root@devops ~]# 

逻辑控制

写法非常接近BSHELL,将fi换成end即可

[root@devops ~]# cat lua2.lua 
#!/usr/bin/lua

if false then
  print "false branch "
elseif nil then
  print "nil branch "
else
  print 'false and nil will not be performed'
end
[root@devops ~]#

执行确认

[root@devops ~]# chmod +x lua2.lua 
[root@devops ~]# 
[root@devops ~]# ./lua2.lua 
false and nil will not be performed
[root@devops ~]# 

循环控制

Lua中的循环有三种:for/while/repeat…until。Lua支持循环的嵌套。
for循环

[root@devops ~]# cat lua3.lua 
#!/usr/bin/lua

print "for loop :"

for i=1,3,1
do
  print(i)
end

print 'default increment'
for i=1,2
do
  print(i)
end
[root@devops ~]# 
[root@devops ~]# chmod +x lua3.lua 
[root@devops ~]# ./lua3.lua 
for loop :
1
2
3
default increment
1
2
[root@devops ~]# 

while循环

[root@devops ~]# cat lua4.lua 
#!/usr/bin/lua

i=1

print "while loop"
while(i<=3)
do
  print(i)
  i=i+1
end
[root@devops ~]# chmod +x lua4.lua 
[root@devops ~]# ./lua4.lua 
while loop
1
2
3
[root@devops ~]#

repeat…until循环

[root@devops ~]# cat lua5.lua 
#!/usr/bin/lua

i=1

print "repeat...unitl loop"
repeat
  print(i)
  i=i+1
until(i>3)
[root@devops ~]# chmod +x lua5.lua 
[root@devops ~]# ./lua5.lua 
repeat...unitl loop
1
2
3
[root@devops ~]#

文件读写

Lua还提供很多其他的功能,诸如文件读写,你会发现和C语言非常相像,当然简化很多。

[root@devops ~]# cat lua6.lua
#!/usr/bin/lua

fileStream=io.open("test-lua.txt","a")
io.output(fileStream)
io.write("Hello Lua\n")
io.write("Greetings from Liumiao\n")
io.close(fileStream)
[root@devops ~]# chmod +x lua6.lua 
[root@devops ~]# ./lua6.lua 
[root@devops ~]# 
[root@devops ~]# cat test-lua.txt 
Hello Lua
Greetings from Liumiao
[root@devops ~]# 

总结

在这篇文章中,我们了解了Lua的一些特性以及基本数据结构和常见的一些控制的写法,基本可以快速上手。至于更详细的使用方法可以参看如下文档:

使用文档 http://www.lua.org/manual/5.3/

你可能感兴趣的:(#,编程语言)