知识卡片

解释器风格与基于规则的系统风格对比

普通读书笔记卡

内容

解释器风格用一个程序(解释引擎)来执行另一个程序,本质是针对不同硬件平台实现一台虚拟机,把高抽象层次的程序翻译为低抽象层次能理解的指令,以弥合程序语义所期望的与硬件实际提供的计算引擎之间的差距——它由正在被解释执行的伪码(源代码+中间代码)和解释引擎(语法+解释器定义+当前执行状态)组成。优点是有利于实现程序可移植性和跨平台能力,也能对未来硬件做模拟仿真、降低测试复杂度和成本;缺点是额外的间接层次会拖慢系统性能,例如不引入JIT技术时Java应用运行速度会明显偏慢。以JVM为例:Java源程序先经编译器转成与硬件平台无关的.class字节码文件,再由JVM通过字节码解释器(逐条解释执行)或JIT编译器(运行时把被频繁执行的代码段编译为本机目标代码,而非全部编译)执行,从而实现”一次书写,到处运行”。基于规则的系统风格的动机来自另一个问题:业务需求频繁变化,若每次变化都要程序员改代码,效率低、成本高,且业务需求原本是自然语言、被写成代码后会因”语义鸿沟”变得难以理解——因此把频繁变化的业务逻辑抽取成独立的规则库(业务逻辑=固定业务逻辑+可变业务逻辑规则+规则引擎),规则用IF…THEN…形式书写、由规则引擎在运行时根据当前状态做模式匹配、选出并解释执行匹配的规则。书中明确指出基于规则的系统风格的基本组件与解释器风格相似(都需要一个”解释”当前状态/规则的引擎),优缺点也基本一致——两者的本质区别只在于被解释的对象:解释器解释的是通用程序指令,基于规则的系统解释的是业务规则。

参考来源

- 位置:《软件架构理论与实践》第4章《软件架构的风格与模式》"4.3.6 解释器风格"及"4.3.7 基于规则的系统风格"节(源文件:_epub-src/OEBPS/text00034.html) - 结论依据:原文说明解释器"将高抽象层次的程序翻译为低抽象层次所能理解的指令",并给出JVM字节码解释器与JIT编译两种执行方式;随后说明"基于规则的系统风格的基本组件与解释器风格的组件相似",并给出"业务逻辑=固定业务逻辑+可变业务逻辑(规则)+规则引擎"的公式,直接支撑本卡片结论。 - 原始内容:基于规则的系统风格的基本组件与解释器风格的组件相似……优缺点分析:基于规则的系统风格的优缺点与解释器风格类似。业务逻辑=固定业务逻辑+可变业务逻辑(规则)+规则引擎。