Software Construction学习——多维度看软件

软件的开发过程:

idea->requirement->design->code->installable/executable package

软件的维度主要有三块:

    1.Moment--某一时间点;Period--长时间下

    2.Build-time--构造阶段;Run-time--运维阶段

    3.Code-level--代码层面;Component-level--文件、目录层面

一. Build-time

从软件构造的阶段来看待不同层面的软件系统,即对应软件开发过程的code阶段。在构造阶段对于其余两种维度的理解则有如下的解释:

    Code-level: 即源代码,代码是如何根据程序的各个区块实现有逻辑的组织安排

    Component-level: 代码的架构(architecture),源代码是如何通过文件、目录、包、库来实现物理层面上的组织安排

    Moment-view: 在一个特定时间点下,源代码的逻辑和物理组织是何种形态

    Period-view: 软件的源代码和物理层面是如何随着时间而不断地进化改变

    1. Build-time, moment, code-level

    在这种维度观察代码,有三种内在的联系:词汇层面;语法层面;语义层面

    词汇层面:是一种以自然语言为基础的+半结构化的编程(就是我们常见的java、c++之类的)

    语法层面:语法导向的编程结构,像是AST(Abstract Syntax Tree 语法树)    

语法树:语法树是句子结构的图形表示,它代表了句子的推导结果,有利于理解句子语法结构的层次。简单说,语法树就是按照某一规则进行推导时所形成的树。(节选自<语法树>百度百科) 

        语法树可以将代码彻底结构化,使得对树所做的任何操作,同样都会反应在源代码之上。

    语义层面:首先要理解语义(Semantic)的意思——源代码具体要实现的目标。

e.g. 使用类表(Class Diagram即UML)来描述接口、类、属性之类的东西。(java书上就有看到过)

通常是以图形为基础的;一开始是先设计模型,再转换为源代码。

这是根据用户需求,面向对象设计和分析的结果

    2.Build-time, period, code-level

    key word:Code-Churn(代码变化),其定义为——在某一文件中因为某一行的增加、修改、删除而导致的版本变化。

    最近接触的就是git了,里面的git diff、git log语句就很清楚的表明了代码的变化,同样的在github上也能观察到代码的变化。

    3.Build-time, moment, component-level

        源代码在物理层面上首先是有“文件(file)”来组织的,其次才是目录(directory)

        文件是囊括了“包(package)”“component(我不太清楚怎么翻译)”“子系统(sub-system)”

        可以重复使用的模型就变成了库(library)

        e.g. 最常见的大概就是Eclipse中左边那一个块的Navigator

        库(library):库文件在磁盘上有对应的文件,其中包含了一系列代码,他们能在许多种的编程项目里被重复使用;因此,在build time,开发者要像使用编程语言指令一样使用库中的功能

                e.g. System.out.println("Hello World!");

            库的链接:在编程、编译的时候需要告诉JDE和JVM在哪里寻找这些库。如果在源代码中使用了一些库中的功能,但在编译器中并没有直接的去引用,那么就需要在编译的时候去进行链接

                javac -classpath ./lib/*.jar

            链接的方式分为静态链接(static linking)和动态链接(dynamic linking)。静态链接发生在build time即编译阶段。(链接的相关内容可以在《CSAPP》第七章进行更深入的学习)

    4.Build-time, period, component level

        软件的各个文件、包、库之类的随着时间是如何变化的?

        SCI(Software Configuration Item 软件配置项)

        Version(版本)

Software Construction学习——多维度看软件    

        VCS(Version Control System 版本控制系统)e.g. git也具有版本控制系统

        Software Versioning:软件版本控制是将独特的版本名或者版本编号分配给计算机特有状态的一个过程。

        Software Evolution:版本更新是用在软件运维中的一个术语,意为从软件最初的开放到后来由于多种原因而重复更新的过程。(对于特定的系统而言,超过90%的成本都花费在运维阶段上;任何成功的软件都不可避免的需要维护)


二. Run-time

在Software处于Run-time时,我们需要关注程序在目标机器内部是如何运行的;所有磁盘文件都需要被加载到内存之中吗?此时从其它2个维度来看Run-time运行:

    Code-level:源代码在程序执行时的内存内部状态;程序的各个单元(对象、功能……)之间如何交互

    Component-level:架构——软件的各个包是如何在物理环境(OS,网络……)中是如何展开、交互的

    Moment view:程序在运行时的某一时刻是何种状态

    Period view:随着时间程序是如何运作的

更高级的对于Run-time的理论:

    Executable programs:一系列能被CPU执行的机器阅读指令及相关的数据

    Libraries:库,上文已涉及

    Configuration and data files:这些文件并不是可执行文件,但提供了数据和配置信息并且可以从磁盘被加载。

    Distributed programs:这种类型的软件包含多种可执行程序,它们通过网络或多种方式在同一台机器上进行交互。

    Executable programs和动态链接库的相关内容都可以在《CSAPP》上深入学习。

    1. Run-time,moment,code-level

        Snapshot diagram(快照):在目标计算机上,变量层面在程序执行时的内存状态。

Software Construction学习——多维度看软件(来源于mit 6.005 Reading 13)

        Memory Dump(内存信息转储):是一个磁盘上的文件,保存了程序运行过程中的内存信息,在程序因内部的一些错误或者信号而终止后产生。

            bug测试人员能通过加载转储文件而了解到程序在运行时的内存状态。

            转储文件中信息包含了CPU中寄存器的内容,栈的内容,程序之中的数据。

            转出文件之所以被提取出来是因为程序员可以通过查看内存缓冲区,分析对应内存状态,从而发现何处的数据出现了问题。

            e.g. windows的数据管理器之中每一个进程右键后就可以创建对应进程的转储文件

            Software Construction学习——多维度看软件

    2. Run-time,period,code-level

        通过一系列的图表(UML)来表示程序各个对象之间的交互。

        Execution tracing(执行跟踪):用日志的方式来记录程序执行的调用次数

    3. Run-time,moment,component-level

        Deployment diagram in UML(UML的部署图)

        Software Construction学习——多维度看软件

    4. Run-time,period,component-level

        提供了系统层面的事件日志;每一个类都会有自己独特的“编码”,从而输出可以阅读的信息。

*******************************************************

资料来源于mit 6.031的software construction课程以及老师的课上ppt