案例研究之聊聊 QLExpress 源码 (二)
上一篇从官网系统性的进行了功能和背景说明,本篇从架构图方面带你进行下了解
二、架构图
2.1、架构模块
架构模块我们可以根据包名/模块名进行拆解,并标注阅读顺序,方便拆解架构模块并阅读。
2.2、架构分析
从架构图中我们可以看到我们可以大致划分为 3 个区域
指令解析
应用上下文加载内容
组建化自定义化
2.2.1、指令解析
首先我们看下第一块区域,指令解析。
上图中这块部分是否似曾相识,我们回顾下 Java 中是如何编译的?以下是之前我描绘的编译过程的解析步骤的 case 案例。具体的可以参考Java语言的编译原理
假设我们现在需要计算工资总和, 工资总和=薪酬+年终奖,第一步为词法分析,其实就是 token 分解,将每个词进行拆解,而这个拆解依赖于符号表
根据符号表便可以进行语法分析建立抽象语法树,然后进行语义分析,生成指令集合。
QLExpress 在指令解析的时候如 Java 的指令解析类似,会将输入脚本(提前定义好的脚本)->将表达式进行 token 分解->token 解析->AST 文法匹配->最终生产指令集合。这里猜测当时的借鉴思想来源于 Java。
2.2.2、应用上下文加载内容
上下文对象类似 Mybatis 中的全局 configuration,Spring 中的全局 Configuration 上下文所有内容,它可以将上下文内容全部拿到内存中进行读取-分析-计算-结果输出。
2.2.3、组件化自定义化
一个好的框架定义之开始需要保证良好扩展性,以及可以支持外部自定义配置等需求,而这个模块组件化提供了预定义的一些模块功能,也提供了可以外部用户自定义的函数和属性,操作符号来满足自定义化场景需求。
本篇简单的从架构图和模块解析让大家有个简答的入门了解,下一篇将开始阅读源码了!
版权声明: 本文为 InfoQ 作者【小诚信驿站】的原创文章。
原文链接:【http://xie.infoq.cn/article/6d94f63187b0335fb98f9149c】。文章转载请联系作者。
评论