这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
主要记录课程的重点和课上所讲项目的每一步以及我的思考
1.认识规则引擎
规则引擎的定义
规则引擎是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接收数据输入,解释业务规则,并根据业务规则做出业务决策。
规则引擎的组成
主要由三个部分组成
- 数据输入
支持接受使用预定义的语义编写的规则作为策略集,比如 price > 500,接受业务的数据作为执行过程中的的参数,比如价格、标签等
- 规则理解
能够按照预先定义的词法、语法、优先级、运算符等正确理解业务规则所表达的语义
- 规则执行
根据执行时输入的参数对策略集中的规则进行正确的解释和执行。同时对规则执行过程中的数据类型进行见擦汗,确保执行结果正确
规则引擎的应用场景
- 风险对抗
与黑灰产的对抗过程中,策略研发和产品需要能够根据黑灰产特征进行快速识别和对抗。规则引擎作为风控系统的核心,使产研人员能够不断的调整和优化对抗策略,以实现最好的风控识别效果。
- 活动策略运营
业务活动的运营需要及时根据用户效果反馈进行运营策略的优化和调整。引入规则引擎后,可以将服务代码与业务运营逻辑解耦,提高运营策略的迭代效率,方便新玩法的探索和效果验证。
- 数据分析和清洗
在数据分析系统中使用规则引擎可以便捷的实现对数据进行整理、清洗和转换。数据分析师可以根据不同的需求来自定义数据处理的规则,方便快捷的产出所需要的数据。
2.编译原理基本概念
词法分析
词法分析就是把源代码字符串转换为词法单元(Token)的这个过程。
就像' 李想通过了青训营选拔 ',分割为'李想;通过了;青训营选拔'
我们需要用到有限自动机(Finite-State Automaton)来识别Token
有穷状态机的作用是描述对象在它的生命周期内所经历状态序列,以及如何响应来自外界的事件。有穷状态机首先包含一个有限状态的集合,还包含了从一个状态到另外一个状态的转换。
有穷自动机看上去就像是一个有向图,其中状态是图的(椭圆形)节点,而状态转换则是图的边。此外这些状态中还必须有一个初始状态(START)和至少一个接受状态(DONE)。
具体实现:对源文件从头到尾进行扫描,从头开始扫描,这个时候扫描程序首先要询问当前的字符是不是空格,若是空格,则继续扫描下一个字符,直至不是空格,然后询问这个字符是不是字母,若是则进行标识符和保留字的识别;若这个字符为数字,则进行数字的判断。否则,依次对这个字符可能的情况进行判断,若是将所有可能都走了一遍还是没有知道它是谁,则认定为错误符号,输出该错误符号,然后结束。每次成功识别了一个单词后,单词都会存在token[ ]中。然后确定这个单词的种别码,最后进行下一个单词的识别。这就是扫描程序进行的工作,可以说这个程序彻底实现了确定有限自动机的某些功能,比如说识别标识符,识别数字等。为了简单起见,这里的数字只是整数。
语法分析
语法分析就是在词法分析的基础上,识别表达式的语法结构的过程
以之前的'李想通过了青训营选拔'为例,李想是主语,通过了是谓语,青训营选拔是宾语
抽象语法树
在语法分析的基础上,我们可以为表达式构造抽象语法树
抽象语法树(abstract syntax code,AST)是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,之所以说是抽象的,抽象表示把js代码进行了结构化的转化,转化为一种数据结构。这种数据结构其实就是一个大的json对象,json我们都熟悉,他就像一颗枝繁叶茂的树。有树根,有树干,有树枝,有树叶,无论多小多大,都是一棵完整的树。
简单理解,就是把我们写的代码按照一定的规则转换成一种树形结构。
上下无关语法
语言句子无需考虑上下文,就可以判断正确性。可以使用巴科斯范式(BNF)来表达
exp : add ;
add : add '+' mul | mul; //加法表达式 a+b+c a+b*c
mul : mul '*' pri | pri; //乘法表达式 a*b*c
pri : string | bool | number | identifer; //基础表达式 weight | 20 | "abcde"
递归下降算法
递归下降算法就是自顶向下构造语法树,不断的对Token进行语法展开(下降),展开过程中可能会遇到递归的情况
类型检查
- 类型综合
根据子表示的类型构造出父表达式的类型。例如,表达式 A+B 的类型是根据 A 和 B 的类型定义的
- 编译时检查 & 运行时检查
类型检查可以发生在表达式的编译阶段,即在构造语法树的阶段;也可以发生在执行时的阶段
3.引用参考
该文章部分内容来自于以下课程或网页:
- 字节录播课:规则引擎设计与实现