一、Lua语言介绍

  • Lua语言从一开始就被设计为能与C/C++及其他常用语言开发的软件集成在一起使用的语言,这种设计带来了非常多的好处:

    • 一方面, Lua语言不需要在性能、与三方软件交互等C语言已经非常完善的方面重复“造轮子”,可以直接依赖C语言实现上述特性,因而Lua语言非常精简
    • 另一方面,通过引入安全的运行时环境、自动内存管理、良好的字符串 处理能力和可变长的多种数据类型, Lua 语言弥补了C语言在非面向硬件的高级抽象能力、 动态数据结构、鲁棒性、调试能力等方面的不足
  • Lua语言强大的原因之一就在于它的标准库,这不是偶然,毕竟扩展性本身就是 Lua语言的主要能力之一。Lua语言中的许多特性为扩展性的实现提供了支持:动态类型使得一定 程度的多态成为了可能,自动内存管理简化了接口的实现(无须关心内存的分配/释放及处 理溢出),作为第一类值的函数支持高度的泛化,从而使得函数更加通用
  • Lua语言除了是一门可扩展的语言外,还是一门胶水语言(glue language)。Lua 语言支 持组件化的软件开发方式,通过整合已有的高级组件构建新的应用。这些组件通常是通过 C/C++等编译型强类型语言编写的, Lua语言充当了整合和连接这些组件的角色。通常,组件(或对象)是对程序开发过程中相对稳定逻辑的具体底层(如小部件和数据结构)的抽象,这些逻辑占用了程序运行时的大部分 CPU 时间,而产品生命周期中可能经常发生变化的逻辑则可以使用 Lua 语言来实现。当然,除了整合组件外 Lua 语言也可以用来适配和改 造组件,甚至创建全新的组件
  • Lua 语言并非这个世界上唯一的脚本语言,还有许多其他的脚本语言提供了类似的能力尽管如此, Lua语言的很多特性使它成为解决许多问题的首选,这些特性如下:
    • 可扩展: Lua 语言具有卓越的可扩展’性 Lua 的可扩展性好到很多人认为 Lua 超越了编 程语言的范畴,其甚至可以成为一种用于构建领域专用语言( Domain-Specific Language,DSL )的工具包 Lua 从一开始就被设计为可扩展的,既支持使用 Lua 语言代码来扩展, 也支持使用外部的C语言代码来扩展。在这一点上有一个很好的例证: Lua 语言的大部分基础功能都是通过外部库实现的。我们可以很容易地将 Lua与C/C++、Java、C#和Python等结合在一起使用
    • 简明: Lua 语言是一门精简的语言。尽管它本身具有的概念并不多,但每个概念都很强大。这样的特性使得 Lua 语言的学习成本很低,也有助于减小其本身的大小(其包含所有标准库的 Linux 64 位版本仅有 220 KB)
    • 高效:Lua 语言的实现极为高效。独立的性能测试说明 Lua 语言是脚本语言中最快的语言之一
    • 可移植:Lua 语言可以运行在我们昕说过的几乎所有平台之上, 包括所有的 UNIX 操作系统(Linux FreeBSD等)、 Window、Android、iOS、OS X、IBM大型机、游戏终端( PlayStation、Xbox、Wii 等) 、微处理器(如 Arduino )等、针对所有这些平台的 源码本质上是一样的, Lua 语言遵循 ANSI(ISO)C标准,并未使用条件编译来对不同平台进行代码的适配。因此,当需要适配新平台时,只要使用对应平台下的 ISO C 编译器重新编译 Lua 语言的源码就可以了
  • Lua官网:http://www.lua.org/

二、Lua解释器的安装

  • Lua解释器是用来运行Lua程序的,此处我们以ubuntu为例,来安装Lua解释器
  • 可以到http://www.lua.org/ftp/中下载最新的Lua版本(此处我们以Lua 5.4.0为例)

安装过程

  • 第一步:下载Lua源码包,并进入目录
wget http://www.lua.org/ftp/lua-5.4.0.tar.gz

  • 第二步:解压源码包,并进入目录
tar zxf lua-5.4.0.tar.gzcd lua-5.4.0/ls

  • 第三步:编译
make linux test

  • 第四步:之后会在src目录下生成两个可执行程序lua和luac
ls src/

  • 第五步:安装Lua
sudo make install

  • 安装完成之后:

    • 头文件保存在/usr/local/include/目录下
    • 可执行程序保存在/usr/local/bin/目录下
    • 动态库安装在/usr/local/lib/目录下
    • 还有一些内容也安装在/usr/l;ocal目录下
ls /usr/local/include/lua*ls /usr/local/bin/lua*ls /usr/local/lib/liblua*

  • 第六步:刷新动态库链接
sudo ldconfig

  • 第七步:查看lua安装的版本
lua -v

三、运行两个lua程序案例

演示案例1

  • 建立一个hello.lua文件,内容如下:
print("Hello World")
  • 运行效果如下:

演示案例2

  • 下面的fact.lua程序用来求一个数的阶乘结果:
-- 定义一个计算阶乘的函数
function fact(n)if n == 0 thenreturn 1elsereturn fact(n-1) * nend
endprint("enter a number:")-- 读取一个数字
a = io.read("*n") -- 打印结果
print(fact(a))
  • 运行效果如下:

四、程序段

  • 我们将Lua语言执行的每一段代码(例如,一个文件或交互模式下的一行)称为一个程序段(Chunk),即一组命令或表达式组成的序列
  • 程序段既可以简单到只由一句表达式构成,也可以由多句表达式和函数定义(实际是赋值表达式)组成(例如计算阶乘的演示案例)
  • 程序段在大小上并没有限制,事实上,由于Lua语言也可以被用作数据定义语言,所以几MB的程序段也很常见。Lua语言的解释器可以支持非常大的程序段

五、交互式解释器

  • 除了将源码保存为文件,然后使用lua运行之外,还可以使用交互式模式的独立解释器

进入交互式解释器

  • 在命令行下直接输入lua即可进入

  • 进入之后输入的每一条命令都会在按下回车键之后立即执行
  • 例如,我们输入下面的语句

退出交互式解释器

  • 有两种方式退出交互式解释器:

    • 输入EOF控制符(POSIX下为ctrl+D、Windows下为ctrl+Z)

    • 或者调用操作系统的exit函数(执行os.exit())退出

  • 例如,在Linux下输入ctrl+D退出:

  • 或者执行os.exit()退出

  • 更多关于lua交互式的使用,见下面完整介绍

六、Lua解释器完整介绍

  • 下面列出了lua解释器的参数选项:

    • 所有参数都是可选的
    • 当不使用任何参数调用lua时,就进入了上面的交互式模式

交互式Lua

  • 当不使用任何参数调用lua时,就进入了上面的交互式模式
  • 在上面已经介绍了

Lua脚本

  • lua解释器默认安装在/usr/local/bin/目录下,如下所示:

  • 因此,当一个脚本的开头以"#!/usr/local/bin/lua"开始时,这是一个lua的脚本,这个脚本中可以执行lua程序
  • 下面是一个名为lua_test.sh的脚本,内容如下:
#!/usr/local/bin/luaprint("HelloWorld")
  • 赋予其可执行权限,并运行:
chmod +x lua_test.sh./lua_test.sh

与老版本中的兼容

  • 从Lua 5.3版本开始,可以直接在交互式模式下输入表达式,Lua语言会输出表达式的值,例如
math.pi/4a = 15a ^ 2a + 2

  • 但是,在Lua 5.3之前,需要在表达式前面加上一个“=”号
a = 15= a ^ 2= a + 2

  • 为了向下兼容,Lua 5.3之后的版本还是支持之前的语法

-e选项

  • 该选项允许我们直接在命令行中输入代码
  • 备注:在POSIX系统下需要使用双引号,以防止Shell错误地解析括号
  • 例如:
lua -e "print(math.sin(12))"

-i选项

  • -i选项可以让Lua解释器在执行完指定的程序段之后再进入交互模式
  • 这一选项对于调试和手工测试很有用
  • 例如,下面是一个prog.lua程序
print("Hello World")a = 15
  • 现在我们输入下面的命令,让其执行完prog.lua程序再进入交互模式:
lua -i prog.lua
  • 可以看到其打印了“Hello World”,然后打印a,可以看到a为15

-l选项

  • 该选项用于加载库之后再进入交互式模式,与-i选项有点类似
  • 例如,下面的命令先加载lib库,然后再执行x=10的赋值语句,并最终进入交互模式,进入之后打印x可以看到我10
lua -i -llib -e "x=10"

dofile()函数

  • 进入交互式解释器之后,可以调用dofile()函数加载一个外部已经存在的lua文件
  • 该函数在开发阶段也很有用。我们可以同时打开两个窗口,一个窗口使用文件编辑器编辑的代码(例如prog.lua),另一个窗口中使用交互式模式运行Lua语言解释器。当修改完代码并保存后,只要在Lua语言交互模式的提示符下执行dofile("prog.lua")就可以加载新代码
  • 例如,下面有一个lib.lua文件,内容如下:
-- 定义了两个函数function norm(x, y)return math.sqrt(x^2 + y^2)
endfunction twice(x)return 2.0*x
end
  • 我们进入交互式解释器,然后在里面调用dofile()函数让其加载lib.lua文件的所有内容,之后就可以调用里面的函数了

;的使用

  • 如果执行一行语句之后,在末尾加上了分号(;),那么这条语句的输出不会被打印,但是这条命令被执行了
  • 例如:输入io.flush()默认会输出"true",可以在末尾加上;让其不打印消息

  • 即使不打印消息,但是这条语句也是被执行了的

LUA_INIT_5_4、LUA_INIT环境变量

  • lua解释器在处理参数前,会先查找系统中名为LUA_INIT_5_4环境变量(根据你Lua的版本而定,我的lua版本为5.4),如果查找不到再去查找LUA_INIT环境变量
  • 如果这两个环境变量中的任意一个存在,如果:
    • 这两个环境变量的内容为@filename,那么lua解释器就会运行这个文件
    • 这两个环境变量的内容不是以@开头的,那么解释器就会认为这两个环境变量包含的是lua代码,会对其进行解释执行
  • 这些环境变量使得我们可以灵活的配置独立解释器。例如,我们可以预先加载程序包(Package)、修改路径、定义自定义函数、对函数进行重命名或删除函数等等

lua解释器的程序参数

  • lua在运行代码前会创建一个名为arg的表,这个表存储了所有的命令行参数。你可以把它想象为C语言中main函数的argv数组
  • Lua语言也支持可变长参数,可以通过可变长参数表达式来获取,在脚本文件中,表达式...表示传递给脚本的所有参数(这些内容在后面介绍“可变长参数”的时候再介绍)
  • 例如,下面我们需要调用lua来执行script脚本,并且给该脚本传入了3个参数a、b、c,那么
    • arg[0]=script、arg[1]=a、arg[2]=b、arg[3]=c
lua script a b c
  • 位于脚本之前的所有选项位于负数索引上,例如:

    • arg[-3]=lua、arg[-2]=-e、arg[-1]=sin=mayj.sin、arg[0]=script、arg[1]=a、arg[2]=b、arg[3]=c
lua -e "sin=math.sin" script a b c

Lua:01---Lua语言介绍、运行Lua程序(lua解释器)相关推荐

  1. 易语言运行 (c:内部.exe, 假, ),易语言没法运行exe程序,怎么办?

    这样写命令: 运行 ("cmd.exe start"+取运行目录+"\KMS.exe" ,假,) 原理是调用Cmd的命令Start来代替易语言执行. 扩展: S ...

  2. R语言快速运行脚本程序

    在之前打开R语言的脚本程序时,一直是 文件–>运行R脚本文件,一直认为还有更加简单的方法,经过查询,发现直接用语句运行R文件的方法如下: setwd("D:/workspace/R&q ...

  3. pycharm运行python程序没有解释器怎么办

    1.选择设置 2.打开解释器选项 3.打开之后是这个样子(你的会和我的不太一样,我这个是装了解释器之后的,你的装了之后也是这个样子) 4.添加解释器程序 5.在这里添加解释程序路径,然后点击ok就可以 ...

  4. apache运行CGI程序的配置

    关于apache与CGI在这里就不解释了. 1.apache下载地址:http://www.apache.org,下面以2.0.63为例介绍运行CGI程序的配置. 2.下载Windows下的Perl解 ...

  5. Lua语言介绍(二)

    当然,Lua的最强大的功能是能与宿主程序亲蜜无间的合作,因此,下面我会告诉大家,如何在你的程序中使用Lua语言作为脚本,使你的程序和Lua脚本进行交互.这个例子就是我们熟悉的<魔兽争霸>. ...

  6. Lua与C语言的互相调用

    本系列相关文章: Flutter 热更新及动态UI生成 Lua 15分钟快速上手(上) Lua 15分钟快速上手(下) Lua与C语言的互相调用 LuaDardo中Dart与Lua的相互调用 Lua底 ...

  7. Redis Lua脚本的详细介绍以及使用入门

    Redis Lua脚本的详细介绍以及使用入门. 文章目录 Redis Lua脚本的引入 开源软件的可扩展性 Redis的扩展性脚本 Redis Lua脚本的基本使用 通过EVAL命令执行Lua脚本 通 ...

  8. 动态语言开发环境python_GitHub - lcyan26/Script.NET: 脚本语言集成开发环境,支持Tcl、Python、Perl、Ruby、Lua等脚本语言。...

    Script.NET介绍 Script.NET是蓝蚂蚁工作室开发的一套集成开发环境(可用于Tcl.Python.Perl.Ruby.Lua等脚本语言开发),最新的4.0版本已经在github上开源. ...

  9. Lua和C语言的交互——C API

    Lua可作为扩展性语言(Lua可以作为程序库用来扩展应用的功能),同时也是个可扩展的语言(Lua程序中可以注册由其他语言实现的函数). C和Lua交互的部分称为C API.C API是一个C代码与Lu ...

最新文章

  1. c语言 可变参数的宏,可变参数的宏__ VA_ARGS__的用法
  2. 基于EMQ X,打造AIoT物联网视频接入解决方案
  3. php多维数组和对象,在PHP中将多维多对象数组转换为标准多维数组
  4. python如何查询数据库_Python数据库操作手册-数据库专栏,SQL Server
  5. php中 param,php中bind_param()函数用法分析
  6. python中json模块读写数据
  7. Asp.Net Core中Session使用
  8. ubuntu 18.04安装jdk8和eclipse
  9. 网易严选Java开发三面面经:java技术编程培训班
  10. Spring源码学习--new()和反射的实例化区别
  11. python连接redis哨兵_python连接redis sentinel集群
  12. install python-tk_No module named _tkinter, please install the python-tk package 解决方法总结
  13. 又到一年“粽子节”,快来测测你包的粽子颜值几分
  14. Windows下的Linux开发环境Cygwin
  15. [轉載 Delphi Format]
  16. 在.net中创建外接程序
  17. 软件_matplotlib绘图跳过时间段的处理方案[博]
  18. 练习--LINUX进程间通信之有名管理FIFO
  19. gbase导入sql文件_GBase数据库——常用命令
  20. iphone11支持es6吗_好久没用Carplay了:IOS11导航功能不错

热门文章

  1. 网页制作和java有关系么_网页设计注意问题
  2. 如何提升小目标的检测效果
  3. html图片十字形,CSS3 十字架
  4. 工程热力学c语言 朗肯循环第二题,软件工程上机实验报告_相关文章专题_写写帮文库...
  5. Java兔子生兔子问题
  6. 16行 python代码获取音效素材
  7. 【扫一扫二维码,传智大礼包带回家】
  8. 3个APP海外推广方式,不走寻常路
  9. (OK) dnf - Fedora23——删除多余不用的内核
  10. 电脑安卓手机模拟器怎么修改IP地址