这是我参与「第五届青训营」伴学笔记创作活动的第 7 天
1. 概述
我将主要介绍如下知识点:
- 规则引擎的定义和组成
- 编译原理基本概念
2. 规则引擎
2.1 定义
规则引擎是一种嵌入在应用服务中的组件,可以将灵活多变的业务决策从服务代码中分离出来,并使用预定义的语义模块来编写业务逻辑规则。在执行时接受数据输入,解释业务规则,并根据业务规则做出业务决策。
规则引擎能大大提高系统的灵活性和扩展性,解决开发人员重复编码的问题,缩短开发路径,提高效率
2.2 组成部分
数据输入:
接受使用预定义的语义编写的规则作为策略集。比如 “price > 500”接受业务的数据作为执行过程中的参数。如价格、标签等
规则理解:
- 能够按照
预先定义的词法、语法、优先级、运算符等正确理解业务规则所表达的语义
规则执行:
- 根据执行时输入的参数对策略集中的规则进行正确的解释和执行
- 同时对规则执行过程中的数据类型进行检查,确保执行结果正确
2.3 应用场景
风控对抗:
-
与黑灰产的对抗过程中,策略研发和产品需要根据黑灰产特征进行快速识别和对抗
-
规则引擎作为风控系统的核心,使产研人员能够不断的调整和优化对抗策略,以实现最好的风控识别效果
举个例子:在风控系统中,因为风控的逻辑在不断的发生一个改变,如果我们在代码中写死,那么发生一个改变就改一下代码、上一下线,这明显是不能接受的。所以我们需要规则引擎去改变这个现状,通过高效可靠的方式去做这些业务规则的改变
活动策略运营:
-
业务活动的运营需要及时根据用户效果反馈进行运营策略的优化和调整
-
规则引擎可以将服务代码与业务运营逻辑解耦,提高运营策略的迭代效率,方便新玩法的探索和效果验证
数据分析和清洗:
-
在数据分析系统中使用规则引擎可以便捷的实现对数据进行整理、清洗和转换
-
数据分析师可以根据不同的需求来自定义数据处理的规则,方便快捷的产出所需要的数据
3. 编译原理基本概念
规则引擎的本质就是我们自己定义一套语法,然后去解析用这套语法写的表达式,然后根据解析的内容执行表达式。
这个过程其实就是编译和执行的过程,所以需要了解编译原理里面一些相关的内容。
3.1 词法分析
概念:把源代码字符串转换为词法单元(Token)的过程
词法分析是编译的第一个阶段,其任务是:从左至右逐个字符地对源程序(用高级语言编写的)进行扫描,产生一个个单词符号,把字符串形式的源程序改造成为单词符号串形式的中间程序
举例:
如何识别 Token?
- 有限自动机:就是一个状态机,它的状态数量是有限的。该状态机在任何一个状态,基于输入的字符,都能做一个确定的状态转换
3.2 语法分析
概念:在词法分析的基础上识别出表达式的语法结构
举例:
3.3 抽象语法树
概念:抽象语法树(Abstract Syntax Tree,AST),表达式抽象语法结构的树状表示,对于一个表达式,抽象语法树一定是唯一确定的
树的每个节点(子树)是一个语法单元,这个单元的构成规则就叫“语法”,每个节点还可以有下级节点
举例:
Token -> AST:
-
上下文无关语法 Context-Free Grammar语言句子无需考虑上下文,就可以判断正确性
例如:
... a = 0; ...这是一个赋值语句,无论此语句的前后是什么代码,此语句所代表的操作是确定的,即给变量a赋值等于0
-
巴科斯范式 BNFBNF 是描述上下文无关理论的一种具体方法,通过BNF可以实现上下文无关文法的具体化、公式化、科学化,是实现代码解析的必要条件
BNF 本质上就是树形分解,分解成一棵抽象语法树
-
递归下降算法 Recursive Descent Parsing就是自顶向下构造语法树
不断对 Token 进行语法展开(下降),展开过程中可能会遇到递归的情况
3.4 类型检查
类型综合:
- 根据子表达式的类型构造出父表达式的类型。例如,表达式 A + B 的类型是根据 A 和 B 的类型定义的
编译时检查 & 运行时检查:
类型检查可以发生在表达式的编译阶段,即在构造语法树的阶段,也可以发生在执行时的阶段
- 编译时:需要提前声明参数的类型,在构造语法树过程中进行类型检查
- 运行时:可以根据执行时的参数输入的值类型,在执行过程中进行类型检查
4. 总结
编译原理被誉为"程序员的三大浪漫"之一,可见这块知识的深度与广度,这里也只是简单的介绍一下里面与规则引擎相关的概念,感兴趣的同学可以自行查阅相关知识
参考:
- 字节内部课:规则引擎设计与实现