獨(dú)家專訪Scala IDE三劍客:探秘IDE插件開發(fā)
原創(chuàng)【51CTO獨(dú)家特稿】Eclipse、NetBeans和IntelliJ是IDE領(lǐng)域的三大巨頭,尤其是在Java開發(fā)方面。而Scala編程語言,則是一個(gè)基于Java平臺(tái)的、比Java語言更好的新語言(參考閱讀:Scala簡介),這個(gè)語言在過去的幾年間得到了越來越多的認(rèn)可,并且有越來越多的項(xiàng)目開始接觸、嘗試并使用它(比如:Twitter,法國電力,西門子等等。詳見Scala官方網(wǎng)站)。然而現(xiàn)在一個(gè)普遍的問題就是:Scala的IDE支持情況。
#t#大部分Scala項(xiàng)目都是從Java項(xiàng)目開始的,而項(xiàng)目轉(zhuǎn)型的成本和效率與是否有優(yōu)秀的IDE支持緊密相關(guān)。Eclipse、NetBeans和IntelliJ這三大IDE的插件機(jī)制各自不同,因此在實(shí)現(xiàn)這一共同的功能上,都會(huì)有不同的思路,遇到不同的問題,最終帶來不同的解決方法。
51CTO編輯近日通過網(wǎng)絡(luò)途徑對(duì)三個(gè)Scala IDE插件的開發(fā)者進(jìn)行了采訪,目的有以下兩個(gè):
1.總結(jié)Scala插件的現(xiàn)狀。BASE小組在今年8月曾組織過一次吹風(fēng)會(huì)交流Scala插件的情況,此次訪談也是希望延伸那次會(huì)議的交流成果,跟蹤Scala插件在之后這三個(gè)月的發(fā)展情況。
2.展示IDE語言支持插件的開發(fā)過程。相信很多開發(fā)者對(duì)于開發(fā)Eclipse、NetBeans和IntelliJ的插件很感興趣,但也許不知道要從何入手,那么最好的方法就是從其他插件開發(fā)者的開發(fā)經(jīng)驗(yàn)當(dāng)中學(xué)習(xí)。語言支持插件是IDE插件當(dāng)中最難的一種,因此從中能夠獲得的經(jīng)驗(yàn)也是最多的。
概述
目前Scala插件的開發(fā)者情況如下(參考Scala官網(wǎng)的介紹):
Eclipse的Scala插件:Scala IDE for Eclipse
這個(gè)插件最初由Sean McDirmid(Scala創(chuàng)始人Martin Odersky的學(xué)生)開發(fā),現(xiàn)在由Miles Sabin來負(fù)責(zé)此項(xiàng)目。51CTO編輯聯(lián)系到了Miles Sabin進(jìn)行采訪。Miles開展了一家專門做Scala相關(guān)咨詢的公司,為客戶提供Scala工具、Scala開發(fā)、培訓(xùn)和其他咨詢的服務(wù)。
Miles Sabin的個(gè)人主頁(即他公司的主頁):http://www.chuusai.com/
NetBeans的Scala插件:Scala Plugin for NetBeans
這個(gè)插件由鄧草原在其業(yè)余時(shí)間開發(fā)。鄧草原,現(xiàn)加盟宏爵財(cái)經(jīng)資訊(北京)有限公司。他是開源軟件AIOTrade項(xiàng)目的主創(chuàng)者,同時(shí)也是NetBeans的Erlang插件的開發(fā)者,以及NetBeans夢(mèng)之隊(duì)成員。
鄧草原的個(gè)人主頁:http://blogtrader.net/dcaoyuan/
IntelliJ的Scala插件:Scala Plugin for IntelliJ IDEA
這個(gè)插件由Jetbrains IntelliJIDEA的一個(gè)小團(tuán)隊(duì)進(jìn)行開發(fā),團(tuán)隊(duì)成員包括Ilya Sergey,Eugene Vigdorchik以及Alexander Podkhalyuzin。51CTO編輯對(duì)Ilya Sergey進(jìn)行了采訪。IntelliJ在幾個(gè)星期前終于也加入了開源的行列,這將幫助它擴(kuò)展更多的用戶。
Ilya Sergey在信件中表示,希望使用IntelliJ的Scala插件的開發(fā)者都能仔細(xì)閱讀這個(gè)wiki頁面,這樣可以減少很多有關(guān)插件安裝和使用的問題。
訪談內(nèi)容
此次訪談主要以電子郵件的形式進(jìn)行,51CTO編輯向三位開發(fā)者發(fā)送了一組問卷。問卷包括六個(gè)問題:
1.您是如何開始進(jìn)入Scala插件開發(fā)這項(xiàng)工作的?
2.進(jìn)行IDE插件開發(fā)需要具備哪些知識(shí)?
3.能否介紹一下您計(jì)劃讓Scala插件提供哪些功能?現(xiàn)在都實(shí)現(xiàn)了么?
4.IDE插件開發(fā)的主要瓶頸在哪些方面?與其他插件開發(fā)者進(jìn)行交流對(duì)您的進(jìn)程是否有幫助?
5.您認(rèn)為Scala插件現(xiàn)在已經(jīng)足夠成熟到投入實(shí)際的開發(fā)中去?開發(fā)者在使用中需要注意哪些問題?
6.您對(duì)于Scala 2.8的正式推出抱有怎樣的期待?
希望三位開發(fā)者對(duì)這些問題的回答能夠?qū)δ兴鶐椭O旅嬲?qǐng)進(jìn)入正文部分——
#p#
Eclipse的Scala插件開發(fā)者,Miles Sabin
#t#Eclipse的Scala插件的現(xiàn)任開發(fā)者M(jìn)iles Sabin由于工作繁忙的關(guān)系,難以抽出太多時(shí)間來完整的回復(fù)我們的郵件,不過Miles十分熱心的提供了幾條很有用的信息,并對(duì)一些具體的問題進(jìn)行了細(xì)致的回復(fù),幫助我們成功完成這次訪談。
以下部分內(nèi)容來自Miles提供的這個(gè)鏈接和這個(gè)PDF。
1.您是如何開始進(jìn)入Scala插件開發(fā)這項(xiàng)工作的?
我一開始并非是被Scala所吸引。大約在1998年的時(shí)候,我是JCP工作團(tuán)隊(duì)的一員,負(fù)責(zé)NIO事件驅(qū)動(dòng)網(wǎng)絡(luò)IO API這一塊的設(shè)計(jì)(這一功能在Java 1.4版本中開始出現(xiàn))。我們的團(tuán)隊(duì)工作的很出色,但不得不承認(rèn),要充分利用Java的特性來建造高性能網(wǎng)絡(luò)應(yīng)用并不是個(gè)容易的事情。你會(huì)發(fā)現(xiàn)你陷入了一個(gè)周圍遍布手工制造的狀態(tài)機(jī)這樣的尷尬情況。如果沒有順手工具的支持,這將很快變得非常枯燥,非常困難。
直覺告訴我語言級(jí)的支持是正確的方向。我啟動(dòng)了一個(gè)長期項(xiàng)目:尋找或創(chuàng)造一個(gè)合適的語言。2003年我興奮的發(fā)現(xiàn)了Funnel語言。這個(gè)語言基于聯(lián)合演算,來自EPFL(編者注:洛桑聯(lián)邦理工學(xué)院,瑞士的兩所聯(lián)邦理工學(xué)院之一)的Martin Odersky的團(tuán)隊(duì)。后來Funnel項(xiàng)目被停止,取而代之的就是Scala項(xiàng)目。
雖然與Funnel有很大不同,但我第一眼看到Scala就喜歡上它了。當(dāng)時(shí)我是Codefarm公司的技術(shù)總監(jiān),專門經(jīng)營基于Java與OSGi基礎(chǔ)設(shè)施的分布式受限優(yōu)化方面的技術(shù)。我們的產(chǎn)品包含一個(gè)復(fù)雜的特定領(lǐng)域語言(DSL),而Scala在這方面很理想。當(dāng)時(shí)我們就想轉(zhuǎn)移到Scala上,但在2004年那個(gè)時(shí)候Scala還不夠成熟,把公司押上去風(fēng)險(xiǎn)太大。不過現(xiàn)在就不同了,我會(huì)毫不猶豫的向新客戶推薦Scala。
我建立了一個(gè)咨詢公司,在很多項(xiàng)目上尋找商業(yè)機(jī)會(huì);同時(shí)我一直在關(guān)注Scala電子郵件群的動(dòng)向,尋找機(jī)會(huì)表達(dá)我對(duì)Scala的愛。當(dāng)時(shí)EDF(électricité de France,法國電力)貿(mào)易部門的一個(gè)團(tuán)隊(duì)宣布要將大量Java代碼庫址(大約有30萬行代碼)遷移至Scala。他們很喜歡Scala,同時(shí)也非常需要在Eclipse的Scala插件中有更加強(qiáng)大的對(duì)Java/Scala混合項(xiàng)目的支持。結(jié)果是,EDFT團(tuán)隊(duì)實(shí)現(xiàn)了絕大多數(shù)代碼庫址到Scala的遷移,并使用Scala編寫了幾個(gè)新的能源產(chǎn)量推導(dǎo)價(jià)格的應(yīng)用。在這個(gè)過程中,Scala IDE也經(jīng)歷了巨大的成長。
Eclipse的Scala插件最初是由Sean McDirmid(Martin Odersky的學(xué)生)開發(fā)的。當(dāng)時(shí)EDFT團(tuán)隊(duì)希望實(shí)現(xiàn)更多功能,不過同時(shí)也希望這是個(gè)可靠的生產(chǎn)工具。他們從Sean的成果中看到了這個(gè)插件的潛力,并愿意在他們需要的功能上投資。我為他們提出了一個(gè)計(jì)劃,由此確定了項(xiàng)目進(jìn)展的方向。主要的目標(biāo)定位為對(duì)Scala/Java混合項(xiàng)目的無縫支持,以及與Eclipse Java工具的集成。很明顯,極大多數(shù)Scala項(xiàng)目將從現(xiàn)有的Java代碼庫起步,而無縫集成對(duì)于逐步遷移項(xiàng)目而言是絕對(duì)必要的。
2.進(jìn)行Eclipse插件開發(fā)需要具備哪些知識(shí)?
雖然Miles表示難以回答這個(gè)問題,不過讀者們可以看看Miles對(duì)其他問題的回答,里面可能有您想知道的內(nèi)容。另外,Groovy Eclipse插件的開發(fā)團(tuán)隊(duì)也對(duì)這個(gè)問題表達(dá)過自己的見解:Groovy Eclipse開發(fā)團(tuán)隊(duì)訪談。
3.能否介紹一下您計(jì)劃讓Scala插件提供哪些功能?現(xiàn)在都實(shí)現(xiàn)了么?
Scala Eclipse插件的開發(fā)基本上經(jīng)歷了七個(gè)階段:
◆2005年初:使用Java完成了第一版Scala Eclipse插件,在基本語法高亮和build invocation之外幾乎沒有什么功能。當(dāng)時(shí)還有一個(gè)類似的工具叫做Scaliptor。
◆2005年12月-2006年2月:插件用Scala重新編寫,添加了一些語義功能(如有限的自動(dòng)完成代碼功能)。此時(shí)已經(jīng)出現(xiàn)了對(duì)Scala/Java混合項(xiàng)目無縫支持的需求。
◆2007年6月-2008年2月:更加深入的與Scala編譯器集成:
= 互交式錯(cuò)誤報(bào)告
= 語法高亮
= 增量編譯
= 依賴管理
◆2008年5月:我加入項(xiàng)目,EDF貿(mào)易部門投入資金用于協(xié)助開發(fā)。主要目標(biāo)為
= 簡易的Scala/Java遷移
– scalac中Scala/Java混合編譯
– Eclipse中的Scala/Java混合項(xiàng)目
= 更好的Eclipse穩(wěn)定性以及發(fā)布周期
這些目標(biāo)在2009年11月基本實(shí)現(xiàn),當(dāng)時(shí)發(fā)布了Scala 2.7.2。不過,JDT集成仍然有限,而穩(wěn)定性依然是個(gè)問題。
◆JDT集成成為嚴(yán)重的瓶頸。提交了一個(gè)用于開放JDT的patch,不過被拒絕了。不過,通過AspectJ和Equinox Aspects,找到了另一個(gè)解決方案,打破了JDT的瓶頸。之后,解決了很多bug,增強(qiáng)了很多功能。在2009年4月時(shí),新的插件與Scala 2.7.4一起亮相。然而,這個(gè)插件有一些安裝問題,一些JDT特性也不太穩(wěn)定
◆我繼續(xù)全速解決JDT集成的問題,并增添了幾個(gè)幫手。然而,大多代碼庫址很復(fù)雜,過于抽象,將人拒之門外
= 對(duì)于大多數(shù)來幫忙的開發(fā)者而言,學(xué)習(xí)曲線太高
= 編譯器過于脆弱:
-很小的錯(cuò)誤會(huì)導(dǎo)致所有代碼高亮消失
-不靠譜的依賴管理
=對(duì)scalac的副作用:很多脆弱的“if(inIDE)”塊
于是,徹底重寫了所有語法和build相關(guān)的功能。這項(xiàng)工作在今年5月間與EPFL的Martin Odersky和lulian Dragos共同完成。
這個(gè)新的互交式編譯器有了如下改進(jìn):
= 將舊的可視化編譯器全部重寫
= 編譯單元被整合為一個(gè)源文件
- 性能即使沒有提升,至少實(shí)現(xiàn)了均衡。原先的做法是“過早優(yōu)化”
= 所有“inIDE”條件從scalac中移除
= 到AST節(jié)點(diǎn)的信息的精確定位
- 支持新的功能(折疊)
- 支持新的工具(重構(gòu),格式化)
= 新的增量構(gòu)建管理
= 可靠性大幅增長
= 使用了scalac的文件系統(tǒng)抽象功能
= 支持所有的JDT構(gòu)建路徑功能,如多源,多輸出目錄等
不過,由于整個(gè)重寫,原先scalac的集成支持被全部移除。Eclipse中所有的語法特性也整個(gè)重來了一遍,對(duì)于2.7.x一支的新功能和bug修復(fù)也沒有了可行的回移方案。
◆到今年9月,又有了如下進(jìn)展:
= 新的build管理器已經(jīng)完全集成,基本解決了打開/關(guān)閉項(xiàng)目時(shí)出現(xiàn)的問題
= Scala編輯器現(xiàn)在和Java編輯器基本相同
= 新的輕量語法高亮器基于Java的JDT,在語法錯(cuò)誤面前十分穩(wěn)固
= 超鏈接導(dǎo)航接近完成
= 底層機(jī)制支持更多JDT特性
= 標(biāo)準(zhǔn)庫的導(dǎo)航性大大增強(qiáng)
= Scala源和雙字節(jié)組件的全映射令Scala元素的完全JDT索引成為可能
= 實(shí)時(shí)錯(cuò)誤提示
= 實(shí)時(shí)更新大綱視圖和包瀏覽器的改變
= 自動(dòng)代碼完成
4.插件開發(fā)的主要瓶頸在哪些方面?與其他插件開發(fā)者進(jìn)行交流對(duì)您的進(jìn)程是否有幫助?
最大的瓶頸就是JDT代碼庫址不支持無縫集成JDT。于是,雖然有源代碼,我仍然需要花費(fèi)大量的時(shí)間進(jìn)行逆向工程并破壞其行為。AspectJ在這里幫了大忙,而我在這個(gè)過程中感覺我們終于找到了將Aspects工具用于正當(dāng)軟件工程的方法。通常情況下我不會(huì)提出這樣的建議,不過其帶來的結(jié)果十分有價(jià)值——它使得原本不堪忍受的痛苦變得可以忍受了。
是的,與其他團(tuán)隊(duì)和開發(fā)者合作十分重要。我一直在與IBM和Eclipse進(jìn)行溝通,希望未來發(fā)布的JDT在集成其他JVM語言時(shí)可以避免我所走的那些彎路。我與Andrew Eisenberg(AspectJ),Andy Clement(Groovy)以及Neil Bartlett(JavaFX)一直在這個(gè)話題上進(jìn)行交流。另外很明顯,我與Martin Odersky以及EPFL團(tuán)隊(duì)的其他成員也有著緊密的聯(lián)系。
最近我在EPFL與Martin和lulian Dragos一起,重新研究了一下scalac與工具(并不限于工具)的接口方面的一些問題。這包括將Scala Eclipse插件的大塊功能重寫移植到scalac自身上去。這樣就可以讓其他開發(fā)者也能夠使用這些功能,而最令人興奮的一點(diǎn)就是可以與其他IDE插件開發(fā)者分享代碼,特別是NetBeans插件的開發(fā)者鄧草原。
5.您是否認(rèn)為Scala插件現(xiàn)在已經(jīng)足夠成熟到投入實(shí)際的開發(fā)中去?開發(fā)者在使用中需要注意哪些問題?
很多開發(fā)者在使用IDE的當(dāng)前穩(wěn)定版(針對(duì)Scala 2.7.7),情況十分理想。當(dāng)然了這個(gè)插件現(xiàn)在還是有一些問題,用戶心里要有所準(zhǔn)備。
現(xiàn)在的所有開發(fā)工作都是針對(duì)即將到來的Scala 2.8,這個(gè)版本投入了大量的開發(fā)精力,并且已經(jīng)比當(dāng)前的穩(wěn)定版更加穩(wěn)定,更加函數(shù)式。如果你可以忍受其底層編譯器和語言更新之頻繁,那么我建議你使用IDE的nightly builds。
6.您對(duì)于Scala 2.8的正式推出抱有怎樣的期待?
Scala 2.8的Eclipse插件已經(jīng)支持了大部分主要功能。我希望能夠在Scala 2.8.0正式發(fā)布之前將缺失的重構(gòu)、代碼格式化等功能補(bǔ)齊,不過是否能完成還不好說。
在Scala 2.8正式發(fā)布之前,最重要的是不斷的測試,提高插件的穩(wěn)定性。其他的功能,如語法注解,對(duì)無來源的雙字節(jié)元素的支持,Maven支持,恢復(fù)JDT特性支持,對(duì)Eclipse擴(kuò)展的兼容性矩陣等等,都需要到Scala 2.8正式發(fā)布之后再考慮了。這個(gè)過程中我們需要更多支持,比如來自社區(qū)的代碼、bug報(bào)告、開發(fā)者文檔、使用體驗(yàn)報(bào)告等等。
#p#
NetBeans的Scala插件開發(fā)者,鄧草原
#t#1.您是如何開始進(jìn)入Scala NetBeans插件開發(fā)這項(xiàng)工作的?
通常在開始使用一種語言時(shí),我首先要找到合適的IDE。大約從2007年起,在使用過Java,JavaScript,Ruby,Python等一系列語言后,我開始尋找能更好地處理并行、并發(fā)問題的語言。首先是Erlang,因?yàn)闆]有合手的IDE,就先花了一個(gè)月寫了Erlang的NetBeans插件,順便熟悉了一下Erlang的語法,這就是后來的ErlyBird。在這期間對(duì)Scala也一直保持關(guān)注。到了2007年年底,Scala終于接近穩(wěn)定,于是一樣,先寫個(gè)IDE。
Scala的IDE難寫的多,一方面是Scala的編譯器對(duì)源碼作了非常多步的轉(zhuǎn)換,使得定位標(biāo)識(shí)符與其語義的關(guān)系很困難,另一方面,開始的編譯器對(duì)IDE的支持不夠。所以,現(xiàn)在的NetBeans
Scala插件經(jīng)過了四個(gè)階段:
* 2007年,LL(K)語法解析器+自寫的類型標(biāo)注器
* 2008年上半年,PEGs語法解析器+自寫的類型標(biāo)注器
* 2008年下半年,Scala自身的編譯器+Hacking,NetBeans Innovation Grant 金獎(jiǎng)
* 2009年8月,全部用Scala改寫,Scala自身的編譯器+Martin為IDE支持所做的改進(jìn)
每個(gè)階段實(shí)際上都是全部重寫。
2.進(jìn)行NetBeans插件開發(fā)需要具備哪些知識(shí)?
如果指的是對(duì)新的編程語言的支持插件,需要了解的知識(shí)包括:
1、編譯原理(包括詞法、語法、AST樹的產(chǎn)生及轉(zhuǎn)換)
2、NetBeans的語言擴(kuò)展框架(包括Parsing API,Common Language Scripting Framework等)
3、NetBeans Platform的APIs(包括NetBeans的Module System,F(xiàn)ile System
APIs,Lookup APIs,Javac APIs, Debugger APIs, Project APIs等)
3.能否介紹一下您計(jì)劃讓Scala NetBeans插件提供哪些功能?現(xiàn)在都實(shí)現(xiàn)了么?
* 代碼高亮
* 語法錯(cuò)誤即時(shí)提示
* 大綱導(dǎo)航
* 代碼折疊
* 引用處處標(biāo)注
* 跳轉(zhuǎn)到定義處
* 即時(shí)重命名
* 重構(gòu):重命名和引用查找(跨打開的項(xiàng)目)
* 代碼自動(dòng)縮進(jìn)和格式化
* 輸出到HTML文件,保持代碼高亮
* 自動(dòng)代碼提示、補(bǔ)齊
* 文擋提示
* Java/Scala混合項(xiàng)目
* 重載標(biāo)記和跳轉(zhuǎn)到被重載的定義處
* 自動(dòng)修正import
* 代碼模版
* 斷點(diǎn)處處可設(shè)的調(diào)試器
* 與Maven項(xiàng)目的結(jié)合
這些功能基本上都實(shí)現(xiàn),有些還不完整,有些還有少許Bug,但到目前,應(yīng)該是支持Scala-2.8.0的功能最全、最好的Scala IDE
4.NetBeans插件開發(fā)的主要瓶頸在哪些方面?與其他插件開發(fā)者進(jìn)行交流對(duì)您的進(jìn)程是否有幫助?
開發(fā)瓶頸我前面提到過一些,但最困難的還是性能。Scala的編譯器從詞法分析到最后產(chǎn)生JVM的Bytecode大約要做24遍掃描。而IDE必須考慮用戶鍵入時(shí)的反應(yīng)速度,但又要提供盡可能多的信息,那么對(duì)于IDE來說,掃描的步驟什么時(shí)候做、做到哪一步,都必須仔細(xì)權(quán)衡。比如為了判斷debugger的斷點(diǎn)應(yīng)該設(shè)置到哪個(gè)位置(類名、源文件名、行號(hào)等),可能需要做到第13遍掃描才能得到全部的信息,但那樣的話,性能就很差了。還有就是Java/Scala混合的項(xiàng)目中的互可見性,也需要做一系列的映射,這些工作也不能等到全部掃描完成才做。
新的NetBeans插件中,我比較好地解決了大部分問題。現(xiàn)在用戶鍵入代碼時(shí)的反應(yīng)速度,包括完成代碼提示時(shí)的速度都相當(dāng)不錯(cuò)了。
我跟Eclipse的插件作者有過交流,包括原來的開發(fā)者,Martin的學(xué)生Sean McDirmid,他現(xiàn)在在北京工作,我跟他見過兩次,就是他說服我使用Scala自身的編譯器,而不是自己重寫。現(xiàn)在的Eclipse插件的主力Miles Sabin,我跟他也有交流,包括提交了一些也能幫助Eclipse插件開發(fā)的patches。
最重要的是Martin本人前段花了一些時(shí)間對(duì)Scala的編譯器作了不少改進(jìn),這些改進(jìn)對(duì)于減少Scala的IDE支持的重復(fù)勞動(dòng)很有意義,我第一時(shí)間就把Martin的這些工作集成到NetBeans中了,并且,我現(xiàn)在的一些工作可以同時(shí)作為patches提交給Scala開發(fā)團(tuán)隊(duì),一起提高Scala IDE水平。
5.您認(rèn)為Scala NetBeans插件現(xiàn)在已經(jīng)足夠成熟到投入實(shí)際的開發(fā)中去?開發(fā)者在使用中需要注意哪些問題?
NetBeans的插件現(xiàn)在完全可以應(yīng)用到實(shí)際開發(fā)中了,NetBeans的Scala插件的一個(gè)重要特點(diǎn)是很穩(wěn)定,當(dāng)然在最新的版本中,功能和性能都大大增強(qiáng)了。我現(xiàn)在用這個(gè)插件開發(fā)NetBeans的插件本身和一個(gè)實(shí)際的大型項(xiàng)目。而且我知道Liftweb社區(qū)的很多人都在用NetBeans的插件。
6.您對(duì)于Scala 2.8的正式推出抱有怎樣的期待?
我非常希望2.8早日正式推出,一方面是大幅提升后的NetBeans插件只能用于Scala-2.8,另一方面,2.8中的新特性對(duì)于我現(xiàn)在的實(shí)際項(xiàng)目來說很重要。當(dāng)然,Scala-2.8的正式推出還需要一些時(shí)間,我估計(jì)在11月應(yīng)該能推出一個(gè)Beta版。
對(duì)于我來說,我天天都在用Scala-2.8的Trunk code,所以也報(bào)告了不少Bugs,我希望剛開始對(duì)Scala感興趣的人現(xiàn)在就使用Scala-2.8的nightly built版本,一來可以使用NetBeans的最新插件,二來,只有一定數(shù)量的人開始使用Scala-2.8才能早日發(fā)現(xiàn)和修復(fù)bugs。
#p#
IntelliJ的Scala插件開發(fā)者,Ilya Sergey
#t#1. 您是如何開始進(jìn)入IntelliJ的Scala插件開發(fā)這項(xiàng)工作的?
最開始,IntelliJ的Scala插件完全是一個(gè)實(shí)驗(yàn)性項(xiàng)目。最初提出這個(gè)設(shè)想的人是Eugene Vigdorchik,而當(dāng)時(shí)的挑戰(zhàn)則是為另外一個(gè)非Java語言的基于JVM的語言提供一個(gè)成熟的插件。我們從2006年開始開發(fā),當(dāng)時(shí)的Scala版本是2.1.8。當(dāng)時(shí)同時(shí)開始開發(fā)的還有Ruby插件,這個(gè)差距在兩年后成為了一個(gè)名為RubyMine的獨(dú)立Ruby IDE。在這個(gè)Scala插件開始開發(fā)的七個(gè)月之后,曾經(jīng)因?yàn)樯虡I(yè)原因中斷過,而我們則轉(zhuǎn)而投向Groovy IntelliJ插件的開發(fā)。不過到了2007年底,開發(fā)社區(qū)對(duì)于Scala技術(shù)的興趣有著顯著的增長,因此我們又回去繼續(xù)開發(fā)Scala插件。這個(gè)項(xiàng)目現(xiàn)在由好幾個(gè)人共同承擔(dān):我,來自JetBrains的Alexander Podkhalyuzin,以及Jason Zaugg——他為這個(gè)項(xiàng)目貢獻(xiàn)了很多。
2. 進(jìn)行IntelliJ插件開發(fā)需要具備哪些知識(shí)?
IntelliJ中用于實(shí)現(xiàn)語言插件的開放API現(xiàn)在已經(jīng)十分豐富,并仍然在不斷地發(fā)展。下面這篇文章雖然有點(diǎn)老,不過很好的介紹了如何在IntelliJ中實(shí)現(xiàn)語言插件:
http://www.jetbrains.com/idea/documentation/idea_5.0.html
還有一些IntelliJ開放API的其他有用信息如下:
http://www.jetbrains.com/idea/documentation/documentation.html
為選定的語言開發(fā)插件通常需要先實(shí)現(xiàn)一個(gè)詞法分析程序(我們這里使用了JFlex)。然后,我們通過遞歸下降分析法實(shí)現(xiàn)一個(gè)解析器。到這個(gè)階段,開發(fā)者已經(jīng)有了一個(gè)我們稱之為程序結(jié)構(gòu)接口(PSI)的東西,它可以實(shí)現(xiàn)簡單的代碼轉(zhuǎn)換,檢查,格式程序,重構(gòu)等功能。通常如果需要更高級(jí)的功能,那么類型推斷和控制流分析的實(shí)現(xiàn)則是必須的。對(duì)此沒有現(xiàn)成的API,因此需要自行尋找最合適的方法來實(shí)現(xiàn)。
3. 能否介紹一下您計(jì)劃讓IntelliJ的Scala插件提供哪些功能?現(xiàn)在都實(shí)現(xiàn)了么?
近期我們計(jì)劃在插件中完全實(shí)現(xiàn)Scala的類型系統(tǒng),這樣就可以實(shí)現(xiàn)高級(jí)的重構(gòu),比如提取方法、閉包、參與者,以及引入結(jié)構(gòu)類型。同時(shí)我們也希望對(duì)Lift web框架提供更好的支持。現(xiàn)在,我們可以在IntelliJ中部署、運(yùn)行并調(diào)試Lift項(xiàng)目,不過我們?cè)诳紤]為項(xiàng)目工件提供更好的導(dǎo)航。在下面有關(guān)插件的維基頁面上介紹了更多計(jì)劃中的功能:
http://www.jetbrains.net/confluence/display/SCA/
4. 插件開發(fā)的主要瓶頸在哪些方面?與其他插件開發(fā)者進(jìn)行交流對(duì)您的進(jìn)程是否有幫助?
大家或許能夠猜到,為IntelliJ開發(fā)任何一個(gè)語言插件的最大問題在于必須要自己實(shí)現(xiàn)一個(gè)解析器以及類型檢查器。這個(gè)做法有利有弊。大多數(shù)情況下我們無法重復(fù)利用一個(gè)現(xiàn)成的編譯器(比如Scala的Eclipse插件和NetBeans插件)。不過與此同時(shí),我們?cè)诖a分析和轉(zhuǎn)換上擁有更大的靈活性。比如說,鑒于IntelliJ支持的所有語言在頂層都共享同一組PSI接口,我們可以簡單的處理不同語言之間的重命名,或者“轉(zhuǎn)移類”重構(gòu)。也就是說,我們提供了自由的Scala/Java/Groovy/Clojure多語言互操作性。
對(duì)于Scala而言,在閱讀Scala語言規(guī)范時(shí)最大的收獲就是其精確的實(shí)現(xiàn)。閱讀Scala編譯器的代碼,與Scala團(tuán)隊(duì)的交流,這些都非常有幫助。有些原本為了IntelliJ插件而實(shí)現(xiàn)的功能后來也加入到了Scala發(fā)行版當(dāng)中,比如scalap類反編譯器。我們迫切的需要分析被編譯的Scala類,因?yàn)樗鼈兪荢cala而不是Java。
5. 您認(rèn)為IntelliJ的Scala插件現(xiàn)在已經(jīng)足夠成熟到投入實(shí)際的開發(fā)中去?開發(fā)者在使用中需要注意哪些問題?
就我們所知,IntelliJ的Scala插件已經(jīng)在大量的應(yīng)用以及項(xiàng)目當(dāng)中被使用。核心Scala團(tuán)隊(duì)也有不少人在使用IntelliJ來開發(fā)Scala編譯器。當(dāng)然,插件本身正是使用Scala實(shí)現(xiàn)的,我們的項(xiàng)目中每天都要用到。另外,Bill Venners開發(fā)的ScalaTest框架也使用Scala插件來實(shí)現(xiàn),而這個(gè)插件也是支持ScalaTest框架的。目前IntelliJ的Scala插件也支持其他一些Scala框架。
當(dāng)然了,我們?nèi)匀粫?huì)遇到很多問題需要修復(fù),如果有任何反饋,請(qǐng)隨時(shí)在我們的論壇和bug跟中上匯報(bào),謝謝!
http://www.jetbrains.net/devnet/community/idea/scala
http://youtrack.jetbrains.net/issues/SCL
6. 您對(duì)于Scala 2.8的正式推出是否期待?
當(dāng)然了!我們已經(jīng)使用Scala 2.8進(jìn)行了好幾個(gè)月的插件開發(fā),而最新的build都配備有最新的Scala 2.8類庫。現(xiàn)在已經(jīng)支持如打包對(duì)象這樣的主要功能,而插件本身現(xiàn)在主要針對(duì)Scala 2.8而非2.7。目前我建議Scala 2.7開發(fā)使用IDEA 8的插件,而使用最新的build在IDEA 9下進(jìn)行Scala 2.8的開發(fā)。
總結(jié)
你希望學(xué)習(xí)Scala么?你想要和其他的Scala學(xué)習(xí)者與開發(fā)者們一起交流么?請(qǐng)持續(xù)關(guān)注51CTO的Scala編程語言專題,并加入Scala中文社區(qū)的Google Group(您也可以訂閱社區(qū)的電子郵件群)進(jìn)行討論。感謝關(guān)注!