2-2 软件构造的过程、系统和工具
一、软件建设的一般过程
1)程序设计
构造语言:
从用途上划分 :
编程语言( C, C++, Java, Python)
建模语言(UML)
配置语言(XML)
构建语言(XML)
从形态上划分:
基于语言学的构造语言
基于数学的形式化构造语言
基于图形的可视化构造语言
编程语言:
设计工具 - 集成开发环境:
源代码编辑器、智能代码补全工具、代码重构工具
文件管理
库管理
软件逻辑实体可视化
图形化用户界面构造器
编译器、解释器
自动化build工具
版本控制系统
外部的第三方工具
作为IDE示例的Eclipse:
Eclipse IDE:Java的开放源码IDE,但不限于,C/C++、PHP、Python等,作为专有的IBM产品(SimultalSimulefor Simultals/Java)开始
它包含一个基本的工作空间,包括用于编码、构建、运行和调试应用程序的工具,以及用于定制环境的可扩展插件系统
插件是结构化的代码包和/或数据,它们为系统提供功能。功能可以以代码库、平台扩展甚至文档的形式进行贡献
插件可以定义扩展点,定义良好的地方,其他插件可以添加功能
建模语言
建模语言是任何一种人工语言,它可以用来表达由一致的规则集定义的结构中的信息或知识或系统,其目的是可视化、推理、验证和传达系统的设计
UML作为建模语言及工具实例
配置语言
配置文件配置程序的参数和初始设置:
应用程序应该提供工具来创建、修改和验证其配置文件的语法
一些计算机程序只在启动时读取配置文件。其他人定期检查配置文件以进行更改
目的实例:
部署环境设置
应用程序特性的变体
组件之间的连接变型
配置语言示例:
XML, YAML, JSON
2)回顾与静态代码分析
代码评审:代码审查是源代码的系统检查(同行评审)
-在初期开发阶段发现错误,提高整体素质
-评审以各种形式进行,如结对编程、走查、正式评审会议、自动化评审
正式的代码评审会议
正式代码审查,如FAGC检查,涉及仔细和详细的过程,多个参与者和多个阶段
-正式的代码评审是传统的审查方法,其中软件开发人员参加一系列会议并逐行评审代码,通常使用材料的打印副本
-正式检查是非常彻底的,并已被证明是有效的发现缺陷的代码审查
轻量级的代码评审
轻量级代码审查通常需要较少的开销比正式代码检查,但它可以同样有效的时候做得很好
轻量级审查通常作为正常开发过程的一部分进行
在肩上 - 一个开发者在作者的肩膀上看着后者的代码
电子邮件通过 - 源代码管理系统电子邮件代码自动审阅后作出
结对编程 - 两个作者在同一工作站上共同开发代码,这在极限编程中是常见的
工具辅助代码审查 - 作者和审阅者使用软件工具,如巴氏杆菌和IRC之类的非正式工具,或专为同行代码审查设计的专用工具
利用工具进行的静态代码分析
静态代码分析是在没有实际执行程序的情况下执行的计算机软件的分析(在执行程序上执行的分析称为动态分析)
该过程提供了对代码结构的理解,并有助于确保代码遵守行业标准
自动化工具可以帮助程序员和开发人员进行静态分析。例如,JAVA的检查样式、FunBug、PMD
3)动态代码分析/剖析
动态分析:要执行程序并观察现象、收集数据、分析不足
-必须用足够的测试输入来执行目标程序以产生有趣的行为
-使用诸如代码覆盖率之类的软件测试措施有助于确保程序的一组可能行为的适当切片被观察到
-对代码的运行时状态和性能进行度量,发现代码中的潜在问题
4)调试与测试
测试:发现程序是否有错误
-软件测试是为利益相关者提供被测试产品或服务质量信息的调查
-测试技术包括执行程序或应用程序的过程,目的是发现软件缺陷(错误或其他缺陷),并验证软件产品是否适合使用
-软件测试涉及执行软件组件或系统组件来评估一个或多个感兴趣的属性
调试:定位错误、发现错误根源
-调试是识别错误的根本原因并纠正错误的过程
-它与测试相对比,这是最初检测错误的过程,调试是成功测试的结果
-在一些项目中,调试占用了总开发时间的50%
-对于许多程序员来说,调试是编程中最困难的部分
-与测试一样,调试不是提高软件质量的一种方法,但它是诊断缺陷的一种方法
-软件质量必须从一开始就建立起来。建立优质产品的最佳方法是仔细开发需求,设计好,并使用高质量的编码实践
-调试是最后的手段
5)重构
重构:在不改变功能的前提下优化代码
重构是一种改变软件系统的过程,它不会改变代码的外部行为,而改善其内部结构
-产生短期收益/工作成本,获得长期收益,并长期投资于系统的整体质量
重构是
-重组(重新排列)代码
-在一系列小的语义保持变换中
-为了使代码更易于维护和修改
重构不仅仅是旧的重组
-您需要保持代码工作
-需要保留语义的小步骤
-您需要进行单元测试来证明代码工作
二、软件建设的狭义过程(构建)
1)构建系统
典型情景生成:
汇编语言编写的软件,如C、C++、Java和C语言
用Perl和Python等解释语言编写的软件的封装和测试
基于Web的应用程序的编译和打包
-这些包括静态HTML页面、Java或C语言编写的源代码、使用JSP(JavaServer页面)编写的混合文件、ASP(Active Server页面)或PHP(超文本预处理器)语法,以及多种类型的配置文件
执行单元测试以验证与软件的其余部分隔离的软件的小部分
执行静态分析工具以识别程序源代码中的缺陷。这个构建系统的输出是一个bug报告文档,而不是一个可执行程序
PDF或HTML文档的生成。这种类型的构建系统在不同格式的范围内消耗输入文件,但生成输出的可读文档
编译语言
C语言、C++语言、Java语言和C语言编写的语言。在这个模型中,源文件被编译成对象文件,然后将它们链接到代码库或可执行程序中
生成的文件被收集到可以安装在目标机器上的发布包中
版本控制工具
源树和对象树:特定开发人员工作的源文件和编译对象文件集
编译工具:获取输入文件并生成输出文件的工具(例如,将源代码文件转换为目标代码和可执行程序)。编译工具的常见示例包括C或Java编译器,但它们也包括文档和单元测试生成器
构建机器:执行编译工具的计算设备
释放包装和目标机器:软件打包的方法,分发给终端用户,然后安装在目标机器上
理解的语言
解释的源代码不被编译成目标代码,因此不需要对象树。源文件本身被收集到发布包中,准备安装在目标机器上
编译工具着重于转换源文件并将它们存储在发布包中
编译时,机器代码不会在运行时执行,即使在运行时可能发生
基于Web的应用
基于Web的应用程序的构建系统是编译代码、解释代码和配置或数据文件的混合体
一些文件(例如HTML文件)直接从源树复制到发布包,而其他文件(如Java源文件)则首先编译成目标代码
静态HTML文件,只包含要在Web浏览器中显示的标记数据。这些文件直接复制到发行包中
包含由最终用户的Web浏览器解释的代码的JavaScript文件。这些文件也直接复制到发行包中
JSP、ASP或PHP,HTML页,含mix of和程序代码。These are executed by the files and compiled rather than by the Web Application Server构建系统。these files are also to the release复制安装包,准备为on the Web服务器
将Java源文件编译成目标代码并打包为Web应用程序的一部分。生成系统在打包Java类文件之前执行此转换。Java类在Web应用服务器上执行,甚至在Web浏览器中执行(使用Java applet)
2)构建系统的组件
构建系统的组件:
版本控制工具
源树:一个程序的源代码存储为多个磁盘文件。这种文件的不同排列被称为源树。源树的结构经常反映软件的体系结构
对象树:一个单独的树层次结构,它存储由构建过程构造的任何对象文件或可执行程序
编译工具:将人类可读源文件翻译成机器可读的可执行程序文件的程序
-编译器:源文件 -> 对象文件
-链接器:多个相关对象文件 -> 可执行程序映像
-基于UML的代码生成器 -> 模型源代码文件
-脚本文件 -> 文件发生器
构建工具:一个在编译工具之上运行的程序。它必须有足够的知识源文件和对象文件之间的关系,它可以协调整个构建过程。生成工具调用必要的编译工具来生成最终的生成输出
构建机器:编译和构建工具执行的机器
-本地编译环境:该软件在与构建机器相同的目标机器上执行
-交叉编译环境:需要两台不同的机器,在目标机上有不同的操作系统或CPU
构建系统的组件
释放包装和目标机器:生产一些你可以在用户机器上安装的东西
-从源和对象树中提取相关文件并将其存储在发布包中
-发布包应该是一个单独的磁盘文件,并且应该被压缩以减少下载所需的时间
-任何非必需的调试信息都应该被删除,这样它就不会干扰软件的安装
包装类型:
-存档文件:zip和unzip
-包管理工具:UNIX风格,如.rpm和.db
-定制的GUI安装工具:Windows风格
3)生成过程和生成描述
构造过程
生成过程:生成工具调用每个编译工具来完成任务,这是一个端到端的事件序列
生成语言(build描述):
生成工具需要以基于文本的格式编写生成描述,它遵循特定的构建语言的语法规则
例如,在使用make时,以规则的形式指定互文件依赖性信息,这些规则存储在名为Makefile的文件中
您可以手动编写描述,也可以通过IDE生成描述
如何使用构建系统
开发人员(或私有)构建:开发人员已经从VCS签出了源代码,并且正在私有工作空间中构建软件
发布构建:为测试组提供完整的软件包进行验证。当测试员确信软件的质量足够高时,同样的软件包就可供客户使用
正常构建:生成过程确定当前源代码是否没有错误,并通过基本的健全性测试集。这种类型的构建可以每天发生多次,并且趋于完全自动化
-每日构建
-持续集成
4)Java中的编译工具
JAVA怎么样
Java语言的一大卖点就是它的“一次写,随处可见”的哲学
也就是说,应该在Linux机器上编译一个Java程序,但是在Windows或Solaris机器上运行它,而不需要任何修改
这是通过使用Java虚拟机(JVM)解释的一组标准字节代码来实现的
由于Java的安全特性,有可能限制Java程序执行的环境,因此允许不受信任的程序执行而不必损害主机
Java中的编译工具
Java开发工具包(JDK)
GNU Java编译器
Eclipse的Java编译器(ECJ)
JAVA的源文件
Java类的对象文件格式称为类文件,并具有.class的后缀
与机器无关的字节码来描述程序的流程,而不是直接编译成本机代码
Java虚拟机(JVM)需要加载和解释这些字节代码,尽管JVM可能在实际执行程序之前首先将它们转换为本机代码
使用Javac命令将Java源文件翻译成类文件
Java的可执行程序
Java编程是动态类加载。不需要生成时间链接步骤来生成可执行程序。相反,当运行程序需要Java类时,Java类被单独加载到内存中。没有可加载的单个可执行程序映像
Java程序只是动态库的集合,虽然单个类每次加载一个类,而不是作为更大的共享库的一部分
Java程序需要执行两件事:
-JVM必须提供一个包含主方法的类的名称。这被用作执行的起点
-JVM还必须提供一个类路径,用于识别其他类可以位于何处
Java中的库
除了指定可以找到.class文件的目录列表之外,Java类还可以放入更大的存档文件中,称为jar文件
大多数Java应用程序更喜欢JAR文件格式(带有.jar后缀),仅仅因为它比包装更容易操作JAR文件并分发大量.class文件
JAR文件通常被用作分发程序的一种手段
不仅可以在JAR文件中打包自己的软件,还可以通过获取其他人的JAR文件并将它们添加到自己的类路径中来合并第三方包
由于动态加载系统,您可以随时更换和升级JAR文件
5)子目标和构建变量
构建方式
是否只有一种方式将每个源文件编译并链接到一个可执行程序中,并且只生成一种类型的释放包?
然而,实际上,可以存在任意数量的变体,每个变体使用稍微修改的构建过程并创建稍微不同的发布包
三种不同的构建方式
构建子目标:只对生成树的一部分进行增量更改的开发人员更喜欢只重建他们正在积极工作的树的一部分
构建不同版本的软件:输出被定制以改变软件的行为。这些变化可能包括支持自然语言或支持不同组合的产品特征,如家庭或专业版
构建不同的目标体系结构:为了在不同的目标机器上支持软件产品,必须为各种不同的CPU类型和操作系统编译相同的源文件集。这包括诸如x86、MIPS和PowerPC之类的CPU,以及Linux、Windows和Mac OS X.等操作系统
构建子目标
任何大型软件都可以分为多个子组件,通常是静态或动态库的形式。每个组件只提供程序的全部功能的一部分,并且独立于其他组件开发
为了避免在构建完整的源树以创建最终的可执行程序时花费时间,最好选择限制它们所构建的子组件的数量,而不是总是重建整个源树
构建不同版本的软件
不同版本的制作:
-语言与文化,本土化
-硬件变化
-期权定价
建立指定的变体:
改变代码:
-逐行变化
-逐个变化文件
-逐个变化目录
-逐个变化的描述文件的建立
构建不同的目标体系结构
只有当C语言和C++语言编译成本地代码时,这种类型的变体才是相关的
它与使用机器无关虚拟机的Java和C无关
6)生成工具
For Java:
– Make
– Ant
– Maven
– Gradle
– Eclipse IDE
Make
使用make和Mafile文件构建Java项目
命令:
- # make new 生成子目录(src,bin,res)
- # make build 在bin中编译和生成Java类
- # make clean 清除编译结果
- # make rebuild 清除编译结果并重新编译(clean + build)
- # make run 检查执行结果
- # make jar 生成可执行JAR文件
Apache Ant
Ant是由Apache软件基金会开发的一种构建工具
Ant是将构建系统中的每个活动封装成高级任务
- ant compile:用于编译所有Java源文件到类文件中
- ant jar:将类文件打包为单个JAR文件
- ant package:用于创建完整的软件版本包,完成版本号
- ant clean:用于从生成树中移除所有生成的文件
- ant javadoc:使用JavaDoc工具生成API文档
- ant:用于执行默认目标,最可能与包目标相同
编译文件:build.xml
Ant内置文件和可选任务
基本文件操作,如mkdir、复制、移动和删除
使用不同格式的数组(例如 .tar, .gz, .zip, .jar, 和 .rpm)创建文件归档文件
Java代码编写的专用工具,包括RMI和问卷编制
使用JavaDoc工具自动生成API文档
直接访问版本控制工具,如CVS、PrimCE和CuleCaseCox
构建生命周期特征,例如更新生成版本号、发送电子邮件消息和播放声音以指示生成过程的完成。
检查完成任务列表
Apache Maven
Apache Maven是一个软件项目管理和理解工具
-基于项目对象模型(POM)的概念,Maven可以管理一个项目的构建、报告和文档
IDE集成:Eclipse ID-M2Eclipse
Maven的主要目标是允许开发人员在最短的时间内了解开发工作的完整状态
-使构建过程变得简单
-提供统一的构建系统
-提供优质工程信息
-提供最佳实践发展指南
-允许透明迁移到新特性
validate - 验证项目是否正确并提供所有必要的信息
compile - 编译项目的源代码
test - 使用单元测试框架测试编译后的源代码
package - 获取编译后的代码并将其打包为可分发格式,例如jar
verify - 对集成测试结果进行检查以确保质量标准得到满足
Install - 将包安装到本地存储库中,用作本地其他项目的依赖项
deploy - 在生成环境中完成,将最终包复制到远程存储库,以便与其他开发人员和项目共享
以可视化的方式build
Eclipse IDE提供了一套完整的开发工具,用于代码编辑、编译、版本控制、测试和任务跟踪
Eclipse中的构建功能只是更广泛的工具集的一部分,编译发生在幕后,而您甚至不知道它正在发生,Eclipse GUI使构建无缝地协同工作
你不写一个构建描述文件(比如一个Makefile):Eclipse对软件的结构已经足够了解了
依赖于GUI提供构建功能使得构建构建系统变得简单,但也限制了可用特征集
2-2 软件构造的过程、系统和工具
一、软件建设的一般过程
1)程序设计
构造语言:
从用途上划分 :
编程语言( C, C++, Java, Python)
建模语言(UML)
配置语言(XML)
构建语言(XML)
从形态上划分:
基于语言学的构造语言
基于数学的形式化构造语言
基于图形的可视化构造语言
编程语言:
设计工具 - 集成开发环境:
源代码编辑器、智能代码补全工具、代码重构工具
文件管理
库管理
软件逻辑实体可视化
图形化用户界面构造器
编译器、解释器
自动化build工具
版本控制系统
外部的第三方工具
作为IDE示例的Eclipse:
Eclipse IDE:Java的开放源码IDE,但不限于,C/C++、PHP、Python等,作为专有的IBM产品(SimultalSimulefor Simultals/Java)开始
它包含一个基本的工作空间,包括用于编码、构建、运行和调试应用程序的工具,以及用于定制环境的可扩展插件系统
插件是结构化的代码包和/或数据,它们为系统提供功能。功能可以以代码库、平台扩展甚至文档的形式进行贡献
插件可以定义扩展点,定义良好的地方,其他插件可以添加功能
建模语言
建模语言是任何一种人工语言,它可以用来表达由一致的规则集定义的结构中的信息或知识或系统,其目的是可视化、推理、验证和传达系统的设计
UML作为建模语言及工具实例
配置语言
配置文件配置程序的参数和初始设置:
应用程序应该提供工具来创建、修改和验证其配置文件的语法
一些计算机程序只在启动时读取配置文件。其他人定期检查配置文件以进行更改
目的实例:
部署环境设置
应用程序特性的变体
组件之间的连接变型
配置语言示例:
XML, YAML, JSON
2)回顾与静态代码分析
代码评审:代码审查是源代码的系统检查(同行评审)
-在初期开发阶段发现错误,提高整体素质
-评审以各种形式进行,如结对编程、走查、正式评审会议、自动化评审
正式的代码评审会议
正式代码审查,如FAGC检查,涉及仔细和详细的过程,多个参与者和多个阶段
-正式的代码评审是传统的审查方法,其中软件开发人员参加一系列会议并逐行评审代码,通常使用材料的打印副本
-正式检查是非常彻底的,并已被证明是有效的发现缺陷的代码审查
轻量级的代码评审
轻量级代码审查通常需要较少的开销比正式代码检查,但它可以同样有效的时候做得很好
轻量级审查通常作为正常开发过程的一部分进行
在肩上 - 一个开发者在作者的肩膀上看着后者的代码
电子邮件通过 - 源代码管理系统电子邮件代码自动审阅后作出
结对编程 - 两个作者在同一工作站上共同开发代码,这在极限编程中是常见的
工具辅助代码审查 - 作者和审阅者使用软件工具,如巴氏杆菌和IRC之类的非正式工具,或专为同行代码审查设计的专用工具
利用工具进行的静态代码分析
静态代码分析是在没有实际执行程序的情况下执行的计算机软件的分析(在执行程序上执行的分析称为动态分析)
该过程提供了对代码结构的理解,并有助于确保代码遵守行业标准
自动化工具可以帮助程序员和开发人员进行静态分析。例如,JAVA的检查样式、FunBug、PMD
3)动态代码分析/剖析
动态分析:要执行程序并观察现象、收集数据、分析不足
-必须用足够的测试输入来执行目标程序以产生有趣的行为
-使用诸如代码覆盖率之类的软件测试措施有助于确保程序的一组可能行为的适当切片被观察到
-对代码的运行时状态和性能进行度量,发现代码中的潜在问题
4)调试与测试
测试:发现程序是否有错误
-软件测试是为利益相关者提供被测试产品或服务质量信息的调查
-测试技术包括执行程序或应用程序的过程,目的是发现软件缺陷(错误或其他缺陷),并验证软件产品是否适合使用
-软件测试涉及执行软件组件或系统组件来评估一个或多个感兴趣的属性
调试:定位错误、发现错误根源
-调试是识别错误的根本原因并纠正错误的过程
-它与测试相对比,这是最初检测错误的过程,调试是成功测试的结果
-在一些项目中,调试占用了总开发时间的50%
-对于许多程序员来说,调试是编程中最困难的部分
-与测试一样,调试不是提高软件质量的一种方法,但它是诊断缺陷的一种方法
-软件质量必须从一开始就建立起来。建立优质产品的最佳方法是仔细开发需求,设计好,并使用高质量的编码实践
-调试是最后的手段
5)重构
重构:在不改变功能的前提下优化代码
重构是一种改变软件系统的过程,它不会改变代码的外部行为,而改善其内部结构
-产生短期收益/工作成本,获得长期收益,并长期投资于系统的整体质量
重构是
-重组(重新排列)代码
-在一系列小的语义保持变换中
-为了使代码更易于维护和修改
重构不仅仅是旧的重组
-您需要保持代码工作
-需要保留语义的小步骤
-您需要进行单元测试来证明代码工作
二、软件建设的狭义过程(构建)
1)构建系统
典型情景生成:
汇编语言编写的软件,如C、C++、Java和C语言
用Perl和Python等解释语言编写的软件的封装和测试
基于Web的应用程序的编译和打包
-这些包括静态HTML页面、Java或C语言编写的源代码、使用JSP(JavaServer页面)编写的混合文件、ASP(Active Server页面)或PHP(超文本预处理器)语法,以及多种类型的配置文件
执行单元测试以验证与软件的其余部分隔离的软件的小部分
执行静态分析工具以识别程序源代码中的缺陷。这个构建系统的输出是一个bug报告文档,而不是一个可执行程序
PDF或HTML文档的生成。这种类型的构建系统在不同格式的范围内消耗输入文件,但生成输出的可读文档
编译语言
C语言、C++语言、Java语言和C语言编写的语言。在这个模型中,源文件被编译成对象文件,然后将它们链接到代码库或可执行程序中
生成的文件被收集到可以安装在目标机器上的发布包中
版本控制工具
源树和对象树:特定开发人员工作的源文件和编译对象文件集
编译工具:获取输入文件并生成输出文件的工具(例如,将源代码文件转换为目标代码和可执行程序)。编译工具的常见示例包括C或Java编译器,但它们也包括文档和单元测试生成器
构建机器:执行编译工具的计算设备
释放包装和目标机器:软件打包的方法,分发给终端用户,然后安装在目标机器上
理解的语言
解释的源代码不被编译成目标代码,因此不需要对象树。源文件本身被收集到发布包中,准备安装在目标机器上
编译工具着重于转换源文件并将它们存储在发布包中
编译时,机器代码不会在运行时执行,即使在运行时可能发生
基于Web的应用
基于Web的应用程序的构建系统是编译代码、解释代码和配置或数据文件的混合体
一些文件(例如HTML文件)直接从源树复制到发布包,而其他文件(如Java源文件)则首先编译成目标代码
静态HTML文件,只包含要在Web浏览器中显示的标记数据。这些文件直接复制到发行包中
包含由最终用户的Web浏览器解释的代码的JavaScript文件。这些文件也直接复制到发行包中
JSP、ASP或PHP,HTML页,含mix of和程序代码。These are executed by the files and compiled rather than by the Web Application Server构建系统。these files are also to the release复制安装包,准备为on the Web服务器
将Java源文件编译成目标代码并打包为Web应用程序的一部分。生成系统在打包Java类文件之前执行此转换。Java类在Web应用服务器上执行,甚至在Web浏览器中执行(使用Java applet)
2)构建系统的组件
构建系统的组件:
版本控制工具
源树:一个程序的源代码存储为多个磁盘文件。这种文件的不同排列被称为源树。源树的结构经常反映软件的体系结构
对象树:一个单独的树层次结构,它存储由构建过程构造的任何对象文件或可执行程序
编译工具:将人类可读源文件翻译成机器可读的可执行程序文件的程序
-编译器:源文件 -> 对象文件
-链接器:多个相关对象文件 -> 可执行程序映像
-基于UML的代码生成器 -> 模型源代码文件
-脚本文件 -> 文件发生器
构建工具:一个在编译工具之上运行的程序。它必须有足够的知识源文件和对象文件之间的关系,它可以协调整个构建过程。生成工具调用必要的编译工具来生成最终的生成输出
构建机器:编译和构建工具执行的机器
-本地编译环境:该软件在与构建机器相同的目标机器上执行
-交叉编译环境:需要两台不同的机器,在目标机上有不同的操作系统或CPU
构建系统的组件
释放包装和目标机器:生产一些你可以在用户机器上安装的东西
-从源和对象树中提取相关文件并将其存储在发布包中
-发布包应该是一个单独的磁盘文件,并且应该被压缩以减少下载所需的时间
-任何非必需的调试信息都应该被删除,这样它就不会干扰软件的安装
包装类型:
-存档文件:zip和unzip
-包管理工具:UNIX风格,如.rpm和.db
-定制的GUI安装工具:Windows风格
3)生成过程和生成描述
构造过程
生成过程:生成工具调用每个编译工具来完成任务,这是一个端到端的事件序列
生成语言(build描述):
生成工具需要以基于文本的格式编写生成描述,它遵循特定的构建语言的语法规则
例如,在使用make时,以规则的形式指定互文件依赖性信息,这些规则存储在名为Makefile的文件中
您可以手动编写描述,也可以通过IDE生成描述
如何使用构建系统
开发人员(或私有)构建:开发人员已经从VCS签出了源代码,并且正在私有工作空间中构建软件
发布构建:为测试组提供完整的软件包进行验证。当测试员确信软件的质量足够高时,同样的软件包就可供客户使用
正常构建:生成过程确定当前源代码是否没有错误,并通过基本的健全性测试集。这种类型的构建可以每天发生多次,并且趋于完全自动化
-每日构建
-持续集成
4)Java中的编译工具
JAVA怎么样
Java语言的一大卖点就是它的“一次写,随处可见”的哲学
也就是说,应该在Linux机器上编译一个Java程序,但是在Windows或Solaris机器上运行它,而不需要任何修改
这是通过使用Java虚拟机(JVM)解释的一组标准字节代码来实现的
由于Java的安全特性,有可能限制Java程序执行的环境,因此允许不受信任的程序执行而不必损害主机
Java中的编译工具
Java开发工具包(JDK)
GNU Java编译器
Eclipse的Java编译器(ECJ)
JAVA的源文件
Java类的对象文件格式称为类文件,并具有.class的后缀
与机器无关的字节码来描述程序的流程,而不是直接编译成本机代码
Java虚拟机(JVM)需要加载和解释这些字节代码,尽管JVM可能在实际执行程序之前首先将它们转换为本机代码
使用Javac命令将Java源文件翻译成类文件
Java的可执行程序
Java编程是动态类加载。不需要生成时间链接步骤来生成可执行程序。相反,当运行程序需要Java类时,Java类被单独加载到内存中。没有可加载的单个可执行程序映像
Java程序只是动态库的集合,虽然单个类每次加载一个类,而不是作为更大的共享库的一部分
Java程序需要执行两件事:
-JVM必须提供一个包含主方法的类的名称。这被用作执行的起点
-JVM还必须提供一个类路径,用于识别其他类可以位于何处
Java中的库
除了指定可以找到.class文件的目录列表之外,Java类还可以放入更大的存档文件中,称为jar文件
大多数Java应用程序更喜欢JAR文件格式(带有.jar后缀),仅仅因为它比包装更容易操作JAR文件并分发大量.class文件
JAR文件通常被用作分发程序的一种手段
不仅可以在JAR文件中打包自己的软件,还可以通过获取其他人的JAR文件并将它们添加到自己的类路径中来合并第三方包
由于动态加载系统,您可以随时更换和升级JAR文件
5)子目标和构建变量
构建方式
是否只有一种方式将每个源文件编译并链接到一个可执行程序中,并且只生成一种类型的释放包?
然而,实际上,可以存在任意数量的变体,每个变体使用稍微修改的构建过程并创建稍微不同的发布包
三种不同的构建方式
构建子目标:只对生成树的一部分进行增量更改的开发人员更喜欢只重建他们正在积极工作的树的一部分
构建不同版本的软件:输出被定制以改变软件的行为。这些变化可能包括支持自然语言或支持不同组合的产品特征,如家庭或专业版
构建不同的目标体系结构:为了在不同的目标机器上支持软件产品,必须为各种不同的CPU类型和操作系统编译相同的源文件集。这包括诸如x86、MIPS和PowerPC之类的CPU,以及Linux、Windows和Mac OS X.等操作系统
构建子目标
任何大型软件都可以分为多个子组件,通常是静态或动态库的形式。每个组件只提供程序的全部功能的一部分,并且独立于其他组件开发
为了避免在构建完整的源树以创建最终的可执行程序时花费时间,最好选择限制它们所构建的子组件的数量,而不是总是重建整个源树
构建不同版本的软件
不同版本的制作:
-语言与文化,本土化
-硬件变化
-期权定价
建立指定的变体:
改变代码:
-逐行变化
-逐个变化文件
-逐个变化目录
-逐个变化的描述文件的建立
构建不同的目标体系结构
只有当C语言和C++语言编译成本地代码时,这种类型的变体才是相关的
它与使用机器无关虚拟机的Java和C无关
6)生成工具
For Java:
– Make
– Ant
– Maven
– Gradle
– Eclipse IDE
Make
使用make和Mafile文件构建Java项目
命令:
- # make new 生成子目录(src,bin,res)
- # make build 在bin中编译和生成Java类
- # make clean 清除编译结果
- # make rebuild 清除编译结果并重新编译(clean + build)
- # make run 检查执行结果
- # make jar 生成可执行JAR文件
Apache Ant
Ant是由Apache软件基金会开发的一种构建工具
Ant是将构建系统中的每个活动封装成高级任务
- ant compile:用于编译所有Java源文件到类文件中
- ant jar:将类文件打包为单个JAR文件
- ant package:用于创建完整的软件版本包,完成版本号
- ant clean:用于从生成树中移除所有生成的文件
- ant javadoc:使用JavaDoc工具生成API文档
- ant:用于执行默认目标,最可能与包目标相同
编译文件:build.xml
Ant内置文件和可选任务
基本文件操作,如mkdir、复制、移动和删除
使用不同格式的数组(例如 .tar, .gz, .zip, .jar, 和 .rpm)创建文件归档文件
Java代码编写的专用工具,包括RMI和问卷编制
使用JavaDoc工具自动生成API文档
直接访问版本控制工具,如CVS、PrimCE和CuleCaseCox
构建生命周期特征,例如更新生成版本号、发送电子邮件消息和播放声音以指示生成过程的完成。
检查完成任务列表
Apache Maven
Apache Maven是一个软件项目管理和理解工具
-基于项目对象模型(POM)的概念,Maven可以管理一个项目的构建、报告和文档
IDE集成:Eclipse ID-M2Eclipse
Maven的主要目标是允许开发人员在最短的时间内了解开发工作的完整状态
-使构建过程变得简单
-提供统一的构建系统
-提供优质工程信息
-提供最佳实践发展指南
-允许透明迁移到新特性
validate - 验证项目是否正确并提供所有必要的信息
compile - 编译项目的源代码
test - 使用单元测试框架测试编译后的源代码
package - 获取编译后的代码并将其打包为可分发格式,例如jar
verify - 对集成测试结果进行检查以确保质量标准得到满足
Install - 将包安装到本地存储库中,用作本地其他项目的依赖项
deploy - 在生成环境中完成,将最终包复制到远程存储库,以便与其他开发人员和项目共享
以可视化的方式build
Eclipse IDE提供了一套完整的开发工具,用于代码编辑、编译、版本控制、测试和任务跟踪
Eclipse中的构建功能只是更广泛的工具集的一部分,编译发生在幕后,而您甚至不知道它正在发生,Eclipse GUI使构建无缝地协同工作
你不写一个构建描述文件(比如一个Makefile):Eclipse对软件的结构已经足够了解了
依赖于GUI提供构建功能使得构建构建系统变得简单,但也限制了可用特征集