建筑语言
从用途上划分
编程语言 (e.g., C, C++, Java, Python),建模语言(e.g., UML), 配置语言(e.g., XML),构建语言 (e.g., XML, YAML, JSON)
从形态上划分
基于语言学的构造语言,基于数学的形式化构造语言,基于图形的可视化构造语言
编程工具:
集成开发环境 (IDE)
组成:
源代码编辑器、智能代码补全工具、代码重构工具
文件管理
库管理
软件逻辑实体可视化
图形化用户界面构造器
编译器、解释器
自动化build工具
版本控制系统
外部的第三方工具
建模语言是一种人工语言,用于表达信息、知识或系统,以一套一致的规则定义来可视化、推理、验证和交流系统的设计。
配置文件配置程序的参数和初始设置
应用程序应该提供工具来创建、修改和验证配置文件的语法;
-一些计算机程序只在启动时读取它们的配置文件,其他计算机定期检查配置文件中的更改
目的的例子:
-部署环境设置
-应用程序功能的变体
-组件之间连接的变体
配置语言例子:
-键值文本(.ini, .properties, .rc等)
在运行时改变软件的行为
分离稳定和不稳定的部分
代码评审
代码评审是对源代码的系统检查(同行评审),旨在发现开发初期被忽视的错误,提高整体质量,审查以各种形式进行,如结对编程、非正式演练和正式检查。
– 结对编程
– 走查
– 正式评审会议
– 自动化评审
正式的代码评审会议
正式的代码评审会议涉及到一个包含多个参与者和多个阶段的谨慎和详细的过程。
正式的代码评审是传统的评审方法,在这种方法中,软件开发人员参加一系列会议,逐行评审代码,通常使用打印的材料副本。
正式的检查是非常彻底的,并且已经被证明可以有效地在检查的代码中发现缺陷。
轻量级的代码评审
轻量级代码审查通常比正式的代码检查需要更少的开销,但是如果处理得当,它也可以同样有效。
轻量级评审通常作为正常开发过程的一部分进行:
越过肩膀——当作者编写代码时,开发人员会越过他的肩膀。
电子邮件传递-源代码管理系统电子邮件代码自动审查后签入。
结对编程——两位作者在同一工作站上一起开发代码,这在极限编程中很常见。
工具辅助的代码评审——作者和评审人员使用软件工具,非正式的工具,如pastebins和IRC,或专门为同行代码审查设计的工具。
利用工具进行的静态代码分析
静态代码分析是对计算机软件的分析,它是在没有实际执行程序的情况下执行的(对执行程序执行的分析称为动态分析)。
该过程提供了对代码结构的理解,并有助于确保代码符合行业标准。
自动化工具可以帮助程序员和开发人员进行静态分析。
例如,CheckStyle, SpotBugs, PMD for Java
评审的目的
代码审查实际上有两个目的:
提高代码,提高程序员
动态代码分析/概要分析
动态分析:要执行程序并观察现象、收集数据、分析不足
程序需要经过充分的测试
利用测试度量技术(如覆盖率)确保
代码的可能功能均被充分测试到
用来测量程序的时空复杂度,特定指令或函数的调用频率或持续时间,发现代码中潜在问题
测试:发现程序是否有错误
软件测试是向涉众提供有关被测产品或服务质量的信息的调查。
测试技术包括执行程序或应用程序的过程,其目的是发现软件bug(错误或其他缺陷),并验证软件产品适合使用。
软件测试涉及软件组件或系统组件的执行,以评估一个或多个相关属性。
调试:定位错误、发现错误根源
调试是识别错误的根本原因并对其进行纠正的过程
调试往往是成功测试的后续环节
测试和调试不会提升软件质量,而是发现和解决缺陷的主要手段,软件质量应通过认真的分析需求、良好
的设计、高质量的编码来实现
调试是最后的手段
重构:在不改变功能的前提下优化代码
重构是这样一种改变软件系统的过程:它既不改变代码的外部行为,也不改进其内部结构。
为了获得长期的收益,需要付出短期的时间/工作成本,并且需要对系统的整体质量进行长期的投资。
重构是:
-重组(重新安排)代码…
-…在一系列小的、保持语义的转换中……
-…为了使代码更容易维护和修改
重构不只是旧的重构
-你需要保持代码工作
-你需要保持语义的小步骤
-你需要有单元测试,以证明代码工作
使用build的典型场景
用C、c++、Java和c#等传统编译语言编写的软件的编译。
用Perl和Python等解释语言编写的软件的打包和测试
基于web的应用程序的编译和打包。
单元测试的执行,以验证与代码其余部分隔离的软件的一小部分
执行静态分析工具以识别程序源代码中的错误。这个构建系统的输出是一个bug报告文档,而不是一个可执行程序
生成PDF或HTML文档。这种类型的构建系统使用各种不同格式的输入文件,但是生成人类可读的文档作为输出。
编译语言
编译后得到目标文件,
后续被链接入类库或者可执行程序中
最终得到可部署到目标机器的发布包
解释型语言
解释的源代码不会编译成目标代码,所以不需要对象树。源文件本身被收集到一个发布包中,准备安装到目标机器上
编译工具侧重于转换源文件并将它们存储在发布包中
编译成机器码不会在构建时执行,即使它可能在运行时执行。
基于web应用
编译代码、解释代码、配置或数据文件的混合
有些文件(如HTML文件)直接从源树复制到发布包,而其他文件(如Java源文件)则首先编译成目标代码。
静态HTML文件,只包含要在web浏览器中显示的标记数据。这些文件被直接复制到发布包中
包含由最终用户的web浏览器解释的代码的JavaScript文件。这些文件也被直接复制到发布包中。
JSP、ASP或PHP页面,包含HTML和程序代码的混合。这些文件是由web应用服务器编译和执行的,而不是由构建系统编译和执行的。这些文件也被复制到发布包中,准备安装到web服务器上。
将Java源文件编译成目标代码并打包为web应用程序的一部分。构建系统在打包Java类文件之前执行此转换。Java类在web应用程序服务器上甚至在web浏览器中执行(使用Java applet)
构建系统的组件
版本控制工具
源代码树:程序的源代码存储为许多磁盘文件。这种将文件排列成不同文件的方式称为源树。源代码树的结构通常反映软件的体系结构
对象树:一个单独的树层次结构,用于存储由构建过程构造的任何目标文件或可执行程序
汇编工具:将人类可读的源文件转换成机器可执行程序文件的程序
–编译器:源文件到目标文件
–链接器:多个相关的目标文件到可执行程序的形象
–基于uml的代码生成器:模型到源代码文件
–文档生成器:草稿到文件
构建工具:在编译工具之上运行的程序。它必须有足够的知识的源文件和目标文件之间的关系,它可以编排整个构建过程。构建工具调用必要的编译工具来生成最终的构建输出。
构建机器:编译和构建工具在其上执行的机器。
–原生编译:目标机器与构建机器同类
– 跨平台编译:软件的构造和运行,分别在不同操作系统或不同CPU的两类计算机上进行
释放包装和目标机器:生成可安装在用户机器上
的软件
包装类型:
-档案文件:压缩和解压缩
-包管理工具:unix风格的。rpm和。deb
-定制的GUI安装工具:windows风格
构建过程:构建工具调用每个编译工具来完成工作,这是一个端到端事件序列。
构建语言(构建描述)
构建工具需要以基于文本的格式编写构建描述。
-它遵循特定构建语言的语法规则。
例如,在使用Make时,以规则的形式指定文件间依赖信息,这些规则存储在名为Makefile的文件中。
可以手动编写描述,也可以通过IDE生成描述。
如何使用构建系统
开发人员(或私有)构建:开发人员已经从VCS检出了源代码,并且正在私有工作区中构建软件。
发布版本:提供一个完整的软件包供测试组验证。当测试人员确信软件具有足够高的质量时,客户也可以使用相同的包。
理智构建:构建过程决定当前的错误和源代码是免费的(可通过一组基本的理智测试用性测试)。这种类型的构建每天会发生很多次,而且往往是完全自动化的。
–每日构建
–持续集成(CI)
持续集成(CI)
构建工具
对于Java:
– Make
– Ant
– Maven
– Gradle
– Eclipse IDE
Build工具 + 相应的build script (类似于编程语言,告诉工具具体如何一步一步的build)
使用Make和makefile来构建Java项目
命令:
# make new //生成子目录(src, bin, res)
# make build //编译并生成bin中的java类
# make clean //清除编译结果
# make rebuild //清除编译结果并重新编译(清洁+构建)
# make run //检查执行结果
# make jar //生成可执行的jar文件
将构建系统中的每个任务封装成高级task形式
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和JSP编译
▪自动生成API文档,使用Javadoc工具
▪直接使用版本控制工具,如CVS、Perforce和ClearCase
▪构建生命周期的特点,如更新构建版本号,发送电子邮件消息,播放声音,以表明构建过程的完成
Apache Maven是一个软件项目管理和理解工具。
IDE集成:Eclipse IDE - M2Eclipse
Maven的主要目标是让开发人员能够在最短的时间内理解开发工作的完整状态。
-简化构建过程
-提供统一的构建系统
-提供优质项目资讯
-提供最佳实务发展指引
-允许透明地迁移到新功能
Maven的运行方式
▪一般情况下,在命令行执行maven指令 (clean, compile, test, package, install, deploy, …)。 ▪ 在
Eclipse中可以以plugin的形式加入maven支持,
直接创建符合Maven标准的project,并加以build;
validate:确认项目是正确的,所有必要的信息都是可用的
compile:编译项目的源代码
test:使用单元测试框架测试编译后的源代码。这些测试不应该要求对代码进行打包或部署
package:将编译后的代码打包成可分发的格式,例如JAR
verify:对集成测试的结果进行任何检查,以确保满足质量标准
install:将包安装到本地存储库中,作为本地其他项目中的依赖项使用
deploy:在构建环境中完成后,将最终的包复制到远程存储库,以便与其他开发人员和项目共享
以可视化的方式build
Eclipse IDE为代码编辑、编译、版本控制、测试和任务跟踪提供了一套完整的开发工具。
Eclipse中的构建功能只是更广泛的工具集的一部分,编译是在幕后进行的,您甚至不知道它正在进行,Eclipse GUI使构建工作无缝地结合在一起。
您没有编写构建描述文件(例如makefile): Eclipse已经足够了解软件的结构。
依赖GUI提供构建功能使构建构建系统变得容易,但也限制了可用特性的集合
软件建设的一般流程:设计,编程/重构,调试,测试,构建,发布
-编程/重构
-审查和静态代码分析
-调试(转储和日志记录)和测试
-动态代码分析/概要分析
狭义的软件构建过程(Build):验证,编译,链接,测试,打包,安装,展开
构建系统:组件和流程
-构建变体和构建语言
-构建工具:Make、Ant、Maven、Gradle、Eclipse