资讯专栏INFORMATION COLUMN

第2章:软件构建的过程和工具 2.2软件构建的过程,系统和工具

godiscoder / 1038人阅读

摘要:建模语言建模语言是可用于表达信息或知识或系统的任何人造语言,该结构由一组一致的规则定义,目标是可视化,推理,验证和传达系统设计。将这些文件安排到不同的地方称为源代码树。源代码树的结构通常反映了软件的体系结构。

大纲

软件构建的一般过程:

编程/重构

审查和静态代码分析

调试(倾倒和记录)和测试

动态代码分析/分析

软件构建的狭义过程(Build):

构建系统:组件和过程

构建变体并构建语言 - 构建工具:Make,Ant,Maven,Gradle,Eclipse

总结

软件构建的一般过程

(1)编程
构建语言可根据以下两种原则分类:

语言的目的

编程语言(例如C,C ++,Java,Python)

建模语言(例如UML)

配置语言(例如XML)

构建语言(如XML)

语言的形式

基于语言学的

基于数学(形式语言)

基于图形(可视化)

(1)编程语言

编程工具
集成开发环境(IDE):为程序员提供软件开发的综合设施。
IDE通常由以下部分组成:

带智能代码完成的代码编辑器,代码重构工具

文件管理工具

库管理工具

类浏览器,对象浏览器,类层次结构图

图形用户界面(GUI)生成器

编译器,解释器

构建自动化工具

版本控制系统

可通过更多外部第三方工具扩展

Eclipse作为IDE的例子
Eclipse IDE:用于Java的开放源代码IDE,但不限于C / C ++,PHP,Python等,最初是作为专有IBM产品开发的(Visual age for Smalltalk / Java)

它包含一个基础工作区,其中包含用于编码,构建,运行和调试应用程序的工具以及用于定制环境的可扩展插件系统。

插件是为系统贡献功能的结构化代码和/或数据包。功能可以以代码库,平台扩展甚至文档的形式提供。

插件可以定义扩展点,定义明确的地方,其他插件可以添加功能。

Eclipse IDE的核心组件
运行时核心

平台运行时内核实现启动平台基础并动态发现并运行插件的运行时引擎。

插件是一个结构化组件,它使用OSGi清单(MANIFEST.MF)文件和插件清单(plugin.xml)文件向系统描述自己。该平台维护已安装插件的注册表及其提供的功能。

资源管理

资源管理插件定义了用于管理工具插件工件的公共资源模型。插件可以创建和修改用于在磁盘上组织和存储开发工件的项目,文件夹和文件。

Eclipse IDE的核心组件
工作台UI核心

该插件实现了工作台UI,并定义了许多扩展点,允许其他插件提供菜单和工具栏操作,拖放操作,对话框,向导以及自定义视图和编辑器。

标准Widget工具包(SWT)和JFace框架

Java开发工具(JDT)

它通过提供用于编辑,查看,编译,调试和运行Java代码的功能来扩展平台工作台。

插件开发环境(PDE)

自动创建,操作,调试和部署插件的工具。

(2)建模语言

建模语言是可用于表达信息或知识或系统的任何人造语言,该结构由一组一致的规则定义,目标是可视化,推理,验证和传达系统设计。

UML:Unified Modeling Language统一建模语言

(3)配置语言

配置文件配置程序的参数和初始设置。

应用程序应提供工具来创建,修改和验证其配置文件的语法;

某些计算机程序仅在启动时读取其配置文件。其他人定期检查配置文件的变化。

目的示例:

部署环境设置

应用程序功能的变体

组件之间连接的变体

配置语言示例:

键值文本(.ini,.properties,.rc等)

XML,YAML,JSON

(2)回顾和静态代码分析

审查和静态分析/检查
代码审查是对源代码的系统审查(同行评议)。

旨在发现初始发展阶段忽视的错误,提高整体质量。

评审以各种形式完成,如配对编程,非正式演练和正式检查。

正式的代码审查

正式的代码审查,例如Fagan检查,涉及多个参与者和多个阶段的仔细和详细的过程。

正式的代码审查是传统的审查方式,软件开发者通常使用材料的印刷副本逐行参加一系列会议和审查代码。

正式检查非常彻底,已被证明有效发现所审查代码中的缺陷。

轻量级代码审查

轻量级代码审查通常比正式的代码检查要求更少的开销,但如果正确完成,它可以同样有效。
轻量级审查通常作为正常开发过程的一部分进行:

在肩上(Over the shoulder)——一位开发人员从作者的肩膀上看过去,然后检查代码。

电子邮件传递 - 源代码管理系统在签入后自动将电子邮件代码发送给审阅者。

结对编程 - 两位作者在同一工作站上共同开发代码,这在极限编程中很常见。

工具辅助代码审查 - 作者和审稿人使用软件工具,非正式的例如pastebins和IRC,或专为同行代码审查而设计的工具。

静态代码分析

静态代码分析是在没有实际执行程序的情况下执行的计算机软件分析(对执行程序执行的分析称为动态分析)。
该过程提供了对代码结构的理解,并有助于确保代码符合行业标准。
自动化工具可以帮助程序员和开发人员进行静态分析。

例如,CheckStyle,FindBugs和PMD for Java

(3)动态代码分析/性能分析

动态程序分析是通过执行程序执行的软件分析。
目标程序必须执行足够的测试输入以产生有趣的行为。
使用诸如代码覆盖率之类的软件测试措施有助于确保已经观察到该程序的一组可能行为的足够部分。
性能分析(“程序性能分析”,“软件性能分析”)是一种动态程序分析的形式,用于度量程序的空间(内存)或时间复杂度,特定指令的使用情况,函数调用的频率和持续时间。

(4)调试和测试

什么是测试?
软件测试是一项调查,旨在为利益相关者提供有关被测产品或服务质量的信息。
测试技术包括执行程序或应用程序的过程,目的是查找软件错误(错误或其他缺陷),并验证软件产品是否适合使用。
软件测试涉及执行软件组件或系统组件来评估一个或多个感兴趣的属性。

什么是调试?
调试是识别错误的根本原因并对其进行纠正的过程。与测试形成对比,测试是最初检测错误的过程,调试是作为成功测试的结果而发生的。

在某些项目中,调试占用了总开发时间的50%。

对于许多程序员来说,调试是编程中最难的部分。

像测试一样,调试不是提高软件质量的方法,但它是诊断缺陷的一种方法。

软件质量必须从一开始就内置。构建优质产品的最佳方式是仔细开发需求,设计良好并使用高质量的编码实践。

调试是最后的手段。

(5)重构

重构是改变软件系统的过程,它不会改变代码的外部行为,但会改进其内部结构。

投入短期时间/工作成本以获得长期收益,并对系统的整体质量进行长期投资。

重构包括:

重组(重新排列)代码...

...在一系列小的保留语义的转换中......

...为了使代码更易于维护和修改

重构不仅仅是旧的重组

您需要保持代码正常工作

您需要一些小步骤来保留语义

您需要进行单元测试来证明代码正常工作

2软件构建的狭义过程(Build)

粗略理解build:build-time到run-time 借助于工具,将软件构造各阶段的活动“自动化” (编译、打包、静态分析、测试、生成文档、部署、…) 尽可能脱离“手工作业”,提高构造效率。

(1)构建系统

典型的BUILD场景
用传统编译语言编写的软件,如C,C ++,Java和C#。
用诸如Perl和Python之类的解释性语言编写的软件的打包和测试。
编译和打包基于Web的应用程序。

这些包括静态HTML页面,使用Java或C#编写的源代码,使用JSP(Java Server Pages),ASP(Active Server Pages)或PHP(超文本预处理器)语法编写的混合文件以及多种类型的配置文件。

执行单元测试以验证软件的一小部分与代码的其余部分隔离。
执行静态分析工具来识别程序源代码中的错误。 这个构建系统的输出是一个错误报告文档,而不是一个可执行程序。
生成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)构建系统的组件

版本控制工具
源代码树:程序的源代码被存储为多个磁盘文件。 将这些文件安排到不同的地方称为源代码树。 源代码树的结构通常反映了软件的体系结构。
对象树:一个多带带的树层次结构,用于存储由构建过程构建的任何对象文件或可执行程序。
编译工具:将可读的源文件转换为机器可读的可执行程序文件的程序。

编译器:源文件对象文件

链接器:多个相关的目标文件可执行程序映像

基于UML的代码生成器:模型源代码文件

文件生成器:脚本文件

构建系统的组件

构建工具:一种在编译工具之上的级别上运行的程序。 它必须对源文件和目标文件之间的关系有足够的了解,以便它可以编排整个构建过程。 构建工具调用必要的编译工具来产生最终的构建输出。

构建机器:编译和构建工具执行的机器。

本地编译环境:软件在与生成机器相同的目标机器上执行;

交叉编译环境:需要两台不同的机器,目标机器上有不同的操作系统或CPU。

发布打包和目标机器:生成可以实际安装在用户机器上的东西。

从源和目标树中提取相关文件并将它们存储在发行包中。

发行包应该是单个磁盘文件,并且应该进行压缩以减少下载所需的时间。

任何不必要的调试信息都应该被删除,以免它们扰乱软件的安装。

包装类型:

档案文件:zip和解压缩

软件包管理工具:UNIX风格,例如.rpm和.deb

定制的GUI安装工具:Windows风格

(3)构建过程和构建描述

构建过程:构建工具调用每个编译工具来完成工作,这是一个端到端的事件序列。

构建语言(构建说明)
构建工具需要构建描述以基于文本的格式编写。

它遵循特定构建语言的语法规则。

例如,使用Make时,将以规则的形式指定文件间依赖关系信息,这些规则存储在名为Makefile的文件中。
您可以手动编写描述或通过IDE生成描述。

如何使用构建系统
开发人员(或私人)构建:开发人员检出了VCS的源代码并正在专用工作区中构建软件。
发布版本:为测试组提供一个完整的软件包供验证。 当测试人员确信软件的质量足够高时,就可以为客户提供相同的软件包。

可用性构建:构建过程确定当前的源代码是否没有错误并且通过了一套基本的可用性测试。 这种构建可以每天发生多次,并且趋向于完全自动化。

每日生成/每晚构建

持续集成(CI)

(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程序需要执行两件事情:

必须为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)构建工具

Java的构建工具:

Make

Ant

Maven

Gradle

Eclipse IDE

总结

软件构建的一般过程:设计->编程/重构->调试->测试->构建->发布

编程/重构

审查和静态代码分析

调试(倾倒和记录)和测试

动态代码分析/分析

软件构建的狭义过程(Build):验证->编译->链接->测试->软件包->安装->部署

构建系统:组件和过程

构建变体并构建语言

构建工具:Make,Ant,Maven,Gradle,Eclipse

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71331.html

相关文章

  • 5:可复用性软件构建方法 5.1可复用性度量,形态外部观察

    摘要:大纲什么是软件复用如何衡量可复用性可复用组件的级别和形态源代码级别复用模块级别的复用类抽象类接口库级别的复用包系统级别的复用框架对可复用性的外部观察类型变化例行分组实施变更代表独立分解常见行为总结什么是软件复用软件复用软件复用是使用现有软件 大纲 什么是软件复用?如何衡量可复用性?可复用组件的级别和形态 源代码级别复用 模块级别的复用:类/抽象类/接口 库级别的复用:API /包 系...

    mengera88 评论0 收藏0
  • 前端开发者手册2019

    摘要:年,和前端开发者与应用程序前端开发者之间产生了巨大的分歧。开发最常见的解决方案有手机和平板的原生应用程序桌面应用程序桌面应用程序原生技术最后,前端开发者可以从浏览器开发中学习到,编写代码不需要考虑浏览器引擎的限制。 前端开发者手册2019 Cody Lindley 编著 原文地址 本手册由Frontend Masters赞助,通过深入现代化的前端工程课程来提高你的技能。 下载:PDF ...

    xiao7cn 评论0 收藏0
  • 前端开发者手册2019

    摘要:年,和前端开发者与应用程序前端开发者之间产生了巨大的分歧。开发最常见的解决方案有手机和平板的原生应用程序桌面应用程序桌面应用程序原生技术最后,前端开发者可以从浏览器开发中学习到,编写代码不需要考虑浏览器引擎的限制。 前端开发者手册2019 Cody Lindley 编著 原文地址 本手册由Frontend Masters赞助,通过深入现代化的前端工程课程来提高你的技能。 下载:PDF ...

    church 评论0 收藏0
  • 前端开发者手册2019

    摘要:年,和前端开发者与应用程序前端开发者之间产生了巨大的分歧。开发最常见的解决方案有手机和平板的原生应用程序桌面应用程序桌面应用程序原生技术最后,前端开发者可以从浏览器开发中学习到,编写代码不需要考虑浏览器引擎的限制。 前端开发者手册2019 Cody Lindley 编著 原文地址 本手册由Frontend Masters赞助,通过深入现代化的前端工程课程来提高你的技能。 下载:PDF ...

    邹立鹏 评论0 收藏0

发表评论

0条评论

godiscoder

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<