这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
(还没写完,先发一下w
今天的作业是实现一个在线规则引擎,咕咕如我之前一直没做过课后作业,那今天就尝试做一下叭orz
我的作业项目代码放在这里了:
btw 在最开头放一下我的学习时间,以供参考:
总计:
-
看文档:1h
-
看网课:
-
写博客:
1. 项目要求
使用Hertz框架开发一个HTTP服务,服务使用mysql,支持表达式的增删查改和编译执行。 并实现以下接口:
- 直接表达式执行
- 新增表达式
- 查询表达式
- 删除表达式
具体接口文档见:【后端专场 学习资料三】第五届字节跳动青训营
2. 前置知识学习
很好,我没学过编译原理;
很好,hertz小项目咕咕了没做;
很好,规则引擎是啥听都没听过;
...
但是我想学!(燃起来了bushi
小猫🐱和小狗🐶的故事
拿人话说:规则引擎实现业务决策和应用程序代码的解耦 这好像也不太像人话...
举个🌰,规则引擎就像是一个翻译软件,业务说的是小猫话(一些规则的决策),没有翻译软件的时候,开发需要充当翻译人员,把业务的小猫话翻译成小狗话(产出能实现业务逻辑的代码);有了翻译软件,业务的小猫话直接输入翻译软件就能自动生成小狗话,不需要开发人员来翻译,开发只需要负责这个翻译软件,也就是规则引擎的开发
规则引擎vs编译器
看到这里,我不禁用仅有的一点知识储备感慨:规则引擎和编译器就莫名的像啊!
主要分为三个部分:
- 理解:词法分析 + 语法分析
- 执行:抽象语法树
- 输入输出:参数注入 + 类型检查
理解
-
词法分析:基于有限状态机遍历整个表达式,输出一系列Token(词法单元)给下一阶段
-
语法分析:指在词法分析的基础上识别表达式的语法结构的过程;表达式的语法结构可以用树来表示,叫抽象语法树
-
上下文无关语法:无需考虑上下文,用BNF(巴科斯范式来表达
-
递归下降算法:自顶向下构造语法树
-
执行
- 类型检查:
- 类型综合:根据子表达式的类型构造出父表达式的类型
- 编译时检查 && 运行时检查:类型检查可以发生在表达式的编译阶段,即构造语法树阶段;也可以发生在执行时的阶段
3. 实现思路
- 设计词法分析状态机
4. 在线规则引擎的具体实现
5. 更多优化的地方
6. 最后,对于学习方法的思考
这篇博客就到这里啦,如果你觉得看完我的博客有所收获的话,那我或许还算做出了一点微小的贡献w我的实现还存在很多不完善的地方,希望各位大佬可以在评论区多多留言讨论 || 提issue,欢迎来互fo~