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列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最