1.1 软件构造过程中的多维度视图

一、多维软件视图

1.构建阶段

构建阶段:观点—>需求—>设计—>代码—>可安装/可执行包

代码角度:源代码——源代码的逻辑组织方式通过基本程序块,如函数、类、方法、接口等等,以及它们之间的依赖关系(代码的逻辑组织)
成分角度:架构——源代码在物理上是如何的按文件、目录、包、库和依赖项组织 (代码的物理组织)

时刻角度:特定时刻的软件形态
阶段角度:软件形态随时间的变化

(1)构建阶段,时刻性,代码层面
源代码是如何通过基本程序块逻辑组织的,如函数、类、方法、接口等,以及它们之间的依赖关系。

三个相互关联的形式
词汇层面:词汇导向源代码
语法层面:面向语法程序结构,例如:抽象语法树(AST)
语义层面:面向语义程序结构,例如:类图

面向语义程序结构
例如,使用类图(UML)来描述接口、类、属性、方法以及它们之间的关系
通常是图形化或形式化的。
在设计阶段建模,并转换为源代码。
它是基于用户需求的面向对象分析和设计的结果。

(2)构建阶段,周期性,代码层面
描述随时间变化的视图
代码变化:从一个版本到另一个版本的文件中添加、修改或删除的行。

(3)构建阶段,时刻性,构件层面
源代码被物理地组织成文件,这些文件进一步被目录组织。
文件被封装到包中,逻辑上,被封装到组件和子系统中。
可重用模块以库的形式存在。


库存储在自己的磁盘文件中,收集一组可以跨各种程序重用的代码函数。
——开发人员并不总是构建单个可执行程序文件,而是将定制开发的软件和预构建的库连接到单个程序中。

在构建时,可以将库函数视为标准语言的扩展,并以与开发人员编写的函数相同的方式使用。(开发者像使用编程语言指令一样使用库中的功能)
例如:

System,out.println("Hwllo World!");

库的来源
操作系统提供的库,编程语言提供的库,第三方公司提供的库,自己积累的库

与库链接
编程时和build时,需告诉IDE和JVM在哪里寻找某些库。
如果在源代码中引用了某个函数,但是开发人员没有显式地编写它,那么将搜索库列表来定位所需的函数。
例如:

javac -classpath ./lib/*.jar

找到函数后,将相应的目标文件复制到可执行程序中。
将一个库集成到一个可执行程序的两种不同的方法:
静态链接(库被拷贝进入代码形成整体,执行的时候无需提供库文件,静态链接发生在构建阶段),动态链接

(4)构建阶段,周期性,构件层面
即各项软件实体随时间如何变化。
配置项(SCI),版本

版本
版本控制是给计算机软件的不同状态分配唯一的名字或者编号的过程。
——在给定的版本号类别(主版本号、次版本号)中,这些数字通常按递增的顺序分配,并与软件中的新开发相对应。
——在细粒度级别上,修订控制通常用于跟踪电子信息的增量不同版本,不管这些信息是否是计算机软件。

2.运行阶段

软件系统的运行时视图

运行时:程序被载入目标机器,开始执行
代码层面:逻辑实体在内存中如何呈现?
构件层面:物理实体在物理硬件环境中如何呈现?

时刻性:逻辑/物理实体在内存/硬件环境中特定时刻的形态如何?
阶段性:逻辑/物理实体在内存/硬件环境中的形态随时间如何变化?

运行时软件的高级概念
可执行程序:CPU执行的机器可读指令序列,以及相关的数据值。
——这是一个完全编译好的程序,可以加载到计算机的内存中并执行。

库:可以被不同程序重用的常用目标代码的集合。
——大多数操作系统都包含一组标准的库,开发人员可以重用这些库,而不是要求每个程序都提供自己的库。
——不能直接在目标机器上加载和执行库;它必须首先与一个可执行程序相连接。

配置和数据文件:这些不是可执行文件;它们提供了程序可以从磁盘加载的有用数据和配置信息。

分布式程序:这种类型的软件由多个可执行程序组成,这些可执行程序通过网络彼此通信,或者只是作为运行在同一台机器上的多个进程进行通信。
——这与更传统的软件形成了鲜明的对比,后者只有一个单一的单片程序映像。

可执行程序:本机机器代码
一个程序首先加载到内存中,并且有几个机制用于执行软件具体取决于在加载程序之前进行编译,以及如何许多操作系统支持程序所需的。

可执行程序:完全解释
程序完全解释执行
解释型字节码

可执行程序:解释的字节码
在执行时编译为字节码解释执行
执行Perl或Python脚本的简单操作就会自动触发字节码的生成。

动态链接
库文件不会在build阶段被加入可执行软件,仅仅做出标记。
程序运行时,根据标记装载库至内存。
发布软件时,记得将程序所依赖的所有动态库都
复制给用户。

优点:
类库变化时,不需要重新生成可自行程序。
多个运行中程序可共享同一类库,优化内存使用。

配置和数据文件
任何大的程序都使用外部数据源,例如磁盘上的文件。
您的程序对操作系统进行调用,请求将数据读入内存。

分布式程序
分布式程序的运行态:需要多个运行程序,分别部署于多个计算机物理环境。

(5)运行阶段,时刻性,代码层面
快照图:关注目标计算机内存中的可变级别执行状态。
程序的细粒度状态。

内存信息转储
内存转储:硬盘上的文件,包含进程内存内容的副本,当进程因某些内部错误或信号而中止时产生。

(6)运行阶段,时刻性,构件层面
执行跟踪:用日志方式记录程序执行的调用次序。
——这通常由程序员用于调试目的,根据跟踪日志中包含的信息的类型和细节,由有经验的管理员或技术支持人员使用,并由软件监视工具诊断软件的常见问题。

(7)运行阶段,周期性,构件层面

(8)运行阶段,周期性,构件层面
事件日志:系统层面
为每一类事件分配一个唯一的“代码”来格式化和输出人类可读的消息。

二、软件建设:视图之间的转换

软件构造中的转换类型
从0到代码
——编程/编码
——审查,静态分析/检查

从代码到构件
——设计
——构建:编译、静态链接、打包、安装等

从构件到运行
——安装/部署
——调试、单元/集成测试

从时刻到周期
——版本控制
——加载、动态链接、执行(转储、分析、日志记录)
——并发线程

三、总结

描述软件系统的三个方面:
——按阶段:构建和运行时视图
——按动态:时刻和周期视图
——按级别:代码和组件视图

每个视图的元素、关系和模型

软件构造:视图之间的转换
——从0到代码
——从代码到构件
——从构件到运行
——从时刻到周期

哈尔滨工业大学软件构造课程学习笔记第一章第一节相关推荐

  1. 哈尔滨工业大学软件构造课程笔记第三章第四节

    3.4 面向对象的编程(OOP) 1. 基本概念:对象.类.属性和方法 对象 现实世界中的对象有两个共同特征:它们都有状态和行为. 识别现实对象的状态和行为是开始考虑面向对象编程的好方法. 对于你看到 ...

  2. 斯坦福大学数据可视化课程学习笔记:第一节 可视化的发展与目标

    <斯坦福大学数据可视化课程学习笔记>课程资源来自于斯坦福大学数据可视化课程,是我所在团队实习生提升计划的一部分.本系列是 "秉姝" 同学在学习过程中记录和整理的学习笔记 ...

  3. 斯坦福大学数据可视化课程学习笔记:第二节 从数据到图像

    <斯坦福大学数据可视化课程学习笔记>课程资源来自于斯坦福大学数据可视化课程,是我所在团队实习生提升计划的一部分.本系列是 "秉姝" 同学在学习过程中记录和整理的学习笔记 ...

  4. 2022哈尔滨工业大学 软件构造期末复习 一

    Chapter1 软件构造基础软件系统三维度 Build-time&Run-time Code-level&Component-level Moment&period 重点版: ...

  5. 【哈工大软件构造】学习笔记10 第十章、第十一章、第十二章

    目录 第十章 面向可维护性的构造技术 1 软件维护和演化 2 可维护性的度量 3 模块化设计和模块性准则 模块划分的五个准则 模块设计的五个原则 耦合度和聚合度 4 OO设计准则:SOLID SRP ...

  6. 吴恩达斯坦福大学机器学习 CS229 课程学习笔记(二)

    终于要开始正式的学习了.看了第一节课最大的印象是Ng老师的优雅,儒雅,偏英式的发音(突然意识到他从小在伦敦长大).配着字幕看的视频,但还是希望能锻炼一下自己的听力,也只有在自己看过一遍印象才深刻,别人 ...

  7. 吴恩达斯坦福大学机器学习 CS229 课程学习笔记(一)

    说到机器学习总绕不过几个鼎鼎大名的人物,他们都创造了不少的机器学习资料,斯坦福吴恩达Andrew Ng的公开课CS229:Google李飞飞的CS231.周志华的.李航的<统计学习方法>. ...

  8. KLT到DCT(杜克大学数字图像处理课程学习笔记)

    在上网课时KL变换的讲授稍微有点绕,所以卡了好几天,个人感觉理解了,所以做一下记录,当然由于这个只是课程需要所以没有涉及整块的原理,如果需要还请看其他大神的数学原理解释 简单来讲,在不考虑中间量化的步 ...

  9. [南京大学]-[软件分析]课程学习笔记(一)-introduction

    文章目录 南京大学 Static program analysis introduction 1. program language and static analysis 2. why we lea ...

最新文章

  1. nginx location 配置详细解释
  2. office2016word 每次打开都有进度条问题 解决方式
  3. 25个视频神同步,还能给视频声音移花接木,谷歌开源最新自监督算法
  4. 将SVN与BUG跟踪管理集成
  5. bash ps1变量_在 Linux 中打扮你的冬季 Bash 提示符
  6. 小学计算机室教室的简报,高新区第三小学开展“信息技术与教育教学融合创新发展”培训...
  7. 基础算法 —— 高精度计算 —— Java 大数类
  8. Android--使用Canvas绘图
  9. 菜鸟启动“快递包装换鸡蛋”活动 史上最低碳的一届“双11”来了
  10. js的左右滑动触屏事件
  11. Mocha BSM产品亮点——如何去干扰事件
  12. 2018-12-26 课堂笔记 for循环
  13. 乔布斯:你须寻得所爱(转)
  14. 简单常用的10个excel公式
  15. 安装Go语言开发工具
  16. 二维码在线生成 扫描二维码打电话 扫码拨号
  17. 【分立元件】电感器(inductor)——简介
  18. 光栅图形学(一)——直线段的扫描转换算法
  19. 仓储机器人的3位鼻祖
  20. 利用osg::ClipPlane 对节点进行多边形裁切

热门文章

  1. vLoong能源AI挑战赛——异常检测赛Top2方案开源
  2. aplayer php,APlayer Typecho Plugin with HTTPS
  3. android 客户端倍速播放,Android MediaPlayer 在 6.0 以上版本使用倍速播放功能说明
  4. LinuxProbe 0x08 文件系统与数据资料、挂载硬件设备、磁盘容量配额
  5. Js 查询身份证是否男女、生日、年龄
  6. python 搞TCP TLS1.3加密最直观的版本---SOCKET版
  7. 第三篇 颜色的合成与计算
  8. CMOS反相器之功耗分析
  9. io开关量输入实验报告c语言,开关量输入输出(IO)实验.ppt
  10. idea打包war包,将自己的项目打包为war包