IntelliJ的Scala插件开发者,Ilya Sergey
最开始,IntelliJ的Scala插件完全是一个实验性项目。最初提出这个设想的人是Eugene Vigdorchik,而当时的挑战则是为另外一个非Java语言的基于JVM的语言提供一个成熟的插件。我们从2006年开始开发,当时的Scala版本是2.1.8。当时同时开始开发的还有Ruby插件,这个差距在两年后成为了一个名为RubyMine的独立Ruby IDE。在这个Scala插件开始开发的七个月之后,曾经因为商业原因中断过,而我们则转而投向Groovy IntelliJ插件的开发。不过到了2007年底,开发社区对于Scala技术的兴趣有着显著的增长,因此我们又回去继续开发Scala插件。这个项目现在由好几个人共同承担:我,来自JetBrains的Alexander Podkhalyuzin,以及Jason Zaugg——他为这个项目贡献了很多。
2. 进行IntelliJ插件开发需要具备哪些知识?
IntelliJ中用于实现语言插件的开放API现在已经十分丰富,并仍然在不断地发展。下面这篇文章虽然有点老,不过很好的介绍了如何在IntelliJ中实现语言插件:
http://www.jetbrains.com/idea/documentation/idea_5.0.html
还有一些IntelliJ开放API的其他有用信息如下:
http://www.jetbrains.com/idea/documentation/documentation.html
为选定的语言开发插件通常需要先实现一个词法分析程序(我们这里使用了JFlex)。然后,我们通过递归下降分析法实现一个解析器。到这个阶段,开发者已经有了一个我们称之为程序结构接口(PSI)的东西,它可以实现简单的代码转换,检查,格式程序,重构等功能。通常如果需要更高级的功能,那么类型推断和控制流分析的实现则是必须的。对此没有现成的API,因此需要自行寻找最合适的方法来实现。
3. 能否介绍一下您计划让IntelliJ的Scala插件提供哪些功能?现在都实现了么?
近期我们计划在插件中完全实现Scala的类型系统,这样就可以实现高级的重构,比如提取方法、闭包、参与者,以及引入结构类型。同时我们也希望对Lift web框架提供更好的支持。现在,我们可以在IntelliJ中部署、运行并调试Lift项目,不过我们在考虑为项目工件提供更好的导航。在下面有关插件的维基页面上介绍了更多计划中的功能:
http://www.jetbrains.net/confluence/display/SCA/
4. 插件开发的主要瓶颈在哪些方面?与其他插件开发者进行交流对您的进程是否有帮助?
大家或许能够猜到,为IntelliJ开发任何一个语言插件的最大问题在于必须要自己实现一个解析器以及类型检查器。这个做法有利有弊。大多数情况下我们无法重复利用一个现成的编译器(比如Scala的Eclipse插件和NetBeans插件)。不过与此同时,我们在代码分析和转换上拥有更大的灵活性。比如说,鉴于IntelliJ支持的所有语言在顶层都共享同一组PSI接口,我们可以简单的处理不同语言之间的重命名,或者“转移类”重构。也就是说,我们提供了自由的Scala/Java/Groovy/Clojure多语言互操作性。
对于Scala而言,在阅读Scala语言规范时最大的收获就是其精确的实现。阅读Scala编译器的代码,与Scala团队的交流,这些都非常有帮助。有些原本为了IntelliJ插件而实现的功能后来也加入到了Scala发行版当中,比如scalap类反编译器。我们迫切的需要分析被编译的Scala类,因为它们是Scala而不是Java。
5. 您认为IntelliJ的Scala插件现在已经足够成熟到投入实际的开发中去?开发者在使用中需要注意哪些问题?
就我们所知,IntelliJ的Scala插件已经在大量的应用以及项目当中被使用。核心Scala团队也有不少人在使用IntelliJ来开发Scala编译器。当然,插件本身正是使用Scala实现的,我们的项目中每天都要用到。另外,Bill Venners开发的ScalaTest框架也使用Scala插件来实现,而这个插件也是支持ScalaTest框架的。目前IntelliJ的Scala插件也支持其他一些Scala框架。
当然了,我们仍然会遇到很多问题需要修复,如果有任何反馈,请随时在我们的论坛和bug跟中上汇报,谢谢!
http://www.jetbrains.net/devnet/community/idea/scala
http://youtrack.jetbrains.net/issues/SCL
6. 您对于Scala 2.8的正式推出是否期待?
当然了!我们已经使用Scala 2.8进行了好几个月的插件开发,而最新的build都配备有最新的Scala 2.8类库。现在已经支持如打包对象这样的主要功能,而插件本身现在主要针对Scala 2.8而非2.7。目前我建议Scala 2.7开发使用IDEA 8的插件,而使用最新的build在IDEA 9下进行Scala 2.8的开发。
总结
你希望学习Scala么?你想要和其他的Scala学习者与开发者们一起交流么?请持续关注51CTO的Scala编程语言专题,并加入Scala中文社区的Google Group(您也可以订阅社区的电子邮件群)进行讨论。感谢关注!
| 第 1 页:Scala插件情况概述 | 第 2 页:Eclipse Scala插件的情况 |
| 第 3 页:NetBeans Scala插件的情况 | 第 4 页:IntelliJ Scala插件的情况 |






















