集成軟件開發環境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月
---------------------------------------------------------------------------
-----

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