Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于 1993 年开发的,该小组成员有:Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。
获取Map集合中所有的key可以通过map集合的keySet()方法获取例如: Map map = new HashMap(); map.put(xx,xx); //存放数据 //.... 省略 Set set = map.keySet(); //可以通过迭代器进行测试 Iterator iter = set.iter...
public class Point { private int x; private int y; public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } ...
Lua作为目前最为流行的、免费轻量级嵌入式脚本语言,在很多工业级的应用程序中被广泛应用,如Adobe's Photoshop,甚至是在一些著名的游戏程序中也被大量使用,如星际。
三、应用场景:
1. 在很多时候,我们可以将Lua直接嵌入到我们的应用程序中,如游戏、监控服务器等。这样的应用方式对于程序的最终用户而言是完全透明的,但是对于程序本身,其扩展性将会得到极大的增强。
2. 将Lua视为一种独立的脚本语言,通过它来帮助我们完成一些软件产品的辅助性工具的开发。比如在我们之前的数据分析产品中,我们通过编写Lua脚本,将每个用户不同格式的数据重新格式化为我们的软件平台能够读取的格式,之后再将格式化的后的数据加载到数据库中,或者是写入我们的分析引擎可以识别的数据分析文件中。这其中Lua仅仅用于文件格式的规格化过程,至于此后的操作,都是通过Lua调用我们的C语言导出函数来完成的。
3. 将Lua应用于应用程序的动态配置部分。比如移动智能设备或嵌入式设备,它们的显示分辨率在很多情况下都是非标准的,如果我们为每一款设备都维护一套相关的配置信息,这无疑会加大我们程序的维护开销,如果我们将这段动态配置逻辑交由Lua脚本完成,那么这对于程序配置的灵活性而言,将会得到很大的提高。甚至可以是这样,运行在移动终端设备上的应用程序,在启动主窗体之前先和服务器建立连接,在服务器确认设备的各种参数后,再将和该设备显示相关的Lua脚本发送给设备客户端,这样客户端在得到Lua脚本之后,就可以立刻执行它以得到最新的动态配置信息。
最后需要特别指出的是,学习Lua对于我们知识的系统性和完整性而言将是非常重要的一环,特别是对那些致力于软件架构设计和软件解决方案分析的高级软件专业人员而言就更是如此。因为在很多时候,如果我们能够很充分的理解和驾驭Lua,它不仅可以为我们的软件产品增色很多,而且也可以为我们技术人员带来一些意想不到的收获
作为一名程序员,相信大家在软件架构图上经常见到 “Nginx + Lua” 的字样,但是对于Lua在Web应用中的作用并没有多少了解。
该篇文章对 Lua 的语言特性、优势等方面做介绍,并通过介绍一个天气预报的 Web 应用,让大家对 Lua 在Web应用中充当的角色有一个直观的认识。
什么是 Lua
Lua 是用标准C语言编写的一种小巧的脚本语言,并以源代码形式开放。Lua 并没有提供强大的库,所以我们很少单独使用 Lua 去编写程序,其设计目的是为了嵌入其他应用程序中,比如嵌入 Cocos2d-x 游戏引擎或 Nginx 服务器,从而为应用程序提供灵活的扩展和定制功能。
Lua 的语言特性
Lua 的语法并不复杂,易于上手,而且网上已有大量的语法教程,所以该篇文章不再赘叙,这里介绍几个 Lua 语言相对重要的语言特性。
协程并发
协程相对独立,有自己的上下文,但是其切换由程序自己控制(线程的切换是由操作系统控制,这是协程与线程的重要区别)。
Lua 的协程通过扩展库 coroutine 来实现,通过 create 函数创建一个协程,resume 函数以运行此协程,直到新协程调用 yield 函数,程序才能返回到“主协程”中运行。
在 Java 程序中,我们常常使用回调函数来实现异步调用,但是如果在回调函数中又嵌套回调函数,这样的代码结构并不直观。而 Lua 的协程,封装了底层的回调代码,让我们可以用同步调用的方式编程,实现异步调用的功能。
自动内存管理
Lua 中所有用到的内存,如:字符串、表、用户数据、函数、线程、内部结构等,都服从自动管理,其垃圾回收算法是标记清除垃圾收集算法。
闭包
闭包是指将一个函数写在另一个函数之内,这个位于内部的函数可以访问外部函数中的局部变量。Lua 的语言特性支持闭包的功能。通过使用闭包,我们可以实现函数式编程,类似 Java 8 的 Lambda 表达式。
Lua 的优势
可扩展性
Lua 由C语言编写,Lua 和 C/C++ 之间可以相互调用,从而可以在 Lua 中嵌入大量的功能。
小巧快速
一个完整的 Lua 解释器不过200k,在目前所有脚本引擎中,Lua 的速度是最快的。而且其小巧的特性,不会给宿主程序带来性能上的影响。这决定了 Lua是作为嵌入式脚本的最佳选择。
热更新
Lua 的热更新特性是其被运用在游戏服务器的重要因素。热更新能够在服务器运行期间更新程序逻辑代码以实现修正程序Bug,减少服务器的重启造成经济上的损失。
LuaJIT
LuaJIT 即Lua Just-In-Time Compiler,不同于官方的Lua编译器,使用LuaJIT可以实现一次编译多次运行,其执行速度比使用官方的 Lua 解释器快。
Lua 的应用场景
Lua 因为其快速、可扩展的优势,被广泛应用于多个方面,其中主要的两个方面是游戏开发和 Web 应用脚本。
1. 游戏开发(Cocos2d-x + Lua + C++)
Lua 大量被用于游戏开发,主要是搭配Cocos2d-x ,作为脚本来处理从逻辑到UI的各种工作,如:《愤怒的小鸟》、《魔兽世界》。单纯使用C++开发的成本比较高,而使用C++提供各种基本的功能函数库,Lua调用这些库来实现各种逻辑功能,可以实现基本代码库和逻辑代码分离,减低编程成本。
2. Web 应用脚本(Nginx + Lua)
Lua 的另一个常见应用场景是编写 Nginx 服务器的脚本。一开始开发者都使用C/C++ 做Nginx 开发,但是使用 C/C++ 开发 Nginx的程序对开发者的要求较高,开发者需要了解 Nginx 的工作原理和内部处理流程,熟悉各种数据结构,掌握进程、事件等运行机制,开发成本高,周期长。直到Openresty(一个基于Nginx与Lua的高性能Web平台,下文会做介绍)的诞生,该平台集成大量的 Nginx 功能模块和Lua模块,开发者可以用 Lua 作为“胶水语言“粘合 Nginx 的各个模块和底层接口,以脚本的方式实现业务逻辑。
Nginx 的介绍
接下来将为大家介绍一个使用 Lua 作为脚本的 Web 应用,由于该程序搭建于 Nginx 服务器之上,所以在介绍该程序之前,需要先介绍 Nginx 服务器。
Nginx是一款轻量级的Web 服务器和反向代理服务器,其特点是占有内存少,单线程、异步非阻塞处理请求,并发能力强。
图示为 Nginx 的进程结构图,Nginx设计为一个主进程多个工作进程的工作模式,每个进程是单线程来处理多个连接,而且每个工作进程采用了单线程非阻塞I/O来处理多个连接,从而减少了线程上下文切换,从而实现高性能、高并发。
OpenResty 的介绍
如果使用 C++ 开发 基于Nginx 的 Web应用,开发者需要了解 Nginx 的工作原理和内部处理流程,开发成本高,周期长。本部分介绍 OpenResty,在该平台上可以方便地开发基于 Nginx 的应用程序。
OpenResty 的官方介绍:“OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。”
图示为OpenResty 的组成结构图,核心是 Nginx 服务器,Ngx_lua 模块在 Nginx 中嵌入 LuaJIT 即时编译器,因此开发者可以使用 Lua 脚本调用各种 Nginx 模块(Ngx_echo)和 Lua 模块(Lua_redis,Lua_cjson),快速开发Web程序。
应用一:天气预报 API
本部分带大家动手搭建一个简单的Web应用。该Web应用基于OpenResty(Nginx+Lua),在第三方天气预报 API 的基础上做一层简单的封装,实现自定义的天气预报 API 的功能。
程序的结构比较简单,请求到达 Nginx 服务器,然后 Lua 脚本做简单的逻辑处理,并通过 Nginx 正向代理到第三方的天气预报 API 服务器上,最后响应请求。
程序的源代码可以在本人的 GitHub 下载,地址为:
https://github.com/zhenghangjin/Openresty-Weather-API
应用二:Lua 实现限流和负载均衡
Lua 除了可以在 Web 程序中做逻辑处理,还可以用来扩展 Nginx 的配置,Lua 提供了比 Nginx 默认配置规则更加灵活的设置方式。
比如开发者可以使用 Lua 编写限流算法,如:令牌桶算法、漏桶算法或其他自定义的算法;还可以使用 Lua 编写负载均衡算法。
Nginx + Lua 的使用建议
Nginx + Lua 并不适合开发业务逻辑复杂的 Web 应用,我们可以通过 Nginx 的并发模型和Lua 的语法特性两个方面来分析。
Nginx 的并发模型
Nginx每个进程以单线程、异步非阻塞的方式处理请求。当某个请求做I/O处理时,所在的进程可以处理其他请求,提高CPU的利用率,响应速度快,适用于开发I/O密集型应用和业务逻辑单一的应用。
Lua 的语法特性
另一方面,Lua 的语言特性比较简单,没有类似 Java 语言的封装、继承、多态等特性,如果应用程序的业务逻辑比较复杂,代码无法很好地重构,不利于维护。
总结
最后,对这次 Lua 的学习之旅做一个总结。 Lua 是一门优秀的脚本语言,其快速、小巧、可扩展的特性深受开发者所喜爱。但是 Lua 在Web应用领域的书籍和博客还是比较少,希望有更多的开发者投入到 Lua 的学习之中,为打造一个良好的 Lua 生态圈贡献出自己的一份力量。
Lua作为目前最为流行的、免费轻量级嵌入式脚本语言,在很多工业级的应用程序中被广泛应用,如Adobe's Photoshop,甚至是在一些著名的游戏程序中也被大量使用,如星际。
三、应用场景:
1. 在很多时候,我们可以将Lua直接嵌入到我们的应用程序中,如游戏、监控服务器等。这样的应用方式对于程序的最终用户而言是完全透明的,但是对于程序本身,其扩展性将会得到极大的增强。
2. 将Lua视为一种独立的脚本语言,通过它来帮助我们完成一些软件产品的辅助性工具的开发。比如在我们之前的数据分析产品中,我们通过编写Lua脚本,将每个用户不同格式的数据重新格式化为我们的软件平台能够读取的格式,之后再将格式化的后的数据加载到数据库中,或者是写入我们的分析引擎可以识别的数据分析文件中。这其中Lua仅仅用于文件格式的规格化过程,至于此后的操作,都是通过Lua调用我们的C语言导出函数来完成的。
3. 将Lua应用于应用程序的动态配置部分。比如移动智能设备或嵌入式设备,它们的显示分辨率在很多情况下都是非标准的,如果我们为每一款设备都维护一套相关的配置信息,这无疑会加大我们程序的维护开销,如果我们将这段动态配置逻辑交由Lua脚本完成,那么这对于程序配置的灵活性而言,将会得到很大的提高。甚至可以是这样,运行在移动终端设备上的应用程序,在启动主窗体之前先和服务器建立连接,在服务器确认设备的各种参数后,再将和该设备显示相关的Lua脚本发送给设备客户端,这样客户端在得到Lua脚本之后,就可以立刻执行它以得到最新的动态配置信息。
最后需要特别指出的是,学习Lua对于我们知识的系统性和完整性而言将是非常重要的一环,特别是对那些致力于软件架构设计和软件解决方案分析的高级软件专业人员而言就更是如此。因为在很多时候,如果我们能够很充分的理解和驾驭Lua,它不仅可以为我们的软件产品增色很多,而且也可以为我们技术人员带来一些意想不到的收获
Lua 用于 web 开发。
感谢 chaoslawful 发起的开源项目 nginx_lua 项目,感谢 agentzh 的开源精神,感谢所有开源的同学们,我们可以在 nginx 里写 lua 代码了。
lua 的优点就是小巧,核心代码不过一万几多行。高效,可以调用 C 的共享库,就是抓来 C 代码,用 lua api 的命名改改,就可以直接使用 C 代码写的函数了。弱类型,这点在编程中很重要。
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于 1993 年开发的,该小组成员有:Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。
设计目的
其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua 特性
轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
其它特性:
支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。
Lua 应用场景
游戏开发
独立应用脚本
Web 应用脚本
扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
安全系统,如入侵检测系统
什么是 Lua
Lua 是用标准C语言编写的一种小巧的脚本语言,并以源代码形式开放。Lua 并没有提供强大的库,所以我们很少单独使用 Lua 去编写程序,其设计目的是为了嵌入其他应用程序中,比如嵌入 Cocos2d-x 游戏引擎或 Nginx 服务器,从而为应用程序提供灵活的扩展和定制功能。
其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的拓展和定制功能
常用于的应用场景:
游戏开发
独立应用脚本
Web 应用脚本
扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
安全系统,如入侵检测系统
相关问题推荐
对于每一位才开始接触JAVA的新手来说,先不要管算法和数据结构,大多数简单的程序不需要用到算法和数据结构,所以当你真正需要时再去学习。编程一段时间以后,你就会知道在哪些地方用到他们。这时知道算法的名字并了解它们的功能,然后动手去实践。当我们在去...
2个都很好就业,更关键的是要学得到东西
获取Map集合中所有的key可以通过map集合的keySet()方法获取例如: Map map = new HashMap(); map.put(xx,xx); //存放数据 //.... 省略 Set set = map.keySet(); //可以通过迭代器进行测试 Iterator iter = set.iter...
不同年龄,不同掌握程度,学历,找工作城市,面试能力这是一个多方面影响的结果,如果是平均值的话,全国平均薪资14k左右
具体学多久,根据自己的学习力,自律性、解决问题能力来决定若系统性学习,跟着讲师的节奏走,大概半年左右,有专业的讲师把课程进行规划,尽心系统学习,有问题,讲师会帮忙解决,学习的效率很高,避免了自学中出现各种问题解决不了,而耽误很多时间,可能会...
(1)idea启动时会有两个快捷方式,安装完后默认生成在桌面的是32位的idea的快捷方式,如果我们使用这个快捷方式运行大项目,一般都会很卡。解决方法是找到idea的安装目录,然后进入bin文件夹,找到名称为idea64的应用程序,右键他生成桌面快捷方式。以后每次...
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要...
ava是一种区分字母的大小写的语言,所以我们在定义变量名的时候应该注意区分大小写的使用和一些规范,接下来我们简单的来讲讲Java语言中包、类、变量等的命名规范。(一)Package(包)的命名Package的名字应该都是由一个小写单词组成,例如com、xuetang9、compan...
public class Point { private int x; private int y; public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } ...
经典版单例模式public class Singleton { private static Singleton uniqueInstance;//利用一个静态常量来记录singleton类的唯一实例。 private Singleton() { } public static Singleton getInstance()...
哈希表的长度一般是定长的,在存储数据之前我们应该知道我们存储的数据规模是多大,应该尽可能地避免频繁地让哈希表扩容。但是如果设计的太大,那么就会浪费空间,因为我们跟不用不到那么大的空间来存储我们当前的数据规模;如果设计的太小,那么就会很容易发...
1. DOM(Document Object Model) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才...
1)作用不同: throw用于程序员自行产生并抛出异常; throws用于声明在该方法内抛出了异常2) 使用的位置不同: throw位于方法体内部,可以作为单独语句使用; throws必须跟在方法参数列表的后面,不能单独使用。3)内容不同: throw抛出一个异常对象,且只能是...
基本执行过程如下:1)程序首先执行可能发生异常的try语句块。2)如果try语句没有出现异常则执行完后跳至finally语句块执行;3)如果try语句出现异常,则中断执行并根据发生的异常类型跳至相应的catch语句块执行处理。4)catch语句块可以有多个,分别捕获不同类型...
100-199 用于指定客户端应相应的某些动作。 200-299 用于表示请求成功。 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。 400-499 用于指出客户端的错误。 400 语义有误,当前请求无法被服务器理解。 401 当前请求需要用户验证...
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。Java编译...