一、本章概述
1、软件构造的一般过程:设计→编程/重构→Debug→测试→构建→发布
编程/重构
审查和静态代码分析
Debug和测试
动态代码分析/剖析
2、软件构造的狭义过程(构建):验证→编译→链接→测试→打包→安装→部署
构建系统:组件和进程
构建变量和构建语言
构建工具:Make, Ant, Maven, Gradle, Eclipse
3、总结
二、本章目标
了解软件构造的一般过程(设计、编程、调试、生成、发布)。
使用Eclipse IDE作为Java构建环境和工具。
了解典型的评审工具和静态分析、调试(dumping、日志记录)和测试,以及动态分析/剖析。
学习狭义软件构建过程(构建):验证,编译,链接测试,打包,安装,部署。
使用一个构建工具(Make,Ant,Maven,Gradle,Eclipse IDE)来构建自己的Java项目。
三、正文
1、软件构造的一般过程
(1)编程
构造语言
编程语言(例如:C,C++,Java,Python)
模型语言(例如:UML)
配置语言(例如:XML)
基于语言学的
基于数学的(正式的)
基于图形的(可视化的)
编程语言
编程工具
集成开发环境(IDE):为程序员提供软件开发的综合设施。
IDE通常包括:
带有智能代码完成、代码重构工具的源代码编辑器,文件管理工具,图书馆管理工具,类浏览器、对象浏览器、面向对象的类层次结构图,图形用户界面(GUI)生成器,编译器、解释器,构建自动化工具,版本控制系统
另外,IDE应该能够被更多第三方工具扩展。
举例:Eclipse
建模语言和工具
建模语言是一种人工语言,用于表达信息、知识或系统,以一套一致的 规则定义来可视化、推理、验证和交流系统的设计。
UML:统一建模语言
用例图
类图
时序图
组件图
配置语言
用来配置程序的参数和初始设置,应用应提供工具支持配置文件的维护。
举例:
Key-Value texts (.ini, .properties, .rc, etc)
XML, YAML, JSON
(2)审查和静态代码分析
代码审查是对源代码的系统性检查,正式评审会, 逐行审查代码,轻量级代码审查要求相对第一点。
(3)动态代码分析/剖析
运行程序以分析代码;程序需要经过充分的测试;利用测试度量技术(如覆盖率)确保代码的可能功能均被充分测试到;用来测量程序的时空复杂度,特定指令或函数的调用频率或持续时间。
(4)Debug和测试
测试为软件的利益相关者提供有关被测产品或服务质量的信息。
调试是识别错误的根本原因并对其进行纠正的过程;调试往往是成功测试的后续环节,成功测试不意味着没有发现错误, 反而相反。
测试和调试不会提升软件质量,而是发现缺陷的主要手段。 软件质量应通过认真的分析需求、良好的设计、高质量的编码来确保;调试是最后的手段。
(5)重构
重构是在不改变代码外部行为的前提下,改善其内部结构。
2、软件构造的狭义过程
(1)构建系统
典型的构建情况:编译代码;打包和测试解释型语言;编译和打包Web应用程序;执行单元测试;进行静态分析,得到bug报告;输入不同格式的输入文件,得到人可读的文档。
编译语言:编译后得到目标文件, 后续被链接入类库或者可执行程序中;最终得到可部署到目标机器的发布包。
涉及到版本控制工具、源树和目标树、编译工具、构建机器、发布包和目标机器等概念。
解释型语言
解释的源代码不会编译成目标代码,因此不需要目标树。源文件本身被收集到一个发布包中,准备安装在目标计算机上。
编译工具专注于转换源文件并将其存储在发布包中。
编译成机器代码不在构建时执行,它可能在运行时执行。
Web应用
基于Web的应用程序的构建系统是编译代码、解释代码和配置或数据文件的混合体。一些文件(例如HTML文件)直接从源树复制到发行包,而其他文件(例如Java源文件)首先被编译成目标代码。
(很多东西都是大家知道的东西,后面的对于这种内容就直接不放上来了
单元测试,静态分析等
(2)编译系统组件
涉及到以下概念:版本控制工具、源树、目标树、编译工具、构建工具、构建机器、发布包和目标机器、包的类型。
(3)构建过程和构建描述
构建过程
构建描述
构建工具需要构建描述信息,基于文本的格式编写,例如Make与Makefile文件。
如何使用构建系统
开发者构建:开发人员已从VCS中签出源代码,并正在一个专用工作区中构建软件。生成的发布包将用于开发人员的私有开发。
发布构建:提供完整的软件包供测试组验证。当测试人员确信软件具有足够高的质量时,客户就可以使用相同的软件包。用于版本生成的源树只编译一次,并且源树从不被修改。
健全性构建:类似于发布版本,只是软件包不是为客户准备的。相反,构建过程确定当前源代码是否没有错误,并通过一组基本的健全性测试。这种类型的构建每天可以发生很多次,并且往往是完全自动化的。
(4)Java的编译工具
运行环境:JVM
编译工具:The Java Development Kit (JDK) 、GNU Java Compiler、Eclipse Java Compiler (ECJ)等
目标文件:与机器无关的字节代码,用于描述程序流,而不是直接编译为本地机器代码。
Java 语言是动态进行类的加载,在运行时根据需要,类会被加载入内存。 另外,Java程序的执行需要包含main函数的类和class路径。
由于动态加载的特性,可以随时替换和升级JAR文件(需要确保兼容性)。
(5)子目标和构建变量
构建的方式
可以存在任意数量的构建方式,每个方式都使用稍微 修改的构建过程并创建一个稍微不同的发布包。
三种不同的构建方式
构建子目标:也称为局部构建,避免耗时的完全构建,限制构建涉及的某块数量
构建不同的软件版本:如家庭版、专业版、企业版等
面向不同目标架构的构建:不同的CPU指令集、不同的操作系统等
(6)构建工具
Make
# make new 生成子目录
# make build 在bin中编译并产生class文件
# make clean 清理编译结果
# make rebuild 相当于clean+build
# make run 检验编译结果
# make jar 产生可执行jar文件
Apache Ant
ant compile: 把所有java文件编译成class
ant jar: 将class文件打包成一个jar文件
ant package: 产生一个发布版本并有版本号
ant clean:删除所有生成的文件
ant javadoc:通过Javadoc tool产生文档
ant: 用于执行默认目标,该目标很可能与包目标相同
构建文件:build.xml
Maven
(这个我用过,不过是IDEA下的图形界面,在我的认识里就是一个引用库的管理工具,很多引用通过在pom.xml进行设置就可以将包下载并加载到程序里
Gradle
百度百科
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。
通过Eclipse构建Java工程
3、总结
软件构造的一般过程:设计、编程、调试、生成、发布
编程/重构
评审和静态代码分析
Debug(dumping和日志记录)和测试
动态代码分析/剖析
狭义软件构建过程(构建):验证,编译,链接测试,打包,安装,部署
构建系统:组件和进程
构建变量和构建语言
构建工具:Make,Ant,Maven,Gradle,Eclipse IDE