You are on page 1of 49

软件工程工具介绍

2011 年秋季学期
基本工程工具
 基本开发工具包 (SDK), 即编译和连接工具 ,
相应的支持文件 , 库等等
 编辑器
 调试工具
 构建 (Build) 工具
 版本和源代码管理工具
 测试工具
 集成开发环境 (IDE)
SDK

 大家应该很熟悉了 , 编程绝对离不开它 .
 不同编程语言 , 当然也不一样
 同一编程语言 , 不同操作平台也不相同
 不同厂家提供的产品也不相同
 我们只介绍免费的或自由软件
纯粹 C 语言

 lcc
- lcc 强大的免费的 Windows 下 C 语言的开发
包 , 由 Virginia 大学计算机系开发 , 包含所有
文档和一个集成开发环境
- 非常小 , 所有安装文件总共只有不到 6M, 但
是非常齐全 , 文档资料极为详尽 , 在 Windows
下学习 C 语言编程的极好工具和资料
- 广泛用于教学 , 也有不少商业应用
C/C++
 绝大部分多数 SDK 同时包含 C/C++.
 GCC
- GNU 的自由软件编译器 , 功能强大 , 文档资料详尽 , 几乎涵盖
了所有硬件和软件操作平台 ,Linux/Unix 的标准配置系统编译器
 BCC
- Borland 公司的命令行编译器 , 可免费下载 ( 其 IDE 不免费 ),
同时还需下载相关文档资料 , 运行于 Windows 系统 , 大约十几
兆大小
 Microsoft .NET SDK
- 微软公司的命令行工具 , 除 C/C++ 外 , 还可用于 C#, 可从其网
站免费下载 ( 其 IDE 不免费 ), 大约 100M. 当然了 , 只能用于微
软的 Windows 系统
JAVA

 由 Sun 公司发明
 几乎所有东西都免费 , 而且开放源代码
 直接到 http://java.sun.com 下载
 IBM 也提供自己的 JDK
编辑器
 简单文本编辑器并不适合编程
 Vi 和 Vim ( 自由软件 )
- Unix/Linux 下传统的文本器 , 功能强大 , Vim 改进后
增加了许多支持编程 ( 支持超过 100 种语言的语法 )
的功能 , 并且移植到了包括 Windows 的多种平台之上 .
 EMACS ( 自由软件 )
- 功能极为强大的编辑器 , 集成许多功能 , 用户可以自
己定制和扩展 , 为众多程序员所采用
构建工具

 自动管理许多文件之间的依赖关系 , 当某一个
文件修改时 , 找出受影响的其他文件并重新构

 Make 及其变体 nmake, gmake
- makefile
 Ant 构建工具
- build.xml
Makefile 的例子
CC=cl
RC=rc
LINK=link
.c.obj:
$(CC) -c $<
.rc.res:
$(RC) $<
simpledit.exe: simpledit.obj simpledit.res
$(LINK) simpledit.obj simpledit.res user32.lib
build.xml 的例子
<project name="MyProject" default="dist" basedir=".">
<description>
simple example build file
</description>
<!-- set global properties for this build -->
<property name="src" location="src"/>
<property name="build" location="build"/>
<property name="dist" location="dist"/>

<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build}"/>
</target>

<target name="compile" depends="init"


description="compile the source " >
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}"/>
</target>

<target name="dist" depends="compile"


description="generate the distribution" >
<!-- Create the distribution directory -->
<mkdir dir="${dist}/lib"/>

<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->


<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
</target>

<target name="clean"
description="clean up" >
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
版本和源代码管理工具

 版本与发行
 为什么要管理版本
 版本的一些基本概念和常识
源代码管理工具

 动机
- 为什么需要工具来管理 ?
- 简单的文件管理和备份不行吗 ???
- 答案是 , 也许可以 , 如果你永不出错 , 并且
开发人员只有一个 .
- 请看以下的场景 :
场景一

 当某个开发人员发现自己辛辛苦苦写出来的代
码保存好之后重新打开时确已面目全非 , 原来
另一个开发人员也在修改同一个文件 , 并且比
他晚几十分钟保存的 , 结果就……
场景二

 用户报告产品的错误 , 请求修复。 用户所用


的是我们一年前发行的版本 , 现在我们已推出
了全新的版本 . 遗憾的是在用户的硬件上无法
运行我们的新版本 , 所以只能在老版本上来修
改错误。 这时候才发现 , 已经搞不清楚当年
发行给用户的老版本的源程序到底是哪个了…

场景三
 经过多少个不眠之夜的反复修改 , 程序总算调试通可
以运行了,我的第一版终于出来了。这时我更有信心
了,我希望做得更好,在交作业的时候能够拿出第二
版,于是继续努力。在我的改进代码的同时,时间在
不知不觉中过去,转眼到了交作业的时候。试试我的
新版本,调试不通?重新编译,啊,编译不过!改了
半天,还是不行,已经没有时间了。实在不行,改回
原来的第一版试试,怎么又不行了呢???
学生的哀叹……

 曾经有一段编译调试好的代码在我面前,而我
因为想改的更好却没有保存;改来改去等到要
交作业的时候才发现,已经改得怎么也调试不
通了,这时我才追悔莫及。大学期间最痛苦的
事情莫过于此,只有在失去代码的时候才懂得
珍惜。如果这一切导致我获得一次重修的机会
的话,我要说……
版本管理概念 - 代码仓
 数据(代码)的存储 – 数据(代码)仓
 不是简单的文件服务器
 必须记录对每一个文件的每一次改动
 通常呈现给用户的是最新版本,但是必须记录所有历
史信息。“上周三的时候,某个文件是什么样的?”,
“谁最后一次对某个文件进行的修改,改动了什
么?”
 区分几个概念:数据仓 (data repository), 数据库 (dat
abase), 数据仓库 (data warehouse)
版本管理概念 - 提交
 工作副本( Working Copy ) 与 提交( Commit)
 通常用户不能直接修改版本仓内的内容,将需要的内
容拷贝出来,并在其上工作,称为 Working Copy
 用户的工作(修改文件等)只有提交( commit) 到版
本仓之后 ( 并且被接受),才纳入版本管理。版本仓
中保存有每次提交的版本。
 用户尚未提交的工作需要自己负责,不受版本管理系
统的保护。丢失不赔!
版本管理概念 - 版本模型

 必须实现信息共享,又要避免互相冲突
 如果两个人同时修改同一个文件,第一个人先
完成并保存到数据仓,然后第二个人完成并保
存自己的新版本到数据仓。
 会发生怎样的情况?第一个人的修改被覆盖了
(不一定完全丢失),最新版本只有第二个人
的修改。
 这种情况必须避免
加锁 - 修改 - 解锁

 在同一时刻仅允许一个人修改
 每个用户在修改前必须首先对其加锁,这样其
他人就无法修改,数据仓会拒绝其他人的加锁
请求
 该用户完成修改后,存入数据仓,然后解锁,
这样别人就可以使用了。
 防止了上面的问题,但是……
复制 - 修改 - 合并

 每个用户从数据仓获取一份拷贝,在自己的拷
贝上进行修改;
 当用户将自己的修改保存到数据仓时,改用户
所做修改和其他用户的修改合并,生成新的版

 冲突解决:两个用户修改同一个文件的同一部
分时
自由软件的版本管理系统

 元老 CVS (Concurrent Version System)


 接班人 SVN (SubVersioN)
 新贵 GIT
CVS 简介
 Concurrent Version System( 并发版本系统)的简写
 自由软件的版本控制系统
 最早起源于 1986 年 Dick Grune 的一些脚本, 1989
年 Brian Berliner 写出了 CVS 代码, Jeff Polk 后来
增加了功能
 广为流传和使用,许多商业软件和自由软件都采用 C
VS 进行版本管理
 http://www.cvshome.org/
CVS

 CVS 可以记录源代码变动的历史
 CVS 可以帮助一组开发人员集体开发,避免
互相覆盖对方的工作
 每个开发人员独立修改, CVS 将这些修改合

CVS 不是(或不能)

 不是构建系统
 不能取代管理
 不能取代开发人员之间的沟通
 不处理变动控制(可以和此类工具集成)
 不是自动测试软件
 不提供内置的过程模型
使用 CVS

 获取 CVS 工具,从 http://www.cvshome.org


下载
 指定 CVS 数据仓 (repository)
 了解 CVS 命令
 有关概念 (revision 和 release)
 环境变量 CVSROOT, CVS_SERVER, CVS_
RSH
CVS 数据仓

 数据仓 (repository) 就是 CVS 存放数据 ( 即源


代码 ) 的地方
 分析一下我们的数据仓:
 [:method:][[user][:password]@]hostname[:[po
rt]]/path/to/repository
建立 CVS 服务器端

 安装 CVS 服务器程序 ( 只有 Windows 才需要


这一步 )
 启动 CVS 服务 ( 只有 pserver 才需要)
 选定某个目录作为代码仓,并进行初始化
 现在就可以用了,别忘了拆除防火墙或者开放
相应端口( CVS pserver 默认为 TCP 2401)
 创建新用户
启动配置 CVS 服务端
 Unix/Linux:
- 给文件 /etc/inetd.conf 增加一行 :
2401 stream tcp nowait root /usr/local/bin/cvs cvs -f --allow-root=/usr/cvsroot pserver
- 或者创建文件 /etc/xinetd.d/cvspserver
service cvspserver
{
port = 2401
socket_type = stream
protocol = tcp
wait = no
user = root
passenv = PATH
server = /usr/local/bin/cvs
server_args = -f --allow-root=/usr/cvsroot pserver
}
准备数据仓

 Windows 遵照安装过程指导
 创建作为数据仓的目录(如果还未做)
 执行命令建立 CVS 仓观察结果
cvs –d /path/to/repos init
 创建文件 CVSROOT/passwd 增加新用户
CVS 常见命令

 login logout
 import export
 checkout
 update
 commit
 add remove
CVS 更多

 参见其官方文档
 大多数集成开发环境内置 CVS 支持,只需设
置数据仓,使用菜单而不必敲入命令
CVS 的不足

 以文件为中心的管理
SVN 简介
 随着时间的推演, CVS 以文件为中心的版本管理暴
露出越来越多的问题
 2000 年初, CollabNet, Inc 寻求开发人员开发一个取
代 CVS 的版本管理系统
 他们找到了 Open Source Development with CVS 一
书的作者 Karl Fogel ,此前 Fogel 已经和他的朋友 Ji
m Blandy 讨论新的取代 CVS 的版本控制系统,并命
名为 subversion, 他们欣然答应
 在一些其他人员的帮助下, 2001 正式推出了 subvers
ion 。
 http://subversion.tigris.org/
SVN 的特点

 拥有大多数 CVS 的特性


 对目录也进行版本管理
 真正的原子式提交
 可选的网络层
 一致的数据处理
 高效的分支和标记
 本地化的输出信息
SVN 数据仓
 数据仓用 URL 定位:
 file:/// direct repository access (on local disk)
 http:// access via WebDAV protocol to Subversion-
aware Apache server
 https:// same as http://, but with SSL encryption.
 svn:// access via custom protocol to an svnserve
server
 svn+ssh:// same as svn://, but through an SSH tunn
el.
SVN

 全局修订号,而不是针对每个文件的,这不同
于 CVS
 数据仓以 URL 表示,通用性强
 对目录和元数据也记录版本信息
GIT 起源
 Linux 内核早期大多数时间( 1991-2001 )
的版本维护通过补丁( patch) 和文件( archi
ved files) 传递
 从 2002 年开始使用了一家商业公司的封闭的
私有版本管理系统 BitKeeper
 2005 年两家闹崩了,不能免费使用了
 这刺激了 Linux 开发者(特别是 Linus) 要开
发自己的工具
GIT 简单历史
 说干就干, 2005 年 4 月 3 日, Linus 亲自上阵,开始
写为 Linux 内核使用的版本控制系统,命名为 git
 2005 年 4 月 6 日项目发布
 2005 年 4 月 7 日投入第 1 次使用,给自己做版本管理
 2005 年 4 月 18 日第 1 次合并多个分支
 2005 年 4 月 29 日进行基准测试, GIT 全面胜出
 2005 年 6 月 16 日 Linux 内核 2.6.12 改用 git 做版本
管理
 2005 年 7 月 26 日 GIT 项目移交 Junio Hamano 负责
 2005 年 12 月 21 日 git 1.0 版发布
GIT 的设计标准 (Linus)

 不要 CVS
 支持分布式的工作流
 超强防护性(无意或者恶意破坏)
 超高性能
GIT 特征
 强力支持并行开发
 分布式开发
 对现有系统 / 协议的兼容性
 高效率处理大项目
 加密验证项目历史
 基于工具箱的设计
 可插拔的合并策略
 垃圾收集
 周期性打包
GIT 概念
 版本仓 (repository) --- 包含了一系列版本( commit),
以及针对特定版本的引用 (head)--- 存放在根目录的 .
svn 子目录下
 版本( commit) --- 一族文件集合,对父版本的引用,
一个 SHA1 名字 (40 字符的串)
 头( head) --- 对版本的引用,有一个名字。每个版
本仓有一个默认的头,叫做 master
 这刺激了 Linux 开发者(特别是 Linus) 要开发自己
的工具
GIT 概念 -- 引用一个 commit

 SHA1 名字或者前几个字符
 通过 head 名字
 相对引用,后缀 ^ 代表父版本
GIT 概念 --- 合作

 使用其它的仓: git clone


 获取远程仓的更新: git fetch
 合并远程仓的更新: git pull
 推送自己的更新到远程: git push
GIT – 其它

 功能强大,这里仅仅介绍概念
 更多命令、更多用法需要自己动手实践
CVS 和 SVN / GIT 的选择

 SVN 的设计是为了取代 CVS ,其克服了 C


VS 的缺陷,也保留其优点,并且高度兼容。
GIT 则完全背离 CVS ,另起炉灶
 SVN / GIT 代表未来的方向(事实上许多 cvs
项目已经转到 SVN/GIT 上了),而 CVS 则代
表过去和现在。
 如果你没有历史负担,直接进入 SVN , GIT
可能是更好的选择
集成开发环境 (IDE)

 将所有工具集成到一起,方便易用,提高开发
效率
 Eclipse – 功能强大的自由软件 IDE, 可使用插
件来扩展,受到许多公司包括 IBM 等的支持,
官方网站:
http://www.eclipse.org
Eclipse 的特点

 基于 Java 的自由软件,因而跨平台
 很好的支持重构
 支持代码自动生成
 支持从代码生成设计
 支持插件,通过插件扩展功能
 可以直接在其上开发
 很好的和其他工具集成
其他工具

 产品缺陷跟踪工具 Bugzilla, 我们已经讲过


了,还记得吗?
 自动化的单元测试工具,大家学的如何了?
 集成测试……

 我们以后还会讲到的,比如 UML

You might also like