Eric E. Allen (Mailto:eallen@cs.rice.edu >eallen@cs.rice.edu)Ph..."/>
您好,登錄后才能下訂單哦!
Java/j-djc06173/#author1">Eric E. Allen (Mailto:eallen@cs.rice.edu">eallen@cs.rice.edu)
Ph.D. candidate, Java編程語言小組,Rice大學(xué)
2003 年 8 月
在診斷Java代碼 系列最后一部分,Eric Allen 討論軟件開發(fā)的當(dāng)前動(dòng)態(tài)并展望未來數(shù)年內(nèi)的發(fā)展趨勢。
尊敬的讀者:我非常遺憾的通知您這將是診斷Java代碼系列的最后一部分。我已經(jīng)(最后)完成了我的博士學(xué)位工作,將前往行業(yè)實(shí)驗(yàn)室?guī)椭_始新的編程語言調(diào)研項(xiàng)目。
在這最后一篇文章中,讓我們來看看我們的水晶球。我們將討論一些軟件行業(yè)的流行動(dòng)態(tài),以及預(yù)計(jì)它們對(duì)軟件開發(fā)的未來產(chǎn)生的影響。我們將重點(diǎn)討論在過去兩年半內(nèi),我們?cè)谶@一系列文章中使用的有效軟件開發(fā)。與往常一樣,我們將特別關(guān)注有效錯(cuò)誤預(yù)防和診斷在使我們實(shí)現(xiàn)在日益復(fù)雜的數(shù)據(jù)領(lǐng)域中自由翱翔扮演的關(guān)鍵角色。
當(dāng)調(diào)查行業(yè)整體發(fā)展方向時(shí)有三種流行動(dòng)態(tài)需要考慮。它們是:
總之,這些動(dòng)態(tài)正在重新塑造軟件和軟件開發(fā)過程中涉及的軟件工程的基本特性。從高處看,軟件開銷及其普遍性正在把我們引向更廣泛和更普遍的抽象概念,如強(qiáng)大的虛擬機(jī)器,具有精心定義的語義和安全特性,從而使我們能夠在更多的平臺(tái)上更輕松地開發(fā)和維系軟件。
同時(shí), 計(jì)算性能的不斷完善使我們能夠構(gòu)建這些抽象概念,不會(huì)蒙受無法接受的性能下降。 我非常愿意嘗試一些我認(rèn)為我們可以構(gòu)建新抽象概念的方法,它們將有助于創(chuàng)建下一代軟件產(chǎn)品。
基于組件的開發(fā)
在基于組件的開發(fā)中,軟件使用模塊進(jìn)行開發(fā),其外部引用從特定實(shí)施分解。然后這些模塊可以動(dòng)態(tài)進(jìn)行鏈接,以構(gòu)建一個(gè)完全成熟的應(yīng)用。注意“外部引用”不僅僅包括引用的對(duì)象,還包括可以使用的類,甚至子類。(想一想Java編程中不同包互相引用的方法?,F(xiàn)在考慮相互分解包。) 在這一專欄中,我們已經(jīng)討論了一種關(guān)于基于組件的Java編程理念 -- Jiazzi (見 sources">參考資料 ,2002年月日11月專欄分解包相關(guān)性)。
基于組件的編程承諾兩種互補(bǔ)性優(yōu)勢,隨著上述態(tài)勢變得越來越突出,這兩種優(yōu)勢將變得日益重要。首先,基于組件的系統(tǒng)可以實(shí)現(xiàn)更大范圍的重新使用。例如,考慮到目前的無數(shù)程序,它們提供文本編輯支持(郵件客戶機(jī)、文字處理程序、ide等等)。同樣,考慮眾多提供處理電子郵件支持的客戶機(jī)。姑且不管提供這些業(yè)務(wù)的程序的數(shù)量,很少程序能夠處理電子郵件以及作為專用電子郵件客戶機(jī)。而且沒有郵件程序能夠?qū)崿F(xiàn)與專用文本編輯器相同級(jí)別的文本控制。但為什么所有郵件客戶機(jī)(IDE、文字處理程序等等)必須開發(fā)自己的文本編輯器呢?如果有一個(gè)各種第三方組件可以實(shí)施的標(biāo)準(zhǔn)“文本編輯器”api那該多好??!郵件客戶機(jī)等工具可以選擇它們最喜歡的實(shí)施這一API的方法并把它加入。實(shí)際上,人們甚至可以想像,用戶使用現(xiàn)成的組件(如他們最喜歡的編輯器、他們最喜歡的郵件客戶機(jī))來創(chuàng)建自己的環(huán)境,可以在應(yīng)用運(yùn)行時(shí)動(dòng)態(tài)鏈接這些現(xiàn)成的組件。
基于組件的模式的另一種優(yōu)勢是更大范圍測試的潛力。在Java語言中,類的外部引用,如I/O庫類和類似類,都是硬連線引用,如未重新編譯不能做任何更改。結(jié)果是,很難對(duì)單獨(dú)依靠外部引用的程序部份進(jìn)行測試。例如,實(shí)際上如果不允許一個(gè)程序從文件系統(tǒng)進(jìn)行讀和寫,很難測試它是否正確使用了該文件系統(tǒng)。但在單元測試中讀和寫文件會(huì)減緩測試,增加更多的復(fù)雜性(如創(chuàng)建臨時(shí)目錄和在使用后清除文件)。理想狀況是我們應(yīng)分離程序和I/O庫的外部引用以便測試。
有多種方式我們可以用來標(biāo)準(zhǔn)化一個(gè)組件模式。J2EE在對(duì)象級(jí)別為web業(yè)務(wù)提供這樣一種模式。Eclipse為IDE組件提供一種模式。Jiazzi提供一種可以鏈接單獨(dú)編譯的軟件“單元”以形成一個(gè)完整的應(yīng)用的模式。每種公式在特殊的環(huán)境中使用;我們期望在接下來的數(shù)年內(nèi)看到更多的公式。
斷言和不變量 聯(lián)合基于組件的編程必須將越來越多的重點(diǎn)放在斷言和確保實(shí)際上滿足計(jì)劃預(yù)留用于組件的不變量的其它方法。類型系統(tǒng)自身并沒有表現(xiàn)得能夠捕獲所有計(jì)劃的不變量。例如,我們不應(yīng)期望文本編輯API的方法類型可以捕獲所有與“只關(guān)閉打開的文件”類似的不變量。我們可以依靠非正式文件來規(guī)定這類不變量,我們標(biāo)準(zhǔn)化和檢查的不變量越多,效果就越好。
確保滿足需要的不變量是組件封裝的一個(gè)方面。通常,客戶機(jī)編程人員將無法推論組件如何運(yùn)行,而不是按公布的API中所述的方式。API中不包括的組件的所有行為不是客戶機(jī)編程人員可以依靠的行為。如果非公布的行為導(dǎo)致運(yùn)行時(shí)錯(cuò)誤,編程人員將很難診斷問題并加以解決。
目前正在進(jìn)行多項(xiàng)調(diào)研項(xiàng)目以顯著改進(jìn)我們可以規(guī)定用于組件的不變量的種類。其中一些項(xiàng)目,如Time Rover (見 參考資料 2002年7月專欄),使用模態(tài)邏輯和其它邏輯形式來表示運(yùn)行時(shí)行為的深度屬性。
表示不變量的另一種方法是泛型-作為其它類型參數(shù)化的類型來支持類型系統(tǒng)(本專欄中最近一系列文章的主題)。
添加更加強(qiáng)大的不變量的另一種方法是從屬類型。 從屬類型是運(yùn)行時(shí)值參數(shù)化的類型 (與泛型比較,泛型是其它類型參數(shù)化的類型)。
從屬類型的標(biāo)準(zhǔn)實(shí)例是數(shù)組大小參數(shù)化的數(shù)組。通過在該類型中包括數(shù)組大小,編譯時(shí)間檢測器可以象征性地分析數(shù)組的存取,確保所有存取都在數(shù)組范圍內(nèi)進(jìn)行。從屬類型另一種引人注目的使用方式是由 Boyapati、 Liskov和 Shrira開發(fā)的所有者(ownership)類型 (見參考資料 ,原始頁面鏈接)。
所有者類型是一個(gè)所有者對(duì)象參數(shù)化的對(duì)象的類型。例如,考慮容器上的迭代器(iterator)??梢院茏匀坏恼f迭代器由容器擁有,因此,容器有該迭代器特殊的存取特權(quán)。內(nèi)部類提供一些相同的存取特權(quán)控制,但所有者類型提供更強(qiáng)大、靈活的控制機(jī)制。
重整工具中的持續(xù)改進(jìn) 軟件應(yīng)用的規(guī)模越來越大,而程序人員越來越難以維持和改進(jìn)代碼或診斷程序錯(cuò)誤。優(yōu)秀開發(fā)人員的缺乏進(jìn)一步加劇了這一難題。幸運(yùn)的是,開發(fā)工具正在為我們提供對(duì)軟件系統(tǒng)越來越強(qiáng)有力的控制。最強(qiáng)有力的兩種控制形式是單元測試工具和重整瀏覽器。
單元測試工具使我們能夠檢查重整情況下繼續(xù)保持的程序的關(guān)鍵不變量。重整瀏覽器提供多種直接且強(qiáng)有力地修改代碼的方式,同時(shí)保留行為。我們開始看到“第二代”單元測試工具,它們利用靜態(tài)類型和單元測試,從而實(shí)現(xiàn)代碼范圍的自動(dòng)測試和測試的自動(dòng)生成。重整瀏覽器向標(biāo)準(zhǔn)字庫添加越來越多的重整。從長期來看,我們應(yīng)尋找更卓越的工具,如“以模板為導(dǎo)向”的重整瀏覽器,它承認(rèn)設(shè)計(jì)模板在程序中的使用(或潛在使用)并應(yīng)用它們。
我們甚至可以期望開發(fā)工具最終利用單元測試來執(zhí)行更多積極地重整。在Martin Fowler的杰作《重整:完善現(xiàn)有代碼設(shè)計(jì)》中,重整被定義為保留程序看得見的行為。但是,我們通常不會(huì)關(guān)心一個(gè)程序看得見的行為的所有方面,實(shí)際上,我們通常只關(guān)心維持該行為的某些關(guān)鍵方面,而且這些關(guān)鍵方面正是假定要進(jìn)行檢測的一組單元測試!
因此,重整瀏覽器可以潛在地利用一組單元測試來確定行為的重要方面。其它方面應(yīng)可以被重整瀏覽器積極地隨意修改,以簡化程序。另一方面,通過確定單元測試允許的重整的種類并向程序人員報(bào)告,這類重整瀏覽器的功能應(yīng)可以用于檢測測試范圍。
交互式調(diào)試器
隨著應(yīng)用的日益復(fù)雜且更多地在遠(yuǎn)程平臺(tái)上運(yùn)行,程序錯(cuò)誤的診斷帶來了新的挑戰(zhàn)。通常在部署平臺(tái)上調(diào)試程序是不可行或不切實(shí)踐的。最理想的情況是我們能夠遠(yuǎn)程調(diào)試軟件。
Java平臺(tái)調(diào)試器架構(gòu)(JPDA)提供用于這類工具,允許調(diào)試器在單元的JVM上運(yùn)行;然后我們可以使用Rmi來進(jìn)行遠(yuǎn)程調(diào)試。而且,除了遠(yuǎn)程調(diào)試之外,通過在啟動(dòng)調(diào)試器時(shí)為程序人員提供更多的存取點(diǎn)控制,以及調(diào)試過程中提供計(jì)算狀態(tài)的可用視圖,程序人員可以更有效地進(jìn)行診斷。
即使使用現(xiàn)代化調(diào)試器,程序人員在多種環(huán)境中仍舊必須求助于printlns
以獲得他們需要的信息。理想情況下我們應(yīng)部署調(diào)試器,它可以完全取消printlns
的需求。實(shí)際上,在Java編程語言小組(JavaPLT)中,我們正在研究這類調(diào)試器。由于開放源代碼將在2003年秋季發(fā)布,這類調(diào)試器將使用無縫集成的“交互式窗口”, 它支持代碼的漸進(jìn)式評(píng)價(jià)(見參考資料,2002年3月專欄)。交互式窗口使您能夠通過任意表達(dá)式評(píng)估來啟動(dòng)調(diào)試流程。它還可以在斷點(diǎn)使用,以與上下文中運(yùn)行的流程交互,接入流程中該點(diǎn)看得見的范圍并隨意進(jìn)行修改。JavaPLT 調(diào)試器將作為 DrJava IDE的一部分和作為單獨(dú)的Eclipse插件推出。
輕型、可互操作的開發(fā)工具
隨著開發(fā)工具變得越來越先進(jìn),一家廠商很難提供所有最好的工具。開發(fā)人員傾向于依靠不同廠商提供的工具自助餐。如果不同的工具能夠很好地協(xié)作,這樣做最好不過了,每個(gè)人都接受這樣一個(gè)事實(shí),它們將與其它工具很好地協(xié)作。
Eclipse等項(xiàng)目在這一哲學(xué)方面搶得先機(jī),提供實(shí)現(xiàn)工具互操作的方式以利用相互之間的功能,以及提供任何工具單獨(dú)提供的范疇之外的業(yè)務(wù)。隨著時(shí)間的推移,我們期望這種模式,或其它與其類似的模式,以真正“超越”傳統(tǒng)的全方位IDE。
元級(jí)別應(yīng)用邏輯
根據(jù)我們最后的水晶球構(gòu)想,我們考慮軟件行業(yè)可能在長時(shí)間內(nèi)從事的一個(gè)方向。應(yīng)用中發(fā)生的許多最常見的程序錯(cuò)誤都是簡單的誤配置的結(jié)果,一旦用戶了解應(yīng)用的基本詳細(xì)信息就可以輕松對(duì)其進(jìn)行糾正。問題是大多數(shù)用戶沒有時(shí)間來了解他們使用的所有應(yīng)用的基本詳細(xì)信息。
解決這一問題的一項(xiàng)長期解決方案是將元級(jí)別知識(shí)嵌入到應(yīng)用中,這類應(yīng)用對(duì)運(yùn)行應(yīng)用的環(huán)境以及假設(shè)要執(zhí)行的程序進(jìn)行編碼。例如,字處理程序的元級(jí)別知識(shí)應(yīng)包括解釋用戶在個(gè)人計(jì)算機(jī)上用于生成英文文件的程序的邏輯,其它用戶可以閱讀這類文件。在對(duì)這類知識(shí)進(jìn)行了編碼之后,當(dāng)某些地方出錯(cuò)時(shí)應(yīng)用可以推論出用戶正在嘗試做的工作(當(dāng)然,應(yīng)用還必須首先確定某些地方出錯(cuò))。
這類元級(jí)別知識(shí)是向應(yīng)用添加強(qiáng)韌性的潛在強(qiáng)大機(jī)制。它還極其危險(xiǎn),最令人不安的是在極力提倡沿著這一方向前進(jìn)過程中經(jīng)常忽略了它的存在。實(shí)際上,自身可以動(dòng)態(tài)重新配置的應(yīng)用的行為極其不可預(yù)測。用戶可能發(fā)現(xiàn)很難在某些情況下說明他的程序?qū)⑷绾芜\(yùn)行。而且,程序的開發(fā)人員還可能發(fā)現(xiàn)很難確保其可靠性。正如我們反復(fù)看到的一樣,不能預(yù)測和了解程序行為導(dǎo)致的一種可以輕松預(yù)測到的結(jié)果是 -- 錯(cuò)誤不斷的軟件。
為了弄清楚這一點(diǎn),我真正考慮具有元級(jí)別知識(shí)的適應(yīng)軟件,這類知識(shí)與有可能顯著提升軟件應(yīng)用性能的環(huán)境有關(guān),但如果我們?cè)黾恿诉@類功能,那么我們必須找到相應(yīng)的方法,從而仍舊使我們能夠有效說明我們的程序。
一個(gè)結(jié)合元級(jí)別知識(shí)形式和功能(雖然非常有限)且不會(huì)影響可預(yù)測行為的軟件系統(tǒng)實(shí)例是TiVo個(gè)人數(shù)字記錄器(或其它類似產(chǎn)品)。TiVo根據(jù)您的看電視習(xí)慣來自適應(yīng)地確定您可能希望觀看的節(jié)目,但這種自適應(yīng)性是極其受限制的。TiVo將總是遵循用戶的節(jié)目指令來記錄,與任何其自適應(yīng)行為響應(yīng)無關(guān)。TiVo使用一種非常簡單的元級(jí)別知識(shí)形式,但隨著使用的元級(jí)別知識(shí)變得越來越復(fù)雜,我們應(yīng)繼續(xù)保持對(duì)自適應(yīng)行為的控制。如果您將認(rèn)可科幻領(lǐng)域某些稀奇的比較,那么我們將遵循Isaac Asimov創(chuàng)建的先例。Asimovian機(jī)器人是異常強(qiáng)大的機(jī)器,但它們必須絕對(duì)遵循不可侵犯的基本法律,從而能夠在一定程度上預(yù)測它們的行為。
再會(huì)
在Asimovian機(jī)器人注釋中我將結(jié)束這一討論。非常感謝 developerWorks 小組在過去兩年半的時(shí)間內(nèi)所做的工作:編輯Jenni Aloi,為我提供編寫這專欄的機(jī)會(huì);文字編輯Christine Stackel,對(duì)細(xì)節(jié)一絲不茍;發(fā)展編輯 Kane Scarlett,進(jìn)一步完善了這一專欄的內(nèi)容。
致讀者:非常希望您能夠在這些文章中挖掘出一些最新的價(jià)值。對(duì)于我來說,撰寫這些文章已經(jīng)成為了無價(jià)的學(xué)習(xí)體驗(yàn)。非常感謝您閱讀這類文章,祝您在防止和診斷程序錯(cuò)誤中好運(yùn)。
BIOS-->
關(guān)于作者
Eric Allen 在康奈爾大學(xué)獲得計(jì)算機(jī)科學(xué)及數(shù)學(xué)學(xué)士學(xué)位,并且是 Rice 大學(xué) Java 編程語言小組的博士研究生。在回 Rice 完成學(xué)位前,Eric 是 Cycorp, Inc. 的首席 Java 軟件開發(fā)人員。他還主持了 JavaWorld 的“Java 初學(xué)者”論壇。他的研究包括源代碼和字節(jié)碼級(jí)別上 Java 語言的語義模型和靜態(tài)分析工具的開發(fā)。Eric 領(lǐng)導(dǎo)開發(fā)了 Rice 的 NextGen 編程語言的實(shí)驗(yàn)編譯器,NextGen 編程語言是帶附加語言特性的 Java 語言擴(kuò)展,他也是 DrJava(一種為初學(xué)者設(shè)計(jì)的開放源碼 Java IDE)的項(xiàng)目經(jīng)理??赏ㄟ^ eallen@cs.rice.edu與Eric聯(lián)系。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。