目录
前言
本系列博客是学校系列课程-软件构造课程的随笔博客,主要记录了在学习过程中对每章节的内容的复习、课件内容的回顾以及加入了一些其他的阅读资料内容。而本篇也是其中第一篇,其中有错误的地方还需谅解。
软件构造的多维视图
1.总体概括
按照阶段:构建和运行时视图
按照 dynamics:瞬间和时间段视图
按照层面:代码和成视图
元素、关系和模型视图
视图之间的转换
从∅到代码再到组件
从构建时到运行时
从瞬间到时间段
2.软件的多维视图
什么是软件:
软件=程序(代码)
软件=算法+数据结构
软件=程序+数据+文档
软件=模块(组件)+数据/控制流
其它定义:
1.运行时,能够提供所要求功能和性能的指令或计算机程序集合。
2.程序能够满意地处理信息的数据结构。
3.描述程序功能需求以及程序如何操作和使用所要求的文档。
以开发语言作为描述语言,可以认为:软件=程序+数据+文档
我们来看一看“软件=程序+数据+文档”这一种理论。
程序(UI、算法、Utilities、接口、测试用例等)
数据(文件、数据库等)
文档(需求规格说明SRS, 设计规格说明SDD, 用户手册等)
多维软件视图如下:
这张图十分重要,作为本节课甚至整个课程的一个总纲。
3.具体从各方面分析
(1)构建时,某一时刻,代码层面视图
①面向词法的半结构化源代码(实实在在的代码)
②面向语法的程序结构(AST程序抽象语法树)
③面向语意的程序结构(表达需求)
例如:用类图(UML)在描述接口、类、属性、方法和其中的关系。 基于图形或者由形式定义
在设计阶段通常是模型化的,并且将其转换为源代码。 根据用于需求面向对象分析和设计的结果
UML图举例如下:
(2)构建时、某一时间段、代码层面视图
考察代码随时间的变化(code churn)
构建过程中代码的变动的记录,如修改删除版本变化等
(版本控制工具VCS、分布式管理工具等)
(3)构建时、某一时刻、组件层面视图
a.源代码物理地组织在被目录组织的文件中
b.文件被封装成包、组建和子系统
c.可复用模块形成类库
库(Library)
库(含有可复用的函数)
来源:操作系统预装、语言自带、第三方、自行开发
库的链接:程序被编辑、构建和安装时,需要提供用到的类库列表。
如果一个调用的函数并没有 出现在开发者的源代码中,
那么会在类库列表中搜索并复制类库到可执行程序中。分为静态链接和动态链接。
动态链接
动态链接(Dynamic Linking)需要解决空间浪费和更新困难这两个问题最简单的办法就是把程序的
模块相互划分开来,形成独立的文件,而不再将他们静态的链接在一起。简单地讲,就是不对那
些组成程序的目标文件进行链接,等到程序要运行时才进行链接。也就是说,把链接这个过程推
迟到了运行时再进行,这就是动态链接(Dynamic Linking)的基本思想。
优点:
①更加节省内存并减少页面交换;
② 库文件与可执行文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换库文件不会对可执行文件造成任何影响,因而极大地提高了
可维护性和可扩展性;
③不同编程语言编写的程序只要按照函数调用约定就可以调用同一个库函数;
④适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。
静态链接
静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,
将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。
优点:
① 代码装载速度快,执行速度略比动态链接库快;
② 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题。
缺点:
① 使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;
② 不易于更新,当一个库文件发生更新和变化时不易于调整。
(4)构建时、某一时间段、组件层面视图
文件、包、组件、库等随时间的变化
1.SCI(软件配置项)
2.VSC(版本控制系统)
3.演化图
版本控制是给计算机软件不同状态分配唯一名字或编号的过程
(5)运行时、某一时刻、代码层面视图
原生机器码:
机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据。
通常意义上来理解的话,机器码就是计算机可以直接执行,并且执行速度最快的代码。
一次性将程序编译成可执行文件可以在机器上运行。
advantage:方便简单、运行速度快
disadvantage:可执行行很差,跟硬件环境相关
解释型代码
解释型语言:程序不需要编译,程序在运行时才翻译成机器语言,每执 行一次都要翻译一次。
因此效率比较低。比如Basic语言,专门有一个解释器能够直接执行Basic程 序,每个语句都是
执行的时候才翻译。(在运行程序的时候才翻译,专门有一个解释器去进行翻译,每个语句都是
执行的时候才翻译。效率比较低,依赖解释器,跨平台性好。
Snapshot diagram:刻画内存中某时刻变量的状态
Memory dump(信息转储):硬盘上包含着内存内容复件的文件,在进程因信号或错误中止时产生
(6)运行时、某一时间段、代码层面视图
UML描述的时序模型:程序单元间的联系
执行跟踪:跟踪包括用来记录程序执行信息的特殊的日志使用
(7)运行时,某一时刻,组件层面视图
(8)运行时,某一时间段,组件层面视图
事件日志:事件日志可以给系统管理员提供诊断和审查的有用信息。
每一类事件可以通过给定的独特代码来格式化并且输出人能够读懂的信息。
事件日志与执行跟踪的比较
4.各个视图之间的转换
5.MIT软件构造课程阅读材料-静态检查
动态类型语言(Dynamically Typed Language)
所谓动态类型语言,就是类型的检查是在运行时才做。
类型对于变量,属性,方法以及方法的返回类型都是可有可无的,在给变量赋值时才决定它的类型, 之后,还可以赋值不同类型的值,即使是基本类型,
比如 C# 装箱(boxing)和拆箱(unboxing),可以把值类型转换成引用类型,引用类型转换成值类型。当需要时,很多类型之间都会发生自动转换,
可以把不同的基本类型添加到同一数组(collections)中。
动态类型在解释语言中极为普遍,如 JavaScript、Perl、Python、Ruby 等等。
静态类型语言(Statically Typed Language)
静态类型语言的类型检查是在运行前的编译阶段,比如 C#、Java 等都是静态类型语言,静态类型语言为了达到多态会采取一些类型鉴别手段,
如继承、接口,而动态类型语言却不需要,所以,一般动态语言都会采用 dynamic typing。静态类型语言常出现于编译语言中,
比如,Java,实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制。
静态检查和动态检查
静态检查:语法错误、错误的名字、参数个数不对、参数类型不对、错误的返回类型
动态检查:非法变量名、无法表示的返回值、越界访问、使用一个null对象解引用
mit阅读材料地址如下:
mit阅读材料地址