软件构建的通常过程:java
软件构建的狭义过程(Build):程序员
总结编程
(1)编程
构建语言可根据如下两种原则分类:小程序
语言的目的浏览器
语言的形式安全
(1)编程语言服务器
编程工具
集成开发环境(IDE):为程序员提供软件开发的综合设施。
IDE一般由如下部分组成:架构
Eclipse做为IDE的例子
Eclipse IDE:用于Java的开放源代码IDE,但不限于C / C ++,PHP,Python等,最初是做为专有IBM产品开发的(Visual age for Smalltalk / Java)框架
Eclipse IDE的核心组件
运行时核心编程语言
资源管理
Eclipse IDE的核心组件
工做台UI核心
Java开发工具(JDT)
插件开发环境(PDE)
(2)建模语言
建模语言是可用于表达信息或知识或系统的任何人造语言,该结构由一组一致的规则定义,目标是可视化,推理,验证和传达系统设计。
UML:Unified Modeling Language统一建模语言
(3)配置语言
配置文件配置程序的参数和初始设置。
目的示例:
配置语言示例:
(2)回顾和静态代码分析
审查和静态分析/检查
代码审查是对源代码的系统审查(同行评议)。
正式的代码审查
正式的代码审查,例如Fagan检查,涉及多个参与者和多个阶段的仔细和详细的过程。
轻量级代码审查
轻量级代码审查一般比正式的代码检查要求更少的开销,但若是正确完成,它能够一样有效。
轻量级审查一般做为正常开发过程的一部分进行:
静态代码分析
静态代码分析是在没有实际执行程序的状况下执行的计算机软件分析(对执行程序执行的分析称为动态分析)。
该过程提供了对代码结构的理解,并有助于确保代码符合行业标准。
自动化工具能够帮助程序员和开发人员进行静态分析。
(3)动态代码分析/性能分析
动态程序分析是经过执行程序执行的软件分析。
目标程序必须执行足够的测试输入以产生有趣的行为。
使用诸如代码覆盖率之类的软件测试措施有助于确保已经观察到该程序的一组可能行为的足够部分。
性能分析(“程序性能分析”,“软件性能分析”)是一种动态程序分析的形式,用于度量程序的空间(内存)或时间复杂度,特定指令的使用状况,函数调用的频率和持续时间。
(4)调试和测试
什么是测试?
软件测试是一项调查,旨在为利益相关者提供有关被测产品或服务质量的信息。
测试技术包括执行程序或应用程序的过程,目的是查找软件错误(错误或其余缺陷),并验证软件产品是否适合使用。
软件测试涉及执行软件组件或系统组件来评估一个或多个感兴趣的属性。
什么是调试?
调试是识别错误的根本缘由并对其进行纠正的过程。与测试造成对比,测试是最初检测错误的过程,调试是做为成功测试的结果而发生的。
像测试同样,调试不是提升软件质量的方法,但它是诊断缺陷的一种方法。
(5)重构
重构是改变软件系统的过程,它不会改变代码的外部行为,但会改进其内部结构。
重构包括:
重构不只仅是旧的重组
2软件构建的狭义过程(Build)
粗略理解build:build-time到run-time 借助于工具,将软件构造各阶段的活动“自动化” (编译、打包、静态分析、测试、生成文档、部署、…) 尽量脱离“手工做业”,提升构造效率。
(1)构建系统
典型的BUILD场景
用传统编译语言编写的软件,如C,C ++,Java和C#。
用诸如Perl和Python之类的解释性语言编写的软件的打包和测试。
编译和打包基于Web的应用程序。
执行单元测试以验证软件的一小部分与代码的其他部分隔离。
执行静态分析工具来识别程序源代码中的错误。 这个构建系统的输出是一个错误报告文档,而不是一个可执行程序。
生成PDF或HTML文档。 这种类型的构建系统使用一系列不一样格式的输入文件,但生成可读的文档做为输出。
编译型语言
编译型语言,如C,C ++,Java和C#。 在这个模型中,源文件被编译成目标文件,而后连接到代码库或可执行程序中。
生成的文件被收集到可安装在目标机器上的发行包中。
解释型语言
解释型语言的源代码不会被编译到目标代码中,因此不须要对象树。 源文件自己被收集到一个发行包中,能够安装在目标机器上。
编译工具专一于转换源文件并将它们存储在发行包中。
编译成机器码不会在构建时执行,而是可能在运行时发生。
基于Web的应用程序
基于Web应用程序的构建系统是编译代码,解释代码和配置或数据文件的混合。
有些文件(如HTML文件)直接从源代码树复制到发行包,而其余文件(如Java源文件)则首先编译为目标代码。
静态HTML文件,只包含标记数据以便在Web浏览器中显示。 这些文件直接复制到发行包。
包含代码的JavaScript文件将由最终用户的Web浏览器解释。 这些文件也直接复制到发行包。
JSP,ASP或PHP页面,包含HTML和程序代码的混合。 这些文件由Web应用程序服务器而不是构建系统编译和执行。 这些文件也被复制到发布包中,准备安装到Web服务器上。
将Java源文件编译为目标代码并打包为Web应用程序的一部分。 构建系统在打包Java类文件以前执行此转换。 Java类在Web应用程序服务器上执行,甚至在Web浏览器内执行(使用Java小程序)。
(2)构建系统的组件
版本控制工具
源代码树:程序的源代码被存储为多个磁盘文件。 将这些文件安排到不一样的地方称为源代码树。 源代码树的结构一般反映了软件的体系结构。
对象树:一个单独的树层次结构,用于存储由构建过程构建的任何对象文件或可执行程序。
编译工具:将可读的源文件转换为机器可读的可执行程序文件的程序。
构建系统的组件
构建工具:一种在编译工具之上的级别上运行的程序。 它必须对源文件和目标文件之间的关系有足够的了解,以便它能够编排整个构建过程。 构建工具调用必要的编译工具来产生最终的构建输出。
构建机器:编译和构建工具执行的机器。
发布打包和目标机器:生成能够实际安装在用户机器上的东西。
包装类型:
(3)构建过程和构建描述
构建过程:构建工具调用每一个编译工具来完成工做,这是一个端到端的事件序列。
构建语言(构建说明)
构建工具须要构建描述以基于文本的格式编写。
例如,使用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中的库
除了指定能够找到.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)构建工具
Java的构建工具:
总结
软件构建的通常过程:设计->编程/重构->调试->测试->构建->发布
软件构建的狭义过程(Build):验证->编译->连接->测试->软件包->安装->部署