软件体系结构描述 — 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日
  • 适用范围:软件密集的系统
  • 六项要求:
    1. SA 的存档要求
    2. 能识别人员及其关系
    3. SA 视点的选择与具体描述
    4. SA 视点
    5. SA 视点之间的一致性
    6. 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) 应用实例:基于事件的体系结构

  1. 构件抽象为(name, methods, events)三元组
  2. Event = CNAME × EVENT,Method = CNAME × METHOD
  3. EventSystem 由构件集合 + 事件管理器 EM 组成,含构件唯一性约束等
  4. 进一步细化为 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条)

  1. 反应规则(Reaction Law):规则右边实例替换左边实例
  2. 化学规则(Chemical Law):反应可出现在任何溶液中,子溶液发展则母溶液也发展
  3. 膜规则(Membrane Law):子溶液可在任何环境中自由发展
  4. 封锁规则(Airlock Law):任何时候只要保持个体标识,分子可从溶液中提出或吸回

Berry 和 Boudol 还提出三种直觉规则:

  • 加热规则:将分子分解成其构成成分
  • 冷却规则:将分子合成新的分子
  • 反应规则:改变溶液特性

溶液状态描述:

  • 没有加热规则可用 → 热的(hot)
  • 没有冷却规则可用 → 冷的(frozen)
  • 没有反应规则可用 → 惰性的(inert)

(3) 应用实例——多阶段编译器

  1. 分子句法:M ::= P | C | M∘M(P 为处理元素,D 为数据元素,C 为 i(D)/o(D) 端口)
  2. 初始溶液 S1:text、lexer、parser、semantor、optimizer、generator 各处于输入/输出状态
  3. 转换规则:
    • T1(加热):text 准备好源文本
    • T2(反应):处理元素之间通过数据 d 通讯
    • T3(加热):generator 完成后恢复原始状态,重新开始

结论:CHAM 在概念和结构上对表达 SA 及其操作特性具有借鉴意义。

2.4 π 演算

  • 地位:为 Darwin 等 ADL 提供精确语义支持
  • 核心概念:描述和分析具有演化通讯结构的并发系统
  • 基本实体:通道(通过名字访问)、独立进程集合
  • 特点:Darwin 用到的是简单的一阶形式的 π 演算

三、典型的 ADL

3.1 ADL 概述

三大基本组成元素:

  1. 构件:计算或数据存储单元,通过端口(port)与外部交互,一组端口构成接口
  2. 连接件:交互及其交互规则,通过角色(role)参与交互(如 sender/receiver)
  3. 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) 七种设计实体

  1. 构件(Component):计算/数据存储单元,有端口(port)
  2. 连接件(Connector):交互规则,有角色(role)
  3. 系统(System):构件和连接件的配置(通过 attachments 连接)
  4. 端口(Port):构件与外部交互的点
  5. 角色(Role):连接件中参与交互的一方
  6. 表述(Representations):为构件/连接件提供更详细的底层描述(分级描述能力)
  7. 表述映射(Map):定义内部系统表述与外部接口之间的相关性

表述(Representation)的三种用途:

  1. 封装子系统(父元素是接口标识,表述是具体实现)
  2. 作为视图(表达系统的其他视图)
  3. 表达文档信息(定义逻辑边界)

(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 的特点

  1. 用 7 种基本元素表示 SA(构件、连接件、系统、端口、角色、表述、表述映射)
  2. 灵活的注释机制,支持 SA 和外部子语言非结构化信息结合
  3. 类型和模板机制,抽象可复用的 SA 惯用法和风格
  4. 开放的语义框架,提供基本结构和属性信息用于描述和推理

工具支持: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 类型
ModuleRoutineDef, RoutineCall, GlobalDataDef, GlobalDataUse, PLBundle, ReadFile, WriteFile
ComputationRoutineDef, RoutineCall, GlobalDataUse, PLBundle
SharedDataGlobalDataDef, GlobalDataUse, PLBundle
SeqFileReadNext, WriteNext
FilterStreamIn, StreamOut
ProcessRPCDef, RPCCall
SchedProcessRPCDef, 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开发者/年份核心特点
AesopGarlan, Allen, Ockerbloom, 1994支持 SA 风格的使用
MetaHVestal, 1998实时航空控制软件设计指导
C2—消息传递风格的系统描述
SADLMoriconi, Qian, Riemenschneider, 1995SA 精化的形式化基础

四、SA 与 UML

三种使用方式:

  1. 直接使用 UML 描述 SA
  2. 使用 UML 扩展机制(构造型、标记值、约束)描述 SA
  3. 使用 UML 的 profile 机制定义 SA 专用 profile

具体内容参见 P6 章节。


知识关联

关键概念速查

概念一句话定义
ADL体系结构描述语言,提供 SA 描述的语法、概念框架和底层语义支持
IEEE 1471SA 描述框架标准,六要求:存档/人员/视点选择/视点/一致性/原理
Medvidovic 框架SA 描述四维度:构件/连接件/配置/工具支持
Z 语言基于一阶谓词逻辑和集合论的形式化语言,核心构造是 Schema
CSP通讯顺序进程,Hoare 提出,Wright 的语义基础
CHAM化学抽象机,用分子/溶液/膜/反应规则描述计算
π 演算描述具有演化通讯结构的并发系统,Darwin 的语义基础
ACMESA 变换语言,7 种实体 + 属性 + 约束 + 类型/风格,支持 ADL 互转
Wright基于 CSP 的 ADL,精确定义构件交互(port/role/glue)
UniCon通用连接 ADL,支持 8 种构件类型 + 7 种连接件类型,异构支持
Darwin基于 π 演算的 ADL,用于分布式系统,支持合并/分组构件
Role/GlueWright 连接件的两部分:角色描述各方行为,glue 描述如何协调
Representation/MapACME 分级描述机制:表述 + 表述映射
Family/StyleACME 中定义架构风格的机制:族=风格