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

158 阅读4分钟

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

内容源于青训营课堂视频以及一些go文档和自己的经验、理解,若有错误欢迎及时指出

1 认识规则引擎

  • 什么是规则引擎
  • 规则引擎的组成
  • 应用场景

定义

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

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

组成

  • 数据输入:支持接受使用预定义的语义编写的规则作为策略集,接受业务数据作为执行过程中的参数
  • 规则理解:能够按照预先定义的词法、语法、优先级、运算符等正确理解业务规则所表达的语义
  • 规则执行:根据参数对规则进行正确的解释和执行,同时检查数据类型

应用场景

  • 风控对抗
  • 活动策略运营
  • 数据分析和清洗

2 编译原理基本概念

2.1 词法分析

  • 由词法分析器(Lexical Analyzer)完成,词法分析器又称为扫描器(scanner)
  • 词法分析器从左到右扫描字符串,并将其转换成单词串;同时要查词法错误,进行标识符登记(符号表的管理)
  • 输入:字符串
  • 输出:种别码,属性值——序对
    • 属性值——token的机内表示

2.2 语法分析

  • 由语法分析器(Syntax Analyzer)完成,又叫做Parser
  • 功能:
    • 组词成句:将词组成各类语法成分,例如因子、项、表达式、语句、子程序
    • 构造分析树
    • 指出语法错误
    • 指导翻译
  • 输入:token序列
  • 输出:语法成分

2.3 语义分析

  • 一般和语法分析同时进行,称为语法制导翻译
  • **功能:**分析由语法分析器识别出来的语法成分的语义
    • 获取标识符的属性:类型、作用域等
    • 语义检查:运算的合法性、取值范围等
    • 子程序的静态绑定:代码的相对地址
    • 变量的静态绑定:数据的相对地址

2.4 中间代码生成

  • 语义分析通常以中间代码形式表达操作
  • 特点:
    • 简单规范
    • 与机器无关
    • 易于优化与转换

2.5 代码优化

过早的优化是万恶之源,让正确的程序更快,要比让快速的程序正确容易得多

将最多的努力投入到运行消耗时间最多的那部分代码中

  • 尽量节省存储空间、更快、更高效
  • 优化变换必须是等价的
  • 分为与机器无关的优化、与机器有关的优化

2.6 目标代码生成

  • 编译程序的最后一个阶段
  • 为中间代码中出现的运算对象分配存储单元、寄存器等
  • 将中间代码转为目标机的机器指令代码或汇编代码

2.7 错误处理

  • 进行各种错误的检查、报告、纠正以及相应的续编译处理(错误的定位与局部化)
    • 词法分析阶段:拼写方面的错误,出现非法字符等
    • 语法分析阶段:表达式、句子或程序结构等错误
    • 语义分析阶段:类型匹配错误、参数匹配错误、非法转移问题等

2.8 表格管理

各种符号表

“数据结构与算法”的应用

3 设计一个规则引擎

目标

设计一个规则引擎,支持特定的词法、运算符、数据类型和优先级。并支持基于以上预定义语法的规则表达式的编译和执行

  • 词法
  • 运算符
  • 数据类型
  • 优先级

词法分析

设计词法分析的状态机

语法分析

  • 优先级的表达
  • 语法树的结构

语法树执行与类型检查