规则引擎相关设计| 青训营笔记

46 阅读3分钟

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

规则引擎是一种嵌入在应用服务中的组件,可以将灵活多变的业务决策从服务代码中分离出来。通过使用预定义的语义模块来编写业务逻辑规则。在执行时接受数据输入、解释业务规则,并做出决策。规则引擎能大大提高系统的灵活性和扩展性。

在字节跳动,规则引擎已经在风控识别、活动运营、配置下发等场景得到了广泛的应用。开发人员可以将业务逻辑与服务代码解耦,实现灵活、高效的业务策略发布。目前公司内部基于规则引擎的动态决策系统已经承接了千万级别QPS的决策请求。

  • 编译的概念:
-   编译的过程发生了什么?
-   一般分为哪几个步骤,每个步骤的中间结果是什么?
  • 词法分析:

    • 词法如何表示?| 正则文法
    • 词法分析阶段的输出是什么
    • 词法分析阶段是怎么做的?
    • 词法分析可能会产生什么问题?
    • 如何解决词法分析过程中产生的问题?| 左递归问题怎么解决
  • 语法分析

    • 语法如何表示?上下文无关语法、巴克斯范式怎么理解
    • 语法分析阶段的输出是什么? 一般怎么表示
    • 语法分析有哪些方式?什么是递归下降算法?
  • 抽象语法树

    • 抽象语法树是什么?
    • 抽象语法树如何执行?
  • 类型检查

    • 类型检查怎么做?有哪些方式?
    • 类型检查什么时候做?有什么区别?

解释型语言和编译型语言

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

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

编程语言为什么不用人类的语言(自然语言),而是用上下文无关的文法呢? 因为

  1. 便于设计编译器。 客观上技术目前无法实现,如果使用了上下文相关文法,那就是真正实现了人工智能,NLP领域将会有重大突破。

  2. 便于代码开发维护。 如果开发出来的代码像高考的语文阅读理解一样,每个人都有不同的理解,那么,到底哪个才是作者真正想要表达的?如果人类都确定不了含义,那计算机同样也确定不了,最终结果就是错误执行或无法执行。

  3. 汇编语言/机器语言是上下文无关的。CPU执行指令时,读到哪条执行哪条。如果CPU需要考虑上下文,来决定一个语句到底要做什么,那么CPU执行一条语句会比现在慢千倍万倍。考虑上下文的事情,完全可以用户在编程的时候用算法实现。既然机器语言是上下文无关的,那高级语言也基本上是上下文无关的,可能有某些个别语法为了方便使用,设计成了上下文相关的,比如脚本语言的弱类型。在便于使用的同时,增加了解析器的复杂度。