本节目标:
本节大纲:
随着时间的推移,人们对软件的认识的变化:
软件不能脱离外部环境:
软件构造的多个维度:
时间:瞬时(某一天某个时间点)、周期(变化情况)
编码:构建开发(代码的结构、多少类、类与类之间的关系)、运行阶段(在电脑上的配置情况,占用多少内存等)
代码和模块:代码(细致的组成,一个类中有多少种方法)、模块(宏观)
构造阶段:
(1)Build-time, Moment, Code-level
关注在某一个时间点,构建代码时,代码呈什么样。分为三个层面:词汇层面、语法层面、语义层面,三个层面由具体到抽象。
词汇层面:就是程序中的代码语句。源代码,是程序员层面的,是半结构化的,近乎自然语言的风格+特定的变成语法。
语法层面:关注软件执行的算法的流程。将代码结构化为抽象语法树AST,面向编译器。
语义层面:关注程序多个组成部分之间的联系情况,关注程序由多少个类来组成,以及类与类之间的关系。面向不懂编程的人。UML图。
(2)Build-time, Period, Code-level
关注在编码的时候代码的改变情况。即一个程序可能需要一段时间才能完成,其中会对代码进行多次修改,需要用代码改动工具code churn来记录代码的变化。
(3)Build-time, Moment, Component-level
关注代码的组织情况,即如何组织文件、组织各个块。使用库文件。讲库文件链接到程序有两种方式:静态链接、动态链接。
静态链接:程序转换为可执行代码时,所需要的库文件被拷贝进入代码中形成一个整体,执行的时候就不再依赖库。静态链接发生在构造阶段。缺点:难以升级。
(4)Build-time, Period, Component-level
关注在某个阶段对代码做了哪些变化。通过版本变更来体现。软件在不同的阶段有不同的版本,需要一个版本控制工具把不同的版本记录下来,不同的版本变化了什么。版本控制工具还可以支持协同开发。文件不同版本组合得到不同的软件版本。
运行阶段:
关注四个点:可执行文件、库文件、配置文件、分布式程序
可执行程序:编译执行:一次性编译,速度快、但移植性差(不同的操作系统机器码不同);程序完全解释执行:需要执行某行代码时,才把代码翻译成可执行程序。
动态链接:库文件不在build阶段被加入可执行文件,仅仅做出标记,标记是运行到哪需要调用库文件,库文件在哪。程序运行时,根据标记将库装载至内存。发布软件时,要将程序所依赖的库文件一并发布。优点:易于升级,库文件和程序是分开的。
配置文件:对程序的执行进行限定。配置文件告诉程序在读取不同类型的文件时应该怎么去做。
分布式程序:程序部署于多个计算机物理环境上。
(5)Run-time, Moment, Code-level
关注程序运行的某一个阶段,程序中有多少对象,以及每个对象的值是什么。使用代码快照图去描述这个视图。code snapshot就是一种图,程序运行的某个时刻,程序在内存中会产生一些存在的对象,将这些对象绘制出来,他们之间谁调用谁,具体。
一个工具:内存信息转储(Memory dump)、宏观。
(6)Run-time, Period, Code-level
关注代码最终的执行情况。通过UML图。用日志去跟踪程序的执行情况、记录调用次序。
(7)Run-time, Moment, Component-level
关注程序在不同的位置上的配置情况。
(8)Run-time, Period, Component-level
关注整个系统的调用情况。使用事件日志,宏观角度、系统层面。
在系统层面和代码层面日志的记录是不一样的:代码层面关注某一个方法、某一个类的情况,系统层面关注宏观。
执行跟踪(代码层面)和事件日志(系统层面)的区别:执行跟踪是用日志方式记录程序执行的调用次序、细节;事件日志是在系统层面,各种各样的类都会被记录下来。