这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
规则引擎是一种嵌入在应用服务中的组件,可以将灵活多变的业务决策从服务代码中分离出来。通过使用预 定义的语义模块来编写业务逻辑规则。在执行时接受数据输入、解释业务规则,并做出决策。规则引擎能大大提高系统的灵活性和扩展性。
规则引擎的实现需要在满足大容量、高请求、低延迟的基础上尽可能做到简单易上手。
简单的规则引擎实际上就是曾经学过的编译原理,解析一门语言。如果源代码编译后要在操作系统上运行,那目标代码就是汇编/机器代码。如果编译后是在虚拟机里执行,那目标代码就可以不是汇编代码,而是一种解释器可以理解的中间形式的代码即可。
解释型语言和编译型语言
编译型语言:提前把代码一次性转换完毕就是编译型语言,用的转换工具就叫编译器,比如C、C++、Go。一次编译可重复执行,但是编译后产物不能跨平台,不同系统对可执行文件的要求不同。
解释性语言:一边执行一边转化,函数调用到哪里就将其编译到哪里。转化工具叫虚拟机或者解释器,比如java python、javascript
Java 和 Python
- Java既有编译又有解释。但是编译并没有直接编译成机器码,而是编译成字节码,然后再放到虚拟机中执行。
- Python执行过程也是经过两个阶段,先编译成字节码 .pyc 再放到虚拟机中去执行
虚拟机: 对于二进制字节码进行解释,从历史上看,Java 是为解释二进制字节码而设计和实现的
解释器:对程序文本进行解释,Python 最初是为解释程序文本而设计和实现的。
词法分析
把源代码字符串转换为词法单元(Token)的这个过程。状态转换图是设计词法分析程序的一种模型。它是一张有限方向图,结点表示状态,结点之间的箭弧上有字符,表示遇到该字符就将其读进来,并且转换到另一个状态。
确定的有限自动机 DFA | Deterministic Finite Automaton 状态转换图是制造词法分析器的模型,不过这个模型过于具体,我们应该想个办法,用一种更接近数学的、更为形式化的方法来表示状态转换图。而这种状态转化图的形式化表达,就是有限自动机。
语法分析
词法分析是识别一个个的单词,而语法分析就是在词法分析的基础上识别出程序的语法结构。这个结构是一个树状结构。这棵树叫做抽象语法树(Abstract Syntax Tree,AST)。树的每个节点(子树)是一个语法单元,这个单元的构成规则就叫“语法”。每个节点还可以有下级节点。
语法分析树
语法分析树是语言推导过程的图形化表示方法。这种表示方法反映了语言的实质以及语言的推导过程。
定义:对于 CFG G 的句型,分析树被定义为具有下述性质的一棵树:
- 根由开始符号所标记;
- 每个叶子由一个终结符、非终结符或 ε 标记;
- 每个内部节点都是非终结符;
上下文无关语法 Context-Free Grammar
- 每个产生式就是一个子树,在写编译器时,每个子树对应一个解析函数。
- 叶子节点叫做 终结符,非叶子节点叫做 非终结符。
递归下降算法 Recursive Descent Parsing
基本思路就是按照语法规则去匹配 Token 串。