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。

  • 20
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB App设计是一种用于创建交互式计算机应用程序的强大工具。它可以帮助开发人员快速设计和构建符合特定需求的应用程序,使用户能够进行各种计算和数据处理操作。 对于简单的函数表达式运算,MATLAB App设计可以提供简洁而直观的界面,让用户能够轻松输入和计算各种函数表达式。在设计中,我们可以为用户提供一个文本框,用于输入函数表达式,以及若干个按钮,用于进行不同的运算。 在设计过程中,我们可以使用MATLAB的数学函数库,例如sin、cos、sqrt等,来处理用户输入的函数表达式。此外,我们还可以添加错误检查机制,以确保用户输入的表达式是有效的,并提供错误提示信息。 在应用程序的界面上,我们可以显示函数表达式的计算结果,以及可能的图形化表示。其中,结果可以显示为一个文本框或一个图形窗口,这取决于具体的需求。 在实际使用中,用户可以通过输入函数表达式并点击相应的按钮来实现特定的运算。例如,用户可以输入一个简单的数学表达式,如 "sin(x) + cos(x)",然后点击计算按钮。应用程序将解析表达式并计算结果,将其显示在界面上。 MATLAB App设计可根据具体的需求进行扩展和定制,以满足更复杂的应用场景。我们可以添加更多的计算功能,例如求导、积分等,或者提供额外的数据输入和输出选项,以使应用程序更加灵活和实用。 综上所述,MATLAB App设计是一种强大的工具,可以帮助我们设计简单的函数表达式运算应用程序。通过提供直观的界面和丰富的计算功能,它可以帮助用户轻松进行各种函数表达式的计算和数据处理操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值