02.仿简道云公式函数实战-表达式引擎
1. 前言
在很多的场景里面我们需要对表达式进行解析和计算,比如在科学计算与金融计算等领域,我们需要对复杂的公式求值,通常我们得做法都是用脚本语言,或者我们按照一定的规则去解析,但是这些方式性能问题非常明显,计算效率比较低下,而且我们自己在解析表达式的时候,也会有一定的风险问题,比如黑客修改我们程序执行的表达式,注入攻击代码,恶意进行函数调用,所以执行未知的表达式是有着安全问题的,而且通常我们自定义规则表达式缺乏灵活性,很难对自定义函数,操作符进行支持,要不然实现起来困难重重,无异于写一款全新的表达式引擎工具,既然我们实现存在这么多问题和难题,那我们为何不借助第三方实现,毕竟软件开发一直提倡的是减少重复建设轮子。
2. 表达式引擎产品预研
目前市面上的表达式引擎的产品很多,比如Aviator、IKExpression、QLExpress,Groovy等。每个产品都有自己特点和适用场景,以下是这几款产品的对比。
Aviator简介
Aviator是一个高性能、轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值。现在已经有很多开源可用的java表达式求值引擎,为什么还需要Avaitor呢? Aviator的设计目标是轻量级和高性能,相比于Groovy、JRuby的笨重,Aviator非常小,加上依赖包也才450K,不算依赖包的话只有70K;当然, Aviator的语法是受限的,它不是一门完整的语言,而只是语言的一小部分集合。 其次,Aviator的实现思路与其他轻量级的求值器很不相同,其他求值器一般都是通过解释的方式运行,而Aviator则是直接将表达式编译成Java字节码,交给JVM去执行。简单来说,Aviator的定位是介于Groovy这样的重量级脚本语言和IKExpression这样的轻量级表达式引擎之间。
IKExpression简介
IK Expression 是一个开源的(OpenSource),可扩展的(Extensible), 基于java 语言开发的一个超轻量级(Super lightweight)的公式化语言解析执行工具包。IK Expression 不依赖于任何第三方的java 库。它做为一个简单的jar,可以集成于任意的Java 应用中。这包括了JavaEE 应用(基于应用服务器的),Java桌面应用以及Java WebStart 方式的应用。
Groovy简介
Groovy的网站(http://groovy.codehaus.org)给出了groovy的最好定义:groovy是在java平台上的、具有象Python,Ruby和Smalltalk语言特性的灵活动态语言,groovy保证了这些特性象java语法一样被java开发者使用。
Groovy经常被认为是脚本语言——它也像脚本一样工作的很好。但是,把Groovy理解为脚本语言是一种误解,groovy代码被编译成java字节码,然后能集成到java应用程序中或者web应用程序,整个应用程序都可以是groovy编写的——groovy是非常灵活的。
groovy与java平台非常融合,groovy的许多代码是使用java实现的,其余部分是用groovy实现的,当你使用groovy编程的时候,许多情况下你正在写特殊的java程序,在java平台上的所有强大功能——包括大量的java类库也可以直接在groovy中使用。
QLExpress简介
由阿里的电商业务规则、表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制等强需求而设计的一门动态脚本引擎解析工具。 在阿里集团有很强的影响力,同时为了自身不断优化、发扬开源贡献精神,于2012年开源。 QLExpress脚本引擎被广泛应用在阿里的电商业务场景,具有以下的一些特性:
1、线程安全,引擎运算过程中的产生的临时变量都是threadlocal类型。?
2、高效执行,比较耗时的脚本编译过程可以缓存在本地机器,运行时的临时变量创建采用了缓冲池的技术,和groovy性能相当。?
3、弱类型脚本语言,和groovy,javascript语法类似,虽然比强类型脚本语言要慢一些,但是使业务的灵活度大大增强。?
4、安全控制,可以通过设置相关运行参数,预防死循环、高危系统api调用等情况。
?5、代码精简,依赖最小,250k的jar包适合所有java的运行环境,在android系统的低端pos机也得到广泛运用。
限于篇幅,笔者只是列举了这四种Aviator、IKExpression、QLExpress、Groovy表达式引擎。没有再枚举更多的脚本引擎,对这四种脚本引擎也没有充分展开原理介绍,介于个人知识能力,一下列表的总结只是个人的一个看法和建议
表达式引擎 | 特点 | 适用场景 |
Aviator | 1.轻量级:jar包只有几百kb 2.性能高:通过使用字节码编译和执行优化技术直接将表达式翻译成java字节码 | 高并发大数据规模处理和实时计算场景 |
IKExpression | 1.轻量级 2.性能不高:基于解释执行方式,相对较慢 3.语法简单,适合基本表达式求值 | 适用小型应用和嵌入式系统 |
QLExpress | 1.轻量级:jar是有几百kb 2.支持复杂表达式计算 3.性能较高:使用JIT编译优化技术 4.安全可控 | 适用性能较高且需要执行复杂表达式的运算的应用 |
Groovy | 1.重量级:开发引入大量的依赖jar 2.性能高 | 适用追求性能的应用 |
在仿简道云公式函数实战中,我们主要采用QLExpress表达式引擎,在后面的课程中,我们主要学习使用QLExpress。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!