我们正在用Java编写一个大型生产系统,我正在考虑是否可以用一种基于JVM的动态语言编写一些组件。从Java互操作性的角度来看,Groovy似乎是最好的选择。但Groovy实现是否足够可靠以便在生产中使用(我会这么认为),并且Groovy语言规范本身是否足够稳定,以便我们不必在一两年内大幅修改我们的生产代码?你有什么经历?
摘要(2009年5月30日):好的评论,我得到的意思是你应该谨慎使用Groovy进行关键任务生产使用,这对于将测试用例放在一起等辅助用法很好,并且有一个中间在哪里它可能很好,但先做你的功课。性能是一个问题,需要与开发人员生产力的提高相平衡。比尔和Ichorus基于Groovy的使用有同样有用的答案,所以这是一个抛硬币。
更新(12/3/09):最近我一直在认真研究另一种JVM语言Scala。它由Martin Odersky设计和实现,他是当前javac编译器的原作者和Java Generics的联合设计者。 Scala是一种强类型,但使用类型推断去除大量的样板。它是面向对象和函数式编程的完美结合。詹姆斯戈斯林likes it。 James Strachan,Groovy的作者,likes it too。而Odersky编写javac的经验意味着Scala的原始performance is not far from Java,这令人印象深刻。
更新(4/26/11):看看Groovy++,一个静态类型的Groovy扩展,其performance等同于Java。看起来很有趣。
答案 0 :(得分:20)
编辑:差不多四年后,Groovy变得更加稳固了。
我可以全心全意地推荐它用于生产级项目。
我一直在使用Groovy支持生产应用程序一段时间,为此目的它足够稳定。至于在真正的生产代码中实际拥有Groovy;我不认为我会这样做。 Groovy做了太多令人惊讶的事情。在过去一年左右的时间里,它在这方面已经变得更好了,但是每隔一段时间我就会遇到一个由于生成的代码而难以追踪的错误(我的问题似乎围绕着范围界定)。
我已经离开了Groovy(虽然我们使用的东西很简单而且仍然可靠)并且使用了Python(jython实现),这在我看来更加可预测。此外,python在可读性方面胜过Groovy。
你可以在Groovy中编写一些非常有趣的代码,包括闭包和运算符重载等等。
这些语言用于方便和加快辅助代码...如果需要可以即时切换的东西。它们都没有投入生产。我不认为我会把它们投入生产,除非它是一个权宜之计,以便在一个重要的时候把一些关键的东西拿出门外,或作为一个概念或原型的证明。
在将它放入实际生产的情况下,它必须处于最严峻的环境中,我会指派某人在纯Java中为下一个版本重写它。我98%肯定生产中的任何一个都可以,但是2%的风险太大了。
答案 1 :(得分:17)
我们在Grails上运行了几个生产应用程序(使用Groovy作为语言)。到目前为止,没有出现任何问题。至于JVM兼容性,请看看过去5年中JVM字节码的变化有多少......就像添加了1条指令一样,并且没有任何一条指令过时。
新版本的Groovy明年会问世吗?是。你会被要求改变吗?不,虽然你可能想要,1.6是一个巨大的速度提升。
这给我们带来了Groovy的主要缺点,即速度问题。显然,Groovy比直接Java慢。某些操作的当前数字最多可达10 TIMES 。那就是说,你的CPU是你应用程序的瓶颈吗?对我们来说,主要是数据库访问和延迟。如果它对你来说是一样的,那么如果CPU花费200ms来处理页面请求而不是35ms呢?
这是Groovy唯一的问题吗?不。动态语言具有重构困难,因为代码中的任何地方都不一定有完整的类规范。但是,这部分地通过较小的代码大小来平衡,这使得更容易找到修改代码的位置。
无论如何,Groovy是一种非常适合生产用途的语言。如果您担心可靠性,请将它与Java混合用于“关键”代码。这是Groovy的最佳部分......它与Java类的混合程度是多么容易。
答案 2 :(得分:4)
脚本语言在语法特征方面发展得“过快”。
如果您希望JVM的语言保持兼容
多年,
Java 是您唯一的选择;)
顺便说一句,我认为代码的可读性不是 由脚本语言自动确保。
答案 3 :(得分:4)
我目前正在探索使用Groovy来编写单元测试。这具有
的效果当然,我们还没有开始,但这至少是我试图将新的JVM语言引入我们的新项目(可能还有现有项目)的方式。我有同样的顾虑,甚至更多关于性能而不是稳定性。
答案 4 :(得分:1)
我们使用Grails / Groovy作为我以前公司的主要后端,根据这一经验,我会说在大多数情况下我会选择Groovy而不是Java,因为它可以无缝地与Java互操作,否则更有趣和富有表现力。另外我希望数据库几乎总是我应用程序的瓶颈而不是语言性能,而且据我所知,我们没有遇到任何与groovy有关的稳定性问题/错误。
但就个人而言,在大多数情况下,通常不是关于Groovy vs Java的问题 - 它是关于Groovy / Java +可用库与其他语言(如Python / Jython / JavaScript / Ruby +可用库)。还有很多其他考虑因素,例如社区的力量,特定应用的相关技术的成熟度等等。特别是对于Web开发,Grails很不错,但社区似乎缺乏。我的总体看法是我将使用python或Node.js。如果我需要JVM,我将使用兼容jython的python web开发环境。
答案 5 :(得分:1)
我和Groovy玩了一个月左右。简单性很棒,动态语言功能也非常酷。然而,速度肯定是一个问题。此外,groovy控制台真的很糟糕。你不能做你可以做的事情,例如在python中。每隔一段时间我就必须重新启动控制台,重新导入,等等。它还会在控制台模式下忘记我放入变量的值;不知怎的,神秘地他们超出了范围。 (是不是因为JVM?我不知道。)我无法从头脑中得出一个例子,但我在Groovy控制台中获得的行为与我在Grails控制台中获得的行为不同,并且与我在脚本中编写代码所获得的不同。
还有一些警告。请注意,Groovy几乎与Java不兼容,但不是100%兼容。例如,这不会编译:
public class HelloWorld {
public static void main(String args[]) {
System.out.println( "Hello, world!\n");
}
}