软件架构之道
之前讲了硬件架构中的数据通路,现在来看看软件的架构。我们会发现软硬件的设计大体上是一样的。
我在这里主要谈的是软件架构,而不是算法和数据结构之类的细节的优化设计。随着软件规模的扩大,算法和数据结构不再是首先要解决的问题。当系统由许多模块组成,模块的设计以及模块间如何组合就成为主要问题。在这一层次的设计中,模块间的架构和硬件架构大体是相通的。我们看看一些主要的软件架构和设计方法:
一、管道和过滤器之类的串行结构
这是最基本的模块组织结构。模块间的数据流通是串行的,其中也有分支和循环结构。但是分支和循环都可以归结为一个二进制形式的选择:是或者不是;0或者1。

像这样的串行结构在硬件设计中也很常见,如RISC CPU经典的五段流水线结构:

这是一个时序图,同时也是一个数据的流通路线图。
二、面向对象和插槽式的软件结构
面向对象首先是一种分析和思维的方法,而不是归结为具体编程语言,如C、C++或者JAVA。C语言编程也可以用到面向对象的方法,同样,就算是用C++如果没有用到面向对象的思想最终的程序也是面向过程的。

此图是一个对象间广泛交互的图。面向对象编程方法中一个重要的思想就是把同类事物归类,而且尽量归到一个大类。为同一类事物设计一套同样的接口:

这是一个面向对象的函数重载过程。不同的函数实体被插入一套同样的接口内。这个不令人想起PCI插槽这一类硬件接口吗?硬件接口的设计也是设计一套接口标准和协议,不同功能的硬件通过同样的协议接入到通信线路上。和这种软件设计大体一样的设计思想。
三、事件或者消息驱动模型
此类模型如:通过鼠标事件驱动窗口。通过发送消息和事件驱动程序运行。

客户+服务器的模型可以归为此类。这类模型在硬件设计中同样被大量用到,如中断等控制信号。
四、其它高级软件模型
其它高级软件模型我在这里暂时不再详细说,暂时只说这些基础的软件模型。不是因为它和硬件设计思想不一至了,而是其它更高级的软件模型我觉得不再归为基本的程序设计一类了,包括:
- 分层模型(从串行结构演化,像一个栈结构)
- 分布式结构(并行编程)
- 状态机
- 等等等等
五、二个实际编程的例子
2009年暑期,功耗测试软件第一版
在2009年暑期,设计第一版功耗测试软件的时候用的分层模型的设计。软件分通信层、协议层、和数据层。通信层实现了串口通信和TCP/IP通信,封装在一起,对上层提供无差别的通信服务。协议层解析功耗测试仪器的通信协议,单独封装,可以方便的替换成其它仪器的协议。数据层管理数据的组织并存放到数据库。软件横向上有仪器管理模块和数据查询模块。
2010年上,功耗测试软件第二版
2010年上,又做了功耗测试软件的第二版、linux下的去界面版和网页界面版。这是软件的结构图:

在测试仪器驱动部分和负载驱动部分是嵌入结构,用C语言实现借用面向对象的思想,像写驱动一样嵌入不同的设备驱动和不同类型的负载;功耗采集和负载采集两大模块是并列结构,还包括前台命令接受以及数据保存。上层UI设计成消息和命令驱动,设计了命令层,可以用网页界面也可以用字符界面把命令传输到主程序。当时网页界面在前台用了js做的ajax形式把命令传输到PHP,然后用PHP把传输到C函数(之前用共享内存通信发现不稳定改用了socket)。另外也支持直接从命令行操作程序。
之后写了关于计算机的数学,讨论了程序设计的三个纬度:
- 行为:程序要完成哪些行为和动作
- 时间:行为在哪些事件驱动下完成
- 空间:行为活动需要的动作空间
以及行为动作的组合:
- 累计和:功能或者武打动作的组合
- 嵌入式:功能的插入和补充
- 对等:平等关系
结语
此章节的主要目的是介绍基本的程序架构,并谈谈软硬件设计中相通的部分。那不变的道道,就是元素间通过数据通路组织起来。从最为简单的两点连接,到串行和插槽式。
Leave a comment