软件体系结构描述 — Part 4
主讲:周立新(北京大学软件与微电子学院) 课程:0B105 软件体系结构(Lecture-6-7) 来源:田浩然上传的资料 页数:119页
概述
本讲是软件体系结构课程的 Part 4,系统介绍软件体系结构(SA)的描述方法。从描述方法分类出发,先介绍 IEEE 1471 标准和 Medvidovic 内容框架,再深入四种形式化方法(Z标记语言、CSP、化学抽象机CHAM、π演算),然后详细讲解五种典型的体系结构描述语言(ADL):ACME、Wright、UniCon、Darwin,以及 Aesop/MetaH/C2/SADL 等其他 ADL,最后讨论 SA 与 UML 的关系。
一、SA 描述概述
1.1 四种 SA 描述方法
| 方法 | 特点 | 不足 |
|---|---|---|
| 图形工具 | 矩形框+线,直观易理解 | 缺乏精确语义 |
| 模块内连接语言(MIL) | 用传统程序设计语言的模块连接机制,有严格语义基础 | 描述高层抽象系统元素的能力不够 |
| 基于软构件的系统描述语言 | 以构件为单位描述 | 面向特定应用、层次较低,不适合 SA 级描述 |
| ADL(体系结构描述语言) | 吸收高级语言语义精确 + SA 整体性和抽象性,定义适合 SA 表达的抽象元素 | 已有十几种,尚未统一 |
ADL 是当前软件开发和设计方法学中发展最快的 SA 描述方法。
1.2 IEEE 1471 标准(SA 描述框架标准)
- 通过时间:2000年9月21日
- 适用范围:软件密集的系统
- 六项要求:
- SA 的存档要求
- 能识别人员及其关系
- SA 视点的选择与具体描述
- SA 视点
- SA 视点之间的一致性
- SA 原理
- 局限:仅提供概念框架和描述实践应遵循的规范,在具体描述技术方面缺乏指导
- 后续发展:Rational 结合 RUP、遵照 IEEE 1471 起草了用 UML 描述 SA 并提交给 OMG,渴望成为行业规范
1.3 SA 描述的两种观点
| 观点 | 主张 |
|---|---|
| 简单观 | SA 描述的角色是辅助理解和交流,ADL 必须简单可理解,采用图形化语法,不必追求形式化语义 |
| 形式化观 | 着重形式化的 ADL 语法和语义,开发分析工具、模型检测工具、编译器、代码合成工具、运行时支撑工具等 |
1.4 Medvidovic 的内容框架
SA 描述内容分为四大维度:
1. 构件(Component):接口、类型、语义、约束、演化、非功能属性
- 接口:与外部世界互操作点的集合
- 类型:可多次实例化、参数化复用,有助于对 SA 的理解
- 语义:构件行为的高层模型,增强 SA 的约束
- 约束:系统或其某一部分的属性或断言,不满足则导致某些需求不能被实现
- 演化:构件属性的修改(接口、行为、实现等)
- 非功能属性:安全性、性能、可移植性等,一般不能从行为中推理得出
2. 连接件(Connector):接口、类型、语义、约束、演化、非功能属性
- 接口:与构件或其它连接件之间互操作点的集合
- 类型:封装了构件通讯、协作和中间决策的抽象,支撑 SA 内部或之间的复用
- 语义:连接件行为的高层模型。构件语义表达应用层功能,连接件语义承担交互协议的规格说明
- 约束:确保连接件与交互协议的意图一致,增强边界条件
- 演化:连接件属性的修改(接口、语义、约束的变化等)
- 非功能属性:从语义规格说明派生,对系统运行时行为进行仿真
3. 体系结构配置(Configuration):可理解性、可构成性、可改进性和可追踪性、异质性、可扩展性、演化与动态机制、约束、非功能属性
- 可理解性:SA 作为早期通讯渠道,应采用简单易理解的语法
- 可构成性:允许在不同细节层次上描述 SA,可将复杂结构抽象在一个构件/连接件内部
- 可改进性和可追踪性:通过逐步正确、一致的改进,SA 才能成为可执行的系统;对执行过程中的变化提供追踪
- 异质性:帮助异质的构件和连接件完成 SA 的规格说明和开发
- 可扩展性:ADL 需要在构件和连接件层次增加对演化的支持(增删替换重连)
- 约束:对构件和连接件约束的补充,全局约束直接或间接地依赖于局部约束
- 非功能属性:ADL 提供处理复杂问题和规模问题
4. 工具支持:主动规格说明、多视图、分析、改进、实现生成、动态机制
- 主动规格说明:插入式或非插入式发现反馈信息,迫使设计师认识到相关情况
- 多视图:为不同人员(设计师、开发者、管理者、客户)提供合适的视图,并确保一致性
- 分析:在 SA 层面评估系统各方面的能力,降低后续出错概率和分析成本
- 改进:改进系统结构描述是复杂任务,常不能用形式化保证正确性和一致性
- 实现生成:软件设计和建模的最终目的是生成可执行程序
- 动态机制:用工具分析被修改的 SA,将 SA 表示中的变动映射到实现模块中
二、形式化的方法
2.1 Z 标记语言
- 提出:英国牛津大学 Programming Research Group
- 基础:一阶谓词逻辑 + 集合论,使用标准逻辑操作符(与/或/非/存在/全称/蕴涵)和集合操作符
- 用途:描述数学对象模型,可用来描述 SA。许多文献采用 Z 作为 SA 的形式化描述
(1) 数学基础
- 集合:枚举、构造、幂集 PX
- 序列(seq):元素重复且有顺序,有 head/tail/front/last 操作,可看成序偶对集合
- 逻辑操作符:与、或、非、存在、全程、蕴涵
(2) Z 规范基本概念
- PX:X 的幂集
- X×Y:叉乘积
- 关系/函数:叉乘积类型的特定子集
- seq X:X 元素的序列集合
- 偏函数:不必在定义域所有元素上定义的函数
- 全函数:在定义域所有元素上都定义的函数
- 入射函数(1-1函数):反函数也是偏函数
- 双射函数:一一对应函数
- ΔS:两个 S 的复制(S 和 S’)
- θS’ = θS:操作中架构 S 的成分没有变化
- 变量带 ? 为输入,带 ! 为输出
(3) 类型构造器——模板(Schema) Z 的核心构造机制。一个 Schema 包含:名称 + 状态变量 + 变量及其关系不变式。
示例:BlockHandler 文件系统块管理 Schema
- BlockHandler:定义 used/free 块集合、BlockQueue 队列,及不变式(used∩free=∅、used∪free=BLOCKS 等)
- RemoveBlock:ΔBlockHandler,描述从队列去掉第一个块的操作
- AddBlock:ΔBlockHandler,描述将块加入队列的操作
(4) 应用实例:基于事件的体系结构
- 构件抽象为(name, methods, events)三元组
- Event = CNAME × EVENT,Method = CNAME × METHOD
- EventSystem 由构件集合 + 事件管理器 EM 组成,含构件唯一性约束等
- 进一步细化为 MVC 风格:changed 事件触发 update 方法,dependents 关系定义依赖
2.2 通讯顺序进程 CSP
- 提出:C.A.R. Hoare(图灵奖获得者)1978 年提出
- 地位:进程代数的重要内容之一,广泛用于并发分布式设计的建模和分析
- 与 SA 的关系:Robert Allen 和 David Garlan 用 CSP 子集作为 SA 描述的语义模型基础,设计了 ADL——Wright
(1) 基础概念
- 进程:表示客观事物的行为模型(不同于 OS 进程)。例:自动售货机 P1 = coin → coca
- 进程三元组 (A, F, D):A 为字母表(参与的事件集合),F 为 failure 集合(回溯+拒绝事件集),D 为 divergence 集合
- 基本操作符:
- e → P:参与事件 e 后成为进程 P
- 外部选择(□):选择由环境决定
- 内部选择(⊓):选择由进程自己决定
- STOP:什么都不做的特殊进程
- √:成功执行的事件
- Wright 引入的符号:成功终止进程、let 定义、事件标记 e.l、e!x/e?x 通道收发
(2) SA 的 CSP 描述实例——Capitalize 管道-过滤器系统
系统结构:Split → Upper/Lower → Merge(管道过滤器风格,将字母转换大小写后合并)
Wright 系统定义结构:
- System Capitalize
- Component Split(In/Left/Right 端口)
- Component Upper / Lower / Merge
- Connector Pipe
- Instances + Attachments(端口绑定到连接件角色)
构件语义(CSP):
- Split 的 In 端口:重复读取数据,读到结束标志则关闭
- Split 的 Left/Right 端口:重复写数据,直到选择关闭
- Split 的 Comp spec:定义数据分发逻辑和关闭行为
连接件 Pipe(CSP):
- role Writer:写数据或关闭
- role Reader:读数据、读到 eof 退出、或直接关闭退出
- glue(粘合剂):协调 Writer 和 Reader 的行为
- spec:正确性规格说明(Reader 读到的必是 Writer 写的,顺序一致)
2.3 化学抽象机 CHAM
- 提出:G. Berry 和 G. Boudol,1992 年
- 核心思想:将计算类比为化学反应,用分子、溶液、膜等化学概念描述程序结构和行为
(1) 基本概念
- 分子:常数集合和操作导出的句法代数
- 溶液:分子的有限聚合,逗号隔开的分子序列
- 膜:由 {…} 包含的溶液,封装后任何溶液可看成其他溶液的分子
- 结合操作:从其他溶液导出新溶液
- 可逆封闭操作:可从溶液中取出或吸回分子
- CHAM 模型 C[…]:提供抽象表达的上下文环境,引用分子集合
- 转换关系、处理元素状态中缀操作符、输入/输出端口 i()/o()
(2) 一般规则(4条)
- 反应规则(Reaction Law):规则右边实例替换左边实例
- 化学规则(Chemical Law):反应可出现在任何溶液中,子溶液发展则母溶液也发展
- 膜规则(Membrane Law):子溶液可在任何环境中自由发展
- 封锁规则(Airlock Law):任何时候只要保持个体标识,分子可从溶液中提出或吸回
Berry 和 Boudol 还提出三种直觉规则:
- 加热规则:将分子分解成其构成成分
- 冷却规则:将分子合成新的分子
- 反应规则:改变溶液特性
溶液状态描述:
- 没有加热规则可用 → 热的(hot)
- 没有冷却规则可用 → 冷的(frozen)
- 没有反应规则可用 → 惰性的(inert)
(3) 应用实例——多阶段编译器
- 分子句法:M ::= P | C | M∘M(P 为处理元素,D 为数据元素,C 为 i(D)/o(D) 端口)
- 初始溶液 S1:text、lexer、parser、semantor、optimizer、generator 各处于输入/输出状态
- 转换规则:
- T1(加热):text 准备好源文本
- T2(反应):处理元素之间通过数据 d 通讯
- T3(加热):generator 完成后恢复原始状态,重新开始
结论:CHAM 在概念和结构上对表达 SA 及其操作特性具有借鉴意义。
2.4 π 演算
- 地位:为 Darwin 等 ADL 提供精确语义支持
- 核心概念:描述和分析具有演化通讯结构的并发系统
- 基本实体:通道(通过名字访问)、独立进程集合
- 特点:Darwin 用到的是简单的一阶形式的 π 演算
三、典型的 ADL
3.1 ADL 概述
三大基本组成元素:
- 构件:计算或数据存储单元,通过端口(port)与外部交互,一组端口构成接口
- 连接件:交互及其交互规则,通过角色(role)参与交互(如 sender/receiver)
- SA 配置:构件和连接件的拓扑逻辑和约束
ADL 的能力(Mary Shaw & David Garlan 观点):
- 构造能力:用较小独立体系结构元素建造大系统
- 抽象能力:只关心抽象细节不管具体实现
- 复用能力:构件、连接件、SA 都可复用
- 组合能力:对局部结构能描述,支持动态变化
- 异构能力:允许多个不同的 SA 描述关联存在
- 分析和推理能力:能进行多种性能和功能上的推导
主要 ADL 特点对照:
| ADL | 特点 |
|---|---|
| ACME | 支持各 ADL 之间的转换,是一种变换语言 |
| Wright | 提供 SA 构件之间交互的说明和分析(基于 CSP) |
| UniCon | 支持异构的构件和连接件类型 |
| Darwin | 基于 π 演算,描述分布式系统 |
| Aesop | 支持体系结构风格的应用 |
| MetaH | 提供实时系统的设计指导 |
| C2 | 支持消息传递风格的系统描述 |
| SADL | 提供层次加细的形式化描述 |
ADL 与程序设计语言的类比:
| 维度 | 程序设计语言 | 软件体系结构 |
|---|---|---|
| 基本元素 | 程序构件 | 系统构件(模块级别) |
| 连接机制 | 操作符 | 连接件 |
| 抽象规则 | 命名表达规则 | 组合模式(体系结构风格) |
| 限制规则 | 选择抽象规则的原理 | 决定模式合法条件 |
| 规范说明 | 句法语义关联 | 组织结构语义关联 |
3.2 ACME
- 开发:卡耐基梅隆大学 Garlan 等人
- 初衷:简单性的、一般的 ADL
- 定位:SA 变换语言——提供不同 ADL 之间的变化机制,可使用各种 ADL 提供的工具,实现分析方法和工具的共享
- 描述维度:结构、属性、约束、类型和风格
(1) 七种设计实体
- 构件(Component):计算/数据存储单元,有端口(port)
- 连接件(Connector):交互规则,有角色(role)
- 系统(System):构件和连接件的配置(通过 attachments 连接)
- 端口(Port):构件与外部交互的点
- 角色(Role):连接件中参与交互的一方
- 表述(Representations):为构件/连接件提供更详细的底层描述(分级描述能力)
- 表述映射(Map):定义内部系统表述与外部接口之间的相关性
表述(Representation)的三种用途:
- 封装子系统(父元素是接口标识,表述是具体实现)
- 作为视图(表达系统的其他视图)
- 表达文档信息(定义逻辑边界)
(2) 属性(Properties)
- ACME 使用任意属性列表对 SA 结构进行注释
- 每个属性有名称、可选类型和值
- 定义了整数、字符串、布尔等简单类型
- 属性可表达:可视化说明、源代码、性能数据等
(3) 设计约束
- 决定体系结构设计如何演化
- 采用一阶谓词逻辑的约束语言
- 约束可和任何设计元素相关联,有范围
- 典型谓词:Connected(c1,c2)、Reachable(c1,c2)、HasProperty(elt, propName)
(4) 类型、模板和风格
- 结构类型:定义构件类型/连接件类型,含端口、属性、不变式、启发式规则
- 族(Family):三方面定义——结构元素和属性 + 约束 + 默认结构
- 模板(Template):对 SA 进一步抽象,描述复杂系统和反复出现的模式,参数化实例化
- 风格(Style):定义特定领域/应用的设计词汇和约束,就是族(family)
示例:PipeFilterFamily 管道-过滤器风格族
- 定义 FilterT 构件类型(stdin/stdout 端口、throughPut 属性)
- 定义 PipeT 连接件类型(source/sink 角色、bufferSize 属性)
- 定义约束(所有连接件必须是管道类型)
(5) ACME 的特点
- 用 7 种基本元素表示 SA(构件、连接件、系统、端口、角色、表述、表述映射)
- 灵活的注释机制,支持 SA 和外部子语言非结构化信息结合
- 类型和模板机制,抽象可复用的 SA 惯用法和风格
- 开放的语义框架,提供基本结构和属性信息用于描述和推理
工具支持:AcmeStudio(CMU ABLE 项目组),支持环境、转换功能(Wright/UniCon 等之间)、SA 设计分析、定制开发。
3.3 Wright
- 开发:卡耐基梅隆大学 Robert Allen 和 David Garlan
- 核心特色:用 CSP 子集作为语义基础,精确描述构件之间的交互
Wright 结构:
- 构件(Component):有端口(port),每个端口有协议(protocol)
- 连接件(Connector):有角色(role)+ 粘合剂(glue)
- 角色:说明交互中每一方可能的行为
- Glue:说明这些行为如何组合和协作
- 实例和连接:实例化构件和连接件,通过 attachments 将端口绑定到角色
关键思想:利用 role 和 glue 描述行为及行为的协调组合。Wright 选取 CSP 子集来定义角色、端口和 glue 的协议。
3.4 UniCon(UNIversal CONnection)
- 开发:卡耐基梅隆大学 Mary Shaw
- 核心特色:支持异构的构件和连接件类型,有高级编译器
(1) 结构元素
- 构件 + 连接件,各含:规范(接口/协议)+ 类型 + 关联单元(player/role)+ 实现
- 原始构件:直接由程序语言代码实现
- 合成构件:从不同构件逐步构造成更大的构件
(2) 支持的构件类型(8种)
| 构件类型 | 支持的 player 类型 |
|---|---|
| Module | RoutineDef, RoutineCall, GlobalDataDef, GlobalDataUse, PLBundle, ReadFile, WriteFile |
| Computation | RoutineDef, RoutineCall, GlobalDataUse, PLBundle |
| SharedData | GlobalDataDef, GlobalDataUse, PLBundle |
| SeqFile | ReadNext, WriteNext |
| Filter | StreamIn, StreamOut |
| Process | RPCDef, RPCCall |
| SchedProcess | RPCDef, RPCCall, RTLoad |
| General | 可定义任何类型的 player |
(3) 支持的连接件类型(7种)
| 连接件类型 | 支持的 role 类型 |
|---|---|
| Pipe | 源/槽 |
| FileIO | 主动读/被读、主动写/被写 |
| ProceduralCall | 定义者/调用者 |
| DataAccess | 定义者/使用者 |
| PLBundler | 参与者(名字匹配) |
| RemoteProcCall | 定义者/调用者 |
| RTScheduler | 加载(load) |
(4) 属性系统
- 构件属性、连接件属性、角色属性
- 每类属性含:需求级别(可选/要求)、合成规则(合并/替换/错误)、适用范围、值/默认/句法
- 典型属性:InstFormal、Variant、Library、EntryPoint、Priority、Processor、Trace 等
(5) 实现语法
- 构件定义:COMPONENT id / INTERFACE / IMPLEMENTATION / END
- 接口:构件类型 + 属性 + player 列表
- 实现:原始方式(指向源文件)或合成方式(构件实例 + 配置 + 抽象映射)
- 连接件:PROTOCOL + 内建实现(BUILTIN),用户不能自定义连接件实现
3.5 Darwin
- 开发:英国伦敦帝国理工学院 Jeff Kramer 和 Jeff Magee,90 年代
- 语义基础:π 演算
- 定位:分布式消息传递系统的 SA 描述和分析
(1) 声明语法
- 四类声明:component、interface、const、external
- 构件说明:component id + 形式参数列表 + tag + { 声明列表 }
- 声明类型:assert、bind、component、const、external、interface、partial、when
(2) 关键概念
- 局部构件说明(partial component):构件类型可从其他构件类型完全或部分导出
- 形式参数:值参数 + 类型参数
- 通用类型(generic type):相当于预定义类型、构件类型、接口类型的占位符
- 用于形参实参说明、入口成员类型说明、实例化说明
(3) 系统构造方法
- 自顶向下和自底向上交替
- 支持合并构件(Merging Components)和分组构件(Grouping Components)
- 不同层次结构上的构件分析、细化,最终组合为系统
3.6 其他 ADL
| ADL | 开发者/年份 | 核心特点 |
|---|---|---|
| Aesop | Garlan, Allen, Ockerbloom, 1994 | 支持 SA 风格的使用 |
| MetaH | Vestal, 1998 | 实时航空控制软件设计指导 |
| C2 | — | 消息传递风格的系统描述 |
| SADL | Moriconi, Qian, Riemenschneider, 1995 | SA 精化的形式化基础 |
四、SA 与 UML
三种使用方式:
- 直接使用 UML 描述 SA
- 使用 UML 扩展机制(构造型、标记值、约束)描述 SA
- 使用 UML 的 profile 机制定义 SA 专用 profile
具体内容参见 P6 章节。
知识关联
- 软件架构概述-软件架构课程Lecture-1 — 本课程第一讲,架构定义/重要性/4+1视图
- 软件架构风格-软件架构课程Lecture-2 — 八大经典架构风格,Shaw & Garlan 分类法
- KWIC与软件架构案例分析-软件架构课程Lecture-3 — KWIC 四种架构对比等案例
- Agent系统与多Agent系统-软件架构课程Lecture-4 — DAI/DPS/MAS、BDI模型、KQML/ACL
- 共享信息系统-软件架构课程Lecture-4 — 数据库/CASE/建筑设计三大领域演进
- 设计空间与设计规则 — 软件架构系统研究方法 — CMU SEI TR-18,设计空间方法论
- 用户界面软件架构的设计空间与设计规则 — CMU SEI TR-22,UI 架构设计空间
- 量化设计空间 - 软件架构课程 Lecture-5 — QDS 四种分析技术 + COTS 考量
- 质量功能部署QFD与面向制造的设计DFM-并行工程质量管理 — QFD 质量屋 + DFM 八条准则
- 《敏捷软件开发》-原则模式与实践-Robert-C-Martin — Robert C. Martin 的 SOLID 原则,与 ADL 形式化验证互补
- 代码整洁之道-Clean Code-Robert-C-Martin — 代码级实践,与架构级描述形成对照
关键概念速查
| 概念 | 一句话定义 |
|---|---|
| ADL | 体系结构描述语言,提供 SA 描述的语法、概念框架和底层语义支持 |
| IEEE 1471 | SA 描述框架标准,六要求:存档/人员/视点选择/视点/一致性/原理 |
| Medvidovic 框架 | SA 描述四维度:构件/连接件/配置/工具支持 |
| Z 语言 | 基于一阶谓词逻辑和集合论的形式化语言,核心构造是 Schema |
| CSP | 通讯顺序进程,Hoare 提出,Wright 的语义基础 |
| CHAM | 化学抽象机,用分子/溶液/膜/反应规则描述计算 |
| π 演算 | 描述具有演化通讯结构的并发系统,Darwin 的语义基础 |
| ACME | SA 变换语言,7 种实体 + 属性 + 约束 + 类型/风格,支持 ADL 互转 |
| Wright | 基于 CSP 的 ADL,精确定义构件交互(port/role/glue) |
| UniCon | 通用连接 ADL,支持 8 种构件类型 + 7 种连接件类型,异构支持 |
| Darwin | 基于 π 演算的 ADL,用于分布式系统,支持合并/分组构件 |
| Role/Glue | Wright 连接件的两部分:角色描述各方行为,glue 描述如何协调 |
| Representation/Map | ACME 分级描述机制:表述 + 表述映射 |
| Family/Style | ACME 中定义架构风格的机制:族=风格 |