在Google App Engine上选择Java还是Python
目前,Google App Engine 支持 Python 和 Java 两种语言。Java 的支持还不够成熟。不过,Java 似乎有更多的库可用,特别是它对 Java 字节码的支持,不管用什么语言写的代码都可以用。到底哪种语言性能更好,功能更强大呢?请给点建议。谢谢!
补充: http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine?pli=1
补充: 我所说的“功能强大”是指更好的扩展性和可以使用框架外的库。虽然 Python 只允许使用纯 Python 的库。
16 个回答
根据我在其他平台上运行这些虚拟机的经验,我觉得Java的性能可能会比Python更强。不过,别小看Python的优点:Python的代码量通常要少得多,大家普遍认为,写一个和Java功能相同的程序,Python只需要三分之一的代码,而且可读性也一样好,甚至更好。这个优势还体现在Python可以直接运行代码,不需要像Java那样先编译。
关于可用的库,你会发现Python的运行库大部分可以直接使用(Java的也是如此)。流行的Django网页框架(http://www.djangoproject.com/)在AppEngine上也得到了支持。
至于“能力”,这有点难说,不过Python在很多领域都有应用,尤其是在网络方面:比如YouTube就是用Python写的,Sourceforge也是(截至上周)。
关注这个应用程序,看看Python和Java的性能变化:
http://gaejava.appspot.com/(补充说明:抱歉,这个链接现在坏掉了。不过我最后看到它运行时,下面的内容仍然适用)
目前,在这个简单的测试中,Python和Java的低级API比Java的JDO要快。至少如果底层引擎发生变化,这个应用应该能反映出性能的变化。
我个人有点偏见(因为我是Python专家,但Java有点生疏),我觉得GAE的Python运行环境目前比Java的更先进、更成熟,毕竟前者多了一年的发展时间。
未来的发展方向当然很难预测——Java那边的需求可能更强(尤其是因为不仅仅是Java,还有其他基于JVM的语言,比如说可以在App Engine上运行PHP或Ruby代码);不过,Python App Engine团队有一个优势,就是他们有Guido van Rossum,Python的发明者,他是个非常厉害的工程师。
在灵活性方面,正如之前提到的,Java引擎可以运行不同语言编写的JVM字节码,而不仅仅是Java——如果你的工作环境是多语言的,这可是个很大的好处。反过来,如果你讨厌JavaScript,但又必须在用户的浏览器中执行一些代码,Java的GWT(可以从你的Java代码生成JavaScript)比Python的替代方案要丰富和先进得多(实际上,如果你选择Python,你可能需要自己写一些JS,而如果你选择Java,GWT是个不错的选择,特别是如果你不想写JS的话)。
在库的使用上,差不多是个平局——JVM的限制(没有线程、没有自定义类加载器、没有JNI、没有关系型数据库)让现有Java库的简单复用受到影响,和Python库受到的限制差不多。
在性能方面,我觉得也是个平局,不过你应该根据自己的任务进行基准测试——不要只依赖那些高度优化的JIT JVM实现的性能,因为它们的启动时间和内存占用都很大,而应用引擎的环境是非常不同的(启动成本会经常出现,因为你的应用实例会被启动、停止、移动到不同的主机等,这些对你来说都是透明的——这些事件在Python运行环境中通常要比在JVM中便宜得多)。
关于XPath/XSLT的情况(说得委婉一点……)在两边都不是特别完美,唉,不过我觉得在JVM那边可能稍微好一点(显然,经过一些处理,Saxon的部分子集可以运行)。我觉得在Appengine Issues页面上提一些关于XPath和XSLT的问题是值得的——现在那儿只有请求特定库的问题,这样的视野太狭隘了:我并不在乎一个好的XPath/XSLT是如何实现的,无论是Python还是Java,只要我能用就行。(特定库可能会让现有代码的迁移更容易,但能以某种方式“快速应用XSLT转换”更重要!)我知道如果这个问题表述得好(尤其是以一种不依赖语言的方式),我一定会支持它。
最后但同样重要的是:记住你可以有不同版本的应用(使用同一个数据存储),其中一些是用Python运行的,有些是用Java运行的,你可以通过明确的URL访问不同于“默认/活动”版本的版本。所以你可以让Python 和 Java代码(在应用的不同版本中)使用和修改同一个数据存储,这样给你带来了更多的灵活性(不过只有一个版本会有“好听”的URL,比如foobar.appspot.com——这可能对通过浏览器访问的互动用户来说比较重要,我想;-)。