02.仿简道云公式函数实战-表达式引擎

2023-12-11 10:12

本文主要是介绍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。

这篇关于02.仿简道云公式函数实战-表达式引擎的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/480322

相关文章

Python在二进制文件中进行数据搜索的实战指南

《Python在二进制文件中进行数据搜索的实战指南》在二进制文件中搜索特定数据是编程中常见的任务,尤其在日志分析、程序调试和二进制数据处理中尤为重要,下面我们就来看看如何使用Python实现这一功能吧... 目录简介1. 二进制文件搜索概述2. python二进制模式文件读取(rb)2.1 二进制模式与文本

Django调用外部Python程序的完整项目实战

《Django调用外部Python程序的完整项目实战》Django是一个强大的PythonWeb框架,它的设计理念简洁优雅,:本文主要介绍Django调用外部Python程序的完整项目实战,文中通... 目录一、为什么 Django 需要调用外部 python 程序二、三种常见的调用方式方式 1:直接 im

Mybatis对MySQL if 函数的不支持问题解读

《Mybatis对MySQLif函数的不支持问题解读》接手项目后,为了实现多租户功能,引入了Mybatis-plus,发现之前运行正常的SQL语句报错,原因是Mybatis不支持MySQL的if函... 目录MyBATis对mysql if 函数的不支持问题描述经过查询网上搜索资料找到原因解决方案总结Myb

SpringBoot整合 Quartz实现定时推送实战指南

《SpringBoot整合Quartz实现定时推送实战指南》文章介绍了SpringBoot中使用Quartz动态定时任务和任务持久化实现多条不确定结束时间并提前N分钟推送的方案,本文结合实例代码给大... 目录前言一、Quartz 是什么?1、核心定位:解决什么问题?2、Quartz 核心组件二、使用步骤1

SpringBoot整合AOP及使用案例实战

《SpringBoot整合AOP及使用案例实战》本文详细介绍了SpringAOP中的切入点表达式,重点讲解了execution表达式的语法和用法,通过案例实战,展示了AOP的基本使用、结合自定义注解以... 目录一、 引入依赖二、切入点表达式详解三、案例实战1. AOP基本使用2. AOP结合自定义注解3.

Python容器转换与共有函数举例详解

《Python容器转换与共有函数举例详解》Python容器是Python编程语言中非常基础且重要的概念,它们提供了数据的存储和组织方式,下面:本文主要介绍Python容器转换与共有函数的相关资料,... 目录python容器转换与共有函数详解一、容器类型概览二、容器类型转换1. 基本容器转换2. 高级转换示

C语言逗号运算符和逗号表达式的使用小结

《C语言逗号运算符和逗号表达式的使用小结》本文详细介绍了C语言中的逗号运算符和逗号表达式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接其一般形式为:表达

Java 队列Queue从原理到实战指南

《Java队列Queue从原理到实战指南》本文介绍了Java中队列(Queue)的底层实现、常见方法及其区别,通过LinkedList和ArrayDeque的实现,以及循环队列的概念,展示了如何高效... 目录一、队列的认识队列的底层与集合框架常见的队列方法插入元素方法对比(add和offer)移除元素方法

Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

《SpringBoot基于JWT优化SpringSecurity无状态登录实战指南》本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤... 目录Spring Boot 实战:基于 JWT 优化 Spring Security 无状态登录一、先搞懂:为什

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.