规则引擎设计与实现 | 青训营笔记

81 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第7天

重点概览

  • 认识规则引擎
  • 编译原理的基本概念
  • 设计一个规则引擎
  • 规则引擎的实现

详细介绍

什么是规则引擎

如下图所示:

image-20230131195408414.png

在商城项目中经常涉及到积分,面对不同的情况要用代码实现不同的业务逻辑,而规则引擎实现了将业务决策从应用程序中分离出来,如上图。

这样可以解决业务开发人员重复编码的问题,将业务决策与服务本身解耦,提高服务的可维护性,并且缩短了开发路径,提高效率。

规则引擎是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。

规则引擎的组成:

  1. 数据输入
  2. 规则理解
  3. 规则执行

应用场景:

  1. 分控对抗中帮助产研人员能够不断调控和优化对抗策略
  2. 活动策略运营
  3. 数据分析和清洗

编译原理基本概念

  • 词法分析:把源代码字符串转换为词法单元(Token)的过程
  • 语法分析:在词法分析的基础上识别除表达式的语法结构
  • 抽象语法树:表达式抽象语法结构的树状表示,对于一个表达式,抽象语法树是唯一确定的
  • 类型检查:验证执行的结果是否为合适的数据类型。在抽象语法树中通常会验证某结点的子节点的数据类型是否合法

有限自动机(Finite-State Automation)

词法分析过程中利用有限自动机识别Token,其本质是一个状态机,状态数量有限。该状态机在任何一个状态,基于输入的字符都能做一个确定的状态转换

拓展

什么是编译

编译的过程就是 把某种语言的源程序,在不改变语义的条件下,转换成另一种语言程序(目标语言程序)

be32c9bd4c234fecb66e183ba7bc83actplv-k3u1fbpfcp-zoom-in-crop-mark4536000.webp

  • 如果源代码编译后要在操作系统上运行,那目标代码就是汇编/机器代码。
  • 如果编译后是在虚拟机里执行,那目标代码就可以不是汇编代码,而是一种解释器可以理解的中间形式的代码即可。

解释型语言和编译型语言

  • 有的语言提前把代码一次性转换完毕,这种就是编译型语言,用的转换工具就叫编译器,比如C、C++、Go。一次编译可重复执行

    • 编译后产物不能跨平台,不同系统对可执行文件的要求不同。.exe
    • 特殊的,c、c++、汇编、源代码也不能跨平台
  • 有的语言则可以一边执行一边转化,用到哪里了就转哪里,这种就是解释性语言,用的转化工具叫虚拟机或者解释器,比如java python、javascript

a98e9ce76f8a4b2384914f8ad088541ftplv-k3u1fbpfcp-zoom-in-crop-mark4536000.webp

关于 Java Python .

  • Java既有编译又有解释。但是编译并没有直接编译成机器码,而是编译成字节码,然后再放到虚拟机中执行。
  • Python执行过程也是经过两个阶段,先编译成字节码 .pyc 再放到虚拟机中去执行

JVM 和 Python解释器 | 为什么一个叫虚拟机一个叫解释器

  1. “虚拟机”对二进制字节码进行解释,而“解释器”是对程序文本进行解释。
  2. 从历史上看,Java 是为解释二进制字节码而设计和实现的,而 Python 最初是为解释程序文本而设计和实现的。因此,“Java 虚拟机”这个术语在 Java 社区中具有历史意义并且非常成熟,“Python 解释器”这个术语在 Python 社区中具有历史意义并且非常成熟。人们倾向于延长传统并使用很久以前使用的相同术语。
  3. 对于 Java,二进制字节码解释是程序执行的主要方式,而 JIT 编译只是一种可选的和透明的优化。而对于 Python,目前,程序文本解释是 Python 程序执行的主要方式,而编译成 Python VM 字节码只是一种可选的透明优化。

作者:青训营官方账号 链接:juejin.cn/post/719336… 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

总结

规则引擎(Rule Engine)是一种专门用于实现业务规则软件系统

它可以通过对业务规则的描述、存储、执行和维护来实现自动化的业务决策和处理。

规则引擎通常采用规则语言、事实语言和推理引擎等技术来实现。

规则引擎可以帮助企业和组织将业务知识和经验转化为易于理解和维护的规则,从而提高业务流程的效率和灵活性