Groovy Eclipse開發(fā)團(tuán)隊訪談:不要畏懼內(nèi)部API
Andrew Eisenberg曾是英屬哥倫比亞大學(xué)的一名PhD開發(fā)人員,后來工作于SpringSource團(tuán)隊,并從事Groovy Eclipse工具支持方面的工作。他的主要開發(fā)理念是:通過與正確的IDE交互,將更具表達(dá)力。
Andy Clement則是SpringSource的高級軟件工程師,他做許多與開發(fā)工具有關(guān)的工作( Groovy,AspectJ、Tasktop以及SpringSource工具套件)。過去的幾年里Clement一直在領(lǐng)導(dǎo)AspectJ Eclipse項目。他還在Spring Framework 3 中創(chuàng)建了Spring Expression Language支持并為SpringSource dm Server寫了不少代碼。
作為Groovy Eclipse v2的開發(fā)者,Dzone對兩人進(jìn)行了專訪。
Dzone:你們剛剛宣布了Groovy Eclipse v2插件的alpha版本,Groovy / Eclipse社區(qū)對Groovy與Eclipse的更好結(jié)合期待已久,在這次的發(fā)布的版本中,有哪些特性值得他們的期待?
Andrew:對于這個Alpha版本,我們的目標(biāo)是:在Groovy與所有開發(fā)者期待的Java工具的特性中,能夠支持基本的編輯-保存-編譯-運(yùn)行周期。盡管如此,這還只是一個alpha版本,雖然它包含最終版本中的大部分主要功能,但仍會有很多新增、性能調(diào)試和測試
Andy:我們從AspectJ和它的工具支持學(xué)到了很多。這個問題不在于你的語言有多聰明,而在于IDE的功能,如果IDE中沒有漸進(jìn)式編譯、代碼協(xié)助和導(dǎo)航,那么依然影響應(yīng)用的編寫。這個Alpha版本也是支持另一種語言直接進(jìn)入Eclipse JDT的標(biāo)志性版本。
Dzone:你是如何進(jìn)入Eclipse插件開發(fā)領(lǐng)域的?
Andrew:早在我做PhD時,我就有了擴(kuò)展型編輯器的想法。像Groovy這樣的語言可以通過使用元程序來擴(kuò)展語言,當(dāng)時我就在想能否通過元程序來擴(kuò)展編輯器。盡管我可以找到一些頭緒,然而我還是沒能真的找到可用的擴(kuò)展編輯器,這與JDT的局限性有關(guān)。JDT是高度優(yōu)化和優(yōu)秀結(jié)構(gòu)的框架,用來構(gòu)建Java語言的工具,而不是用來擴(kuò)展或者支持其他JVM語言。
畢業(yè)后我就業(yè)于SpringSource,剛好解決的是AJDT(AspectJ Development Tools)問題,在此期間我們遭遇到瓶頸,因為將AspectJ模型集成到JDT的Java模型中非常困難,這主要是因為JDT缺乏對新編程元素的支持。***我們在Eclispe上使用AspectJ來讓JKT更具擴(kuò)展性。
不久之后,我被邀請到參與Groovy-Eclipse支持的開發(fā)。最初我認(rèn)為同樣的方法可行(即使用AspectJ來讓Eclispe更加兼容Groovy),結(jié)果發(fā)現(xiàn)每種語言都不同而且相應(yīng)的開發(fā)工具也不同。由于JDT要求的擴(kuò)展類型不符,因而使用AspectJ來支持Groovy不可行。后來我們發(fā)現(xiàn)也許存在一種方法將Groovy編輯器與Java編輯器整合起來。
Andy:當(dāng)時我就職于IBM從事于Java支持CICS主機(jī)的支持優(yōu)化工作,想尋找一個新的工作。我的同事當(dāng)時從一個會議上回來并告訴我們一個關(guān)于新項目的主意,他的名字是Adrian Colyer,現(xiàn)在是SpringSource的CTO,他發(fā)現(xiàn)了一種叫做面向Aspect編程(Aspect Oriented Programming)的東西,并試圖為這種新語言創(chuàng)建Eclispe工具。漸漸的,我們轉(zhuǎn)向于從編輯器端尋找解決方法,可以讓更多兼容Eclispe的開發(fā)者在UI端工作。幸虧有了AJDT項目,AspectJ作為一個改良過的Eclipse JDT編輯器,我從中學(xué)習(xí)到了很多。
最初我試驗Groovy插件遇到了麻煩,于是回頭查看到底是因為什么,與Jochen Theodorou討論了架構(gòu)之后,我意識到這是Eclispe支持的一個很好的方法。有時候我們會花費(fèi)很多時間來復(fù)制一大段Eclipse JDT代碼只是為了改變其中的某幾行,或者編寫許多代碼來為AJDT中的某個特性創(chuàng)建支持,比如漸進(jìn)式編譯。通過讓Eclispe理解Groovy編輯器,可以實現(xiàn)這些功能。
Dzone:在開發(fā)Eclispe插件的過程中有哪些可以分享給開發(fā)者呢?
Andrew:為Eclispe開發(fā)插件很不容易,有許多東西要學(xué)習(xí),而且似乎有數(shù)不盡的API要了解。盡管如此,如果你知道如何正確地使用這個平臺,那么仍然可以創(chuàng)建強(qiáng)大的應(yīng)用。
學(xué)習(xí)Eclispe平臺***的方法之一就是閱讀它的源代碼,這些代碼寫得很好而且標(biāo)注也很全。平臺本身就是***的客戶端,可以讓你獲悉它的API是如果運(yùn)行的。
另外一個建議是不要畏懼使用內(nèi)部API,它們通常是獲取一些未公開的服務(wù)的唯一方法,從長遠(yuǎn)來看使用它們可以讓你的代碼更加優(yōu)良。
Andy: 當(dāng)我們開始AJDT項目的時候,發(fā)現(xiàn)API的數(shù)量果然很驚人,同樣我也贊同***的學(xué)習(xí)方法是閱讀一些Eclispe代碼,尤其是那些跟你從事項目比較相關(guān)的代碼。
Dzone:你們是怎樣開始Groovy的開發(fā)的?
Andrew: 與其說我來自于Groovy,倒不如說我來自Eclispe。對于語言我已經(jīng)有了好多年的了解,但是直到工作在這個Eclispe插件項目我才找到真正使用語言的機(jī)會。這真是一種很棒的語言:Groovy代碼像Java代碼卻又有不同之處,初學(xué)者也因此可以很快地了解Groovy,然后漸漸發(fā)現(xiàn)它更多的性能包括:腳本、AST轉(zhuǎn)換以及閉包等。
Andy:最初為了學(xué)到Groovy,我想做一些Grails上的工作。然而當(dāng)我開始在Eclispe上從事Grails的時候,這不同于我從事Java開發(fā)的經(jīng)歷。我太習(xí)慣于一個IDE,于是考慮到我之前的工作經(jīng)歷我想我可以從這里做點文章,只要IDE工作了,我就可以回到Grails。
Dzone:在開發(fā)Groovy Eclipse v2插件的過程中***的挑戰(zhàn)是什么?
Andrew:回想起來將插件的UI組件移植到新的編輯器是個很恐怖的事情。最初的插件使用一種Java模型的復(fù)制品來表現(xiàn)Groovy代碼,我必須找出這些部分然后使用一個真正的Java模型取代它。當(dāng)然這也帶來了不少優(yōu)點:***,可以為Groovy程序組件做Java掃描,由于我移除了原來代碼中許多不相干的部分,所以新的代碼更簡短了。
在開發(fā)中,可能我花費(fèi)時間最多的是創(chuàng)建可以生成升級網(wǎng)址的headless構(gòu)建腳本,這是一個很枯燥的任務(wù),需要自展新的編輯器來構(gòu)建自己。直到現(xiàn)在,我仍在花費(fèi)大量的時間來調(diào)試構(gòu)建腳本以產(chǎn)生***的結(jié)果。
在此我也有個建議:如果要為Eclispe構(gòu)建插件,使用其他平臺來編寫構(gòu)建腳本。
Andy: 迄今為止我只接手了一項任務(wù),而且這項任務(wù)特別有挑戰(zhàn)性:集成兩個完全不同的編輯器代碼基,同時還要確保漸進(jìn)式編譯功能正常運(yùn)行。這項任務(wù)需要在正式開始工作前做許多編程工作,這非常讓人不爽。
***次我使用原型,一直到開始構(gòu)建Grails的時候發(fā)現(xiàn)很多困難,難以繼續(xù)開發(fā)下去,所以我徹底放棄了這個方法,重寫代碼。幸運(yùn)的是,除了JDT編輯器,我還可以使用JDT測試插件并且用Groovy支持?jǐn)U展它們,所以重寫代碼我使用的是TDD方法。
Dzone:能否透露一下下一個版本的一些情況?
Andrew:你指的是V2的最終版吧?目前而言,主要的特性已經(jīng)應(yīng)用到了alpha版本中:漸進(jìn)式編譯、代碼瀏覽、內(nèi)容輔助(content assist)等。然而其中的某些特性尤其是代碼瀏覽和內(nèi)容輔助仍處于優(yōu)化過程中。
除了這些主要的特性,我們還希望能夠引進(jìn)其他編輯器的特性,如快速檢錯、以及AST轉(zhuǎn)換的編輯器支持、一個功能更加完善的Groovy控制面板,也許還會加入一些Grails支持。
Andy: 從開發(fā)編輯器的角度來看,接下來到發(fā)布v2最終版的幾個月里,主要的工作是細(xì)節(jié)上的進(jìn)一步完善。基本上所以的功能已經(jīng)在alpha版本里了,我們要做的就是確定它們在最終版里可用而且流暢,還要做的工作包括性能提升、存儲使用等。
【編輯推薦】