集成软件开发环境WipeOut

“Linux 公报...让 Linux 更富魅力!”
---------------------------------------------------------------------------
-----
集成软件开发环境WipeOut
作者 Gerd Mueller 译者 sams
---------------------------------------------------------------------------
-----
在Linux下编程你可以选择不同的强力开发工具, 像gcc, gdb, make和 更多. 但是他们
大多数是命令行工具, 尤其对于初学者不容易掌握.但 这仅是一方面.另一个重点是源
代码编辑器.多数人中意vi(或者它的同 类) -我倒无所谓.但是有了好的编辑器,编译器
和调试器并不够. 尤其 当你开发更大的软件项目你需要对它们高效组织的工具,应有的
版本控 制和面向对象语言所必需的类浏览器.现在你可以将它们一网打尽. 我 发现有
两条解决途径: (X)Emacs和集成开发环境.
你能够用Emacs解决将近所有的问题( 也许不久的将来它会为你煮 咖啡;) ). 它不仅是
一编辑器:你能够用它作邮件工具,新闻阅读器,文 件系统浏览器,调试器,编译器和mak
e工具.如果没有特殊需求你完全可 以扩展Emacs以适合你的需要.但是在我看来Emacs并
不是很容易和直接 的作所有的这些事.所以我宁愿选择上面提到的第二种方法.
从我的理解看集成开发环境把不同的工具集合在相同的环境下并给 出图形界面.此工具
应帮助我组织我的项目及支持code-compile-debug 循环. 其他高级特性包括GUI生成器
,文档工具以及类似CASE工具的行 为。
在Linux上你可以选择各种不同的IDE.他们有的更强大,有的更便 宜.我这里为你介绍
的是WipeOut.
历史
在开始人们仅仅是想给所有C++程序员的主要开发工具--gcc,gdb, make--生成一个方便
易用的前端工具. 我们决定使用 Julian Smart的 wxWindows [1]进行GUI编程. 第一版
的WipeOut是用wxWindows的 PenLook_variant开发的. 之后由于大多数人都不喜欢Ope
nLook我们改 用了Marcus Holzem的wxXt.我们为基本数据结构(容器类,字符串,及其 他
)开发了dmpack [2]. 这个库也包含了像流对象和远程方法调用这样 的特性,它们对各
个WipeOut元件间通讯至关重要.dmpack的通讯部分是 基于Gnanasekaran Swaminathan
的能为套接字和管道提供面向对象界 面的socket++库.
WipeOut的组件和特性
现在WipeOut对C++,Java,Eiffel,Fortran和C项目( 之后会支持更多语 言)来说是一个
完整的联合作业开发环境.目前包括下列各项组件:
项目浏览器 -WipeOut主窗口
版本浏览器 -基于CVS的版本控制,支持远程容器和联合作业
e3-编辑器 -中心文字编辑器,具有复杂语法醒目性
类浏览器 -支持Java和C++, 用来作为源代码领航器和交叉引用
试器 -一 作为gdb/jdb前端,支持线程
Make-Shell -一 作为make前端,自动产生 makefile
符号提取器-一对在大量文件中查找符号的grep替换
冲浪板 -我们显示help和man页面的 HTML浏览器
WipeOut并非一个快速开发工具.这是因为它不是纯的爪哇或者C++ 开发工具. 编辑器,
项目管理和make外壳在其他语言开发时工作得也不 错.此外决定一个对C++部分所必须
的GUI工具箱相当困难. 因此我们尝 试提供程序员们命令行工具的直观前端以及一些对
编程有帮助的附加 组件。
WipeOut对于不同的平台可用: Linux/i486, Linux/m68k, Linux/Alpha, Solaris, HP
-UX.所有这些版本是完全兼容的,因此你能 够使用WipeOut于多平台开发. 此外也在向
LinuxPPC和Irix移植.
当前我们提供WipeOut的两个版本:
自由标准版:此版本对于非商业用途是自由的,但是有限制:没有 版本控制和一项目只能
包含一模块.其他所有组件有全部功能. WipeOutPro版:此版本无限制.商业用户收费$1
49私人用户$79
安装
安装并不困难.运行WipeOut你需要下列包:
WipeOut-<VERSION>.tar.gz :包含WipeOut本身
wxxt-share.tar.gz :这是GUI库
wipeout-doc-<VERSION>.tar.gz :WipeOut文档
wipeout-tut-<VERSION>.tar.gz :WipeOut教程
你能够从 [4]获得包.然后进行下列各步:
创建一新的目录,在此你将安装WipeOut
复制包到此目录,用'tar xvzf <包>'展开
键入 './setup'运行设置程序.跟随程序的指示.完成后将要创建
两个shell-scripts:如果你使用bash必须用'source'命令将'wipeout.sh' 包含进你的
'.bashrc'或'.bash_profile',如果用csh则须将'wipeout.csh' 包含进'.cshrc'.
在用修改过的rc文件启动新shell后,简单的键入'wipeout'就可以 运行WipeOut了。
第一步
开始WipeOut时你将看见左边是项目浏览器, 右边是(清空的)编 辑器.项目浏览器是Wi
peOut的核心.这里可以打开项目和开始别的组件.
我们做的第一件事是创建一新的项目.因此我们选择菜单 '项目->新的根模块'.我们必
须输入CVS容器的目录 (见下文)和我们 的新项目的目录.在确认之后WiepOut要求加入
'Makefile'和 '<arch>.def' 文件,选择确定.这文件意味着什么我们将在以后讨论. 现
在WipeOut 在容器中创立一新的模块并初始化项目目录.
在创立新的项目之后我们现在可以使用所有别的组件.首先我们 将要看看版本浏览器.

版本浏览器 -部分1

版本浏览器管理你的项目的模块和文件.一模块表示一目录并把 文件逻辑地组织起来.
模块能够包含子模块以使你能够建立模块阶层 来表示你的项目.
版本浏览器在一个叫浏览框的图形元件中显示此阶层. 这是从 NextStep系统中学来的
显示阶层的好方法. 各列表框显示阶层的每 一级.最上的阶层显示在最左的列表框.如
果你选择一项则右边的列 表框包含其子阶层. 使用框左右的箭头按钮你能够滚动阶层
图.
属于一模块的文件显示在右边的列表框.如果你双击某项则相关 文件将显示于编辑器.
确切的说:文件将按其类别由相应程序打开 (见下文).
每一模块有各种特性.如果你选择一模块并对于文件或者模块选择 编辑->信息将弹出对
话框,在此能够修改 模块特性.它有下列各表项:
类别:模块中的文件是划分成类别的. 可按后缀自动分配,也可明确地手工分配.一文件
能够是多类 的成员.类别主要有两种含义: 首先,每个类别表述了一个makefile符号.
类别的所有文件都 包含在此符号中.用这种方法make知道如何处理一文件. 一实例是
默认类别'CPP_source'.它包含模块中带有'*.C', '*.cc'和 '*.cpp' 扩展名的所有文
件. 也就是说他们是C++源代码文件. 如果你开始 make一模块,所有此类别的文件将用
c++编译(使用默认C++-编辑器). 其次你能赋予一个或多个程序给一个类别.其中一个是
默认程 序(一般是WipeOut编辑器e3).如果你在文件列表中双击一文件,此 文件将用默
认程序打开.右击一文件你将得到一小的弹出菜单指明 所有通过类别指派的程序.选择
其一则文件将用此程序打开. 目录:除了主目录你能够指派别的目录到一模块. 这些目
录 有下列中一或更多的含义: 源 :调试器寻找源代码的目录
头文件 :附加头文件的目录
库 :编译器搜索库的目录
make :当make一模块时,WipeOut在此进行递归make
浏览 :类浏览器解析类的目录
模块主目录的缺省特性是 '源'和 '浏览'.
选项:在这里你能够设置一些附加的 makefile选项.如果你 单击一按钮编辑器将显示'
<arch>.def'文件的相关行.你能够设置 你的编译器,编译器标记,包含文件和库路径,和
希望链接到你的程 序的库. 工具:在这里你能够设置不同的工具性质.目前只有 make-
command特性:可以输入完成你的项目的make命令. 默认当然 是make但你可以改成 gma
ke或者pmake.
---------------------------------------------------------------------------
-----
WipeOut的所见即所得
有一点WipeOut不同于多数别的程序:大多数设置将立刻执行, 不需要显式地保存-真正
的所见即所得.仅仅是在一些模态对话框中 有OK和Cancel按钮,由此你可以选择确认或
者取消.而且你不需要保 存你对某模块特性的改变。例如,如果你增加了一个目录或类
别, 并不需要存盘和关闭对话框,他们对其他组件即可见了。我们认为 这样更快且直
观。
---------------------------------------------------------------------------
-----
游戏目标
现在我们知道了一些关于模块和分类.现在应该练习产生代码了. 在我们的实例中我们
将要建立一小的字符串类,当然,包括义不容辞 的 'Hello World'程序.
创造模块的源代码我们有三种可能:
旧而好的方式-打开新文件,键入所有代码
将存在的文件加入模块
用类浏览器创建类和方法的头.
我们选择最后一种,以使我们能够更近的看看类浏览器.单击项目浏览 器的第三个按钮
来打开类浏览器
类浏览器
类浏览器是基于一个渐增源代码语法分析器.也就是说你的代码能 够是不完全的或者错
误的,但是类浏览器将尽可能好的分析其类,方法, 和成员。类浏览器解析你标记为'浏
览'(见上文)的项目目录.当首次建 立起内部数据库后,只有改变的或依赖于改变的文件
以及新文件需要解 析。当且仅当你改变了类或方法的声明时,你需要显式地告诉类浏览
器 更新类阶层(通过Hierarchy->Update或相关工具条按钮)。
除去著名的浏览框(这里用来观看类阶层),类浏览器还有另外的 WipeOut标准图形元件
-仪表板panelbox。
开发仪表板是必须的,因为一次又一次太多的非模态对话框显示重 要的信息.这样不利
于观察. 仪表板有清楚的结构,能够在不影响概貌 的情况下快速获得各种信息.仪表板
由子仪表组成. 你可以用顶上的小 按钮指定仪表的数目和类型.
类浏览器有五种不同的子仪表板:
方法 :显示当前类的方法
成员 :显示当前类的成员
热点列表Hotlist :显示 hotlist (见下文)
所有类 :显示阶层图的所有类
所有方法 :显示阶层图的所有方法
hotlist是常用类,方法和成员的集合,使你能快速访问到他们. 用 菜单项热点->加热点
(Hotspots->Add Hotspot)你能够加入当前类, 方 法或者成员.双击热点将在编辑器中
打开相应文件. 其他列表框也是如 此.此外你可以通过键盘控制列表框: 光标键,'Hom
e','End','PageUp' 和 'PageDown',以及数字键.如果你按一字母列表框光标将跳到以
此字 母开始的第一项。
现在我们希望建立我们的String类:选择Edit->New Class.... 输入类名称并在新文件
中按Insert键.WipeOut将问我们几个问题,只需 全部按OK确认.编辑器现在显示我们的
String类的新头文件.
下一个步骤是增加一些方法.选择Edit->New Method ...对话框. 象在C++/Java中一样
简单地输入方法的声明,当WipeOut要求将编辑器 光标移到正确位置时,照做即可.在
写好一些实现代码后你的源文件看 起来如下:
Listing 1
// $Id$
// some comments ...
#ifndef _String_h
#define _String_h
class String {
protected:
char* _data;
public:
String(char *);
virtual String();
virtual String& operator= (char *);
virtual char* data() const;
};
#endif
Listing 2
// $Id$
// some comments ...
#include
#include
#include "String.h"
String::String (char *data) {
_data = new char[strlen(data)+1];
strcpy (_data, data);
}
String::String() {
delete _data;
}
char* String::data() const {
return _data;
}
String& String::operator= (char* data) {
delete _data;
_data = new char[strlen(data)+1];
strcpy (_data, data);
return *this;
}
main() {
String str ("Hello ...");
cout << str.data() << endl;
}
由于是用类浏览器产生的类,我们不需要显式更新类阶层.此外类 浏览器自动在版本浏
览器中将文件 'String.h'和 'String.cc' 加到模块中.
版本浏览器 -部分2
继续讨论之前我们先为不熟悉版本控制的读者重温一下.容器(在 创立新项目时设置它
的目录)是版本控制的中心数据库.所有的开发者 从这里得到实际的源代码版本.各开发
者拥有本地复制的此版本 (或者 其选择的版本)并能够编辑.
如果开发者作出提交则文件的本地复制将进入容器.现在所有别的 开发者可以获得此新
版本文件.他们必须更新他们的本地复制.如果一 开发者改变了一文件但是还未提交他
们并更新此文件, CVS将合并本地 复制和实际版本的容器.开发者将不会丢失他的改变
. 在更新之后本地 复制将包含冲突.这意味着开发者的改变和容器的改变相抵触了。在
再 次提交之前,开发者必须解决冲突(在e3的支持下)。
如果看看版本浏览器的文件清单,你将看见四个文件: 'Makefile', '<arch>.def, 'St
ring.h'和'String.cc'.所有这些项目都以一个'[n]' 开始和空括弧结束.括号里面的符
号有以下含义:
+ :那文件是最新的
< :你需要'提交'文件
> :你需要'更新'文件
x :可能和别的开发者有冲突
X :文件内部有冲突
n :文件是本地增加的
- :文件是本地删除
? :状态信息不可用
除了冲突标志外其他符号对于模块有相同的意义.
文件名之后的括弧包含本地复制的版本.如果我们选择模块并用 Revision->Commit Fi
le(Module),则文件的版本号变成 '1.1'而状态改 变到 '+'.
尤其在集体开发时文件或者模块的状态会随时改变.有三种方法保持 版本浏览器最新
(项目->模块性质):
对于条项:每次你单击一文件或者模块时状态更新
对于工具:每次你选择工具栏的第一个按钮时状态更新
计时器时间间隔:每x秒状态更新
注意每次状态更新导致一CVS命令.如果你使用远程容器工作但连接的 可靠性差,推荐选
择第二种方法.
WipeOut有许多用于版本控制和团队工作的特性,例如你能够创造文件 和模块的版本分
支,你能够合并这些分支重新和你能够赋与版本的象征性名 字(标签).你有各种方法引
进存在的项目(使用或者不使用 CVS).所有这些在 WipeOut文档中都有说明,只要有点
耐心是很容易找到的.
在编译我们的小项目之前我们来看看编辑器.
编辑器
编辑器是WipeOut的中心组件.你使用它编辑源代码,每当另外的组件 必需显示一文件
或者知道源代码位置时也使用编辑器.这是WipeOut的一个基 本概念:唯一的中心编辑器
.
这导致了编辑器高度集成到开发环境中。所以在WipeOut中不能使用其他 编辑器.这好
像是一大不利因素,因为大部分开发者有他们自己喜欢的编辑器 ,不容易转换到使用
其它编辑器。但是如此可以集成类似符号完成这样的特 征:如果在编辑器中你按 'Ctr
l-.'将会尝试将正在写的字自动完成.为此将使 用类浏览器数据库去查看匹配的类,方
法或者成员名称.
另外一个漂亮的特征是集成帮助显示器:如果在编辑器中选择一符号并按 'Ctrl-m'将显
示相关帮助(如果有的话) .不久的将来我们将要扩展信息页和 外部HTML文档.
句法醒目性
句法元素加亮增加了源代码的易读性.WipeOut编辑器使用规则表达式来 完成.其句法同
'grep'命令的相似. WipeOut的文档包含了对变换符的一般性 展示.这种加亮方式使编
辑器稍慢,但给予你创建自己的加亮风格的弹性.
一种样式是一组规则表达式,文件模板,颜色和字体.各样式在匹配文件模 板的文件中按
照指定的颜色和字体加亮规则表达式指定的特定句法元素.你能 够用Properties->Hig
hlighting创造和编辑样式.
编辑器对于 C++,Java, Objective-C,LaTeX和HTML有默认样式.你能够使 用这些样式,
也能够改变他们.
除了样式还有一些别的参数:不同的颜色,制表符,undo深度,字体大小,及 其他.最后,
编辑器是很容易使用的,因此应该没什么大问题.
Make-Shell
现在回到我们的小项目:创建文件,加入他们到模块,使用类浏览器和编辑器 ,是时候编
译程序了.
WipeOut用make编译项目.一般来说所有必须的文件将基于模块信息自动创 建.各模块有
关于makefile的三个不同的部分:
Makefile.inc: 包含不同的符号定义, 例如各分类生成包含分类中文件 的符号。make
file使用此符号决定对特定目标哪些文件需要编译. 此文件将由 WipeOut持续更新,你
不应手工编辑。 <arch>.def:包含平台依赖参数. '<arch>'将以OS名替代,如Linux.当
你 用WipeOut跨平台开发时此文件帮助你生成面向平台的特殊编译设置. Makefile:这
是 makefile本身了.包含 'Makefile.inc'和'<arch>.def'. 你可以编辑它.Make-Shel
l将使用此文件调用make。makefile包含默认规则编译 C,C++,Java和混合代码.它可以
生成 C/C++-和 Java目标程序及静态或共享库.为开始make我们使用项目浏览器的第五
按钮打开Make-Shell.此对话框仅有 少量元件:Start按钮开始make,文本框设置特定目
标(为空表示默认目标 - 'cplusplus')和两个复选框.一般地Make-Shell在make完成后
在下面的列表框显 示编译错误和警告.如果我们选择复选框 'All Lines', 在列表框中
将看到所有 make输出。如果我们选择进展窗口,当编译时一个小输出控制台将打开显示
make输出.
简单的按开始按钮则编译出我们的程序.结束后错误列表框给出关于虚拟构 造函数的警
告.我们单击警告,编辑器光标跳跃到错误行. 我们看到构造函数应 是析构函数,由此
我们在声明和实现中加上小波浪号.重新编译一切正常.
为测试我们的程序,我们打开项目浏览器shell,输入我们的模块名称,也 就是程序的
名称.程序输出:
Hello ...
下面我们稍微扩展一下我们的项目.为此我们增加两个 方法:
Listing 3
String& String::operator+= (const String& rhs) {
char* buf = new char[length()];
for (int i=0; i<length(); i++)
buf = data();
for (int i=0; i<rhs.length(); i++)
buf[length()+i] = rhs.data();
delete _data;
_data = buf;
return *this;
}
int String::length() const {
return strlen(data());
}
主函数修改如下:
Listing 4
main() {
String str ("Hello");
str += String (" from WipeOut.");
cout
在编译后运行程序的结果是'Segmentation fault',我们 不知道这是怎么产生的,因此
就用到了调试器。
调试器
按项目浏览器第四按钮运行调试器.界面组成和类浏览器相似: browserbox和panelbox
. panelbox 有五个子板:
Breakpoints 断点 :显示所有的断点
Stack 堆栈 :显示当前的执行堆栈
Sources 源 :显示所有程序相关源文件
Expression 表达式 :显示特定变量表达式
Threads 线程 :调试线程时用
我们按照需要整理panelbox:点击'plus'按钮,在缺省的'Breakpoints' 和'Stacks'面
板外增加'Sources'面板。
现在用Session->Load Executable装载程序.之后'Sources'面板将显 示所有程序相关
源文件.
browserbox用来显示变量值.第一个列表框按缺省显示所有局部变量.单 击某项则显示
它的值或组成。如此你能够轻松浏览类,结构和数组.每一动作 后调试器自动刷新变量
值。
如果你希望查看目前还不在browserbox中的变量,只需在编辑器中将其标 记并在调试器
的工具栏中选择Inspect Variable即可.现在browserbox的第一 个列表中已包含了此变
量。
一般来说调试器自动解析数据结构,以使你总是得到正确的值,例如它显示 指针的内容
而不是指针地址本身.但是有时这无法做到,例如如果你用'int**' 声明了一个整型指针
数组,为得到数组每一项你必须用 Inspect->Change/Cast Variable计算其类型.
用Inspect->Move Variable to Top可以将变量从一较低的级别移动到 顶端,这样你不
需要为得到变量值浏览全部阶层图.
因为我们不知道程序哪儿错了,首先选择Run->Run开始运行.这将再次导致 'Segmentat
ion fault', 但这回编辑器将错误行标成了红色. 我们发现 String::operator+=方法
有错误.
在改正错误前应用Run->Kill杀死程序.为了解方法哪里错了我们需要知道 data方法做
什么.我们使用类浏览器作为交叉参考来找到此方法的实现.因此我 们标记data并在类
浏览器中选择Edit->Search Symbol. 现在编辑器显示了 data方法的源代码.我们看见
,此方法没做别的,仅仅是返回_data指针.我们回 到String::operator+= 方法,仔细查
看,意识到我们没有为buf分配足够的内 存.因此修改首行如下:
char* buf = new char[length() + rsh.length()];
编译,运行,一切正常. 但是我们看不到输出. 我们用 Inspect->Program Console..
.解决,这样打开一小控制台。重新开始那程序 后,我们看见了输出:
Hello from WipeOut.
当然,调试器的特性比以上说的多得多。除了Next,Step和设断点外还支持线 程。再次
推荐阅读相关文档.
除了符号补偿器和帮助浏览器,现在你已经接触了所有组件,因此你对 WipeOut如何工
作已有了第一印象.当然我们用WipeOut开发了WipeOut,我们 发现这大大增加我们的生
产力,比单用一简单的文字编辑器编程方便得多. 最后讲讲关于扩展WipeOut.
编写自己的 WipeOut组件
目前 WipeOut仅仅包含我们认为最重要的元件。有很多其他可能,例如多 数人希望一
个GUI-builder.我们不能也不希望单独做所有的事。因此我们写了 WDK - WipeOut开发
工具箱,让你能开发你自己的组件. 此接口让你能访问到 WipeOut的重要函数, 象在编
辑器中显示文件或者加入文件到一模块.
如果你喜欢编写这样的组件你只需要从[4]下载WDK包. 除去文档此包还 包含 DmPack2
,socket++, wxXt头文件,一简单的实例组件和 SpellMaster -一 ispell的前端.
我希望你对WipeOut及其能力已有了一个总体概念.如果你有任何问题,建议 或者希望,
请告诉我们.
资源
[1] http://web.ukonline.co.uk/julian.smart/wxwin - wxWindows/wxXt by Julian
Smart and Marcus Holzem[2] ftp://ftp.virginia.edu - socket++ by Gnanasekar
an Swaminathan[3] http://www.softwarebuero.de/dmpack2-eng.html - DmPack2
[4] http://www.softwarebuero.de/wipeout-eng.html - WipeOut
---------------------------------------------------------------------------
-----
版权?1998, Gerd Mueller
于第30期Linux公报出版, 1998年7月
---------------------------------------------------------------------------
-----

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章