考虑到下面列出的标准,您会使用 Python、Groovy 还是 Ruby 中的哪一个?
- 标准(10 项中的重要性,10 项最重要)
- 丰富的 API/库可用(例如数学、绘图、网络)(9)
- 能够嵌入桌面 (java/c++) 应用程序 (8)
- 易于部署 (8)
- 能够与 DLL/共享库交互 (7)
- 生成 GUI 的能力 (7)
- 社区/用户支持 (6)
- 便携性 (6)
- 数据库操作 (3)
- 语言/语义 (2)
我认为很难进行客观的比较。我个人更喜欢 Python。为了满足您的一个标准,Python 从一开始就被设计为一种可嵌入的语言。它有一个非常丰富的 C API,并且解释器是模块化的,可以很容易地从 C 调用。如果你的宿主环境是 Java,你应该看看 Jython,它是 Java 环境(VM 和库)内的 Python 实现。
在与他们三个人一起工作之后,这就是我可以说的:
Python
红宝石
时髦的
只是为了搅浑水...
Groovy 让您可以访问 Java。Java 有一组极其丰富的 API/库、应用程序等。
Groovy 是可嵌入的,尽管在 Java 中最简单。
DLL/库(如果您谈论的是非 Groovy/Java)可能会有些问题,尽管有一些方法和一些 API 可以提供帮助。
我做过一些 Python 编程,但由于更熟悉 Java,Groovy 对我来说更容易。
时髦?我只是把它捡起来;试试这个(在 groovyconsole 里面):
File.metaClass.invokeMethod = { String name, args ->
System.out.print ("Call to $name intercepted...");
File.metaClass.getMetaMethod(name, args).invoke(delegate, args);
}
new File("c:/temp").eachFile{
if (it.isFile()) println it.canonicalPath
}
第一个代码是 AOP。对 File 对象的任何方法的所有调用都将被拦截。不需要额外的工具。这是针对现有的 Java 类动态执行的。
在第二个块中,您删除了 'f' 闭包参数。作为一个参数,它默认为闭包上下文可用的内置“it”变量。
这是你得到的:
“调用 isFile 被截获...C:\temp\img.jpg”
等等
试试 Groovy .. 它有你需要的所有功能。您可以使用现有的 java lib 而不对其类进行任何修改。基本上 .. groovy 是 java++,学习起来更加动态和有趣(就像 ruby 一样)
我不喜欢 ruby 或 python 语法,所以我会把它们放在后面。Groovy 就像 C/C++ 语法,所以我喜欢他,哈哈 :)
Python 具有所有九个标准。它得分为56。
我确信 Ruby 拥有 Python 所拥有的一切。它似乎有更少的图书馆。所以它得分为51。
我不知道 Groovy 是否具备所有功能。
由于 Python 是 56,而 Ruby 是 51,Python 只是勉强超越了 Ruby。
但是,我认为这种决定仍然可以归结为这九个标准之外的一些主观问题。
根据您的标准,我会选择 JRuby:
JVM可以访问的所有东西,很多
优秀的 Monkeybars框架,可让您在 GUI 设计器中设计一个摆动 GUI,然后使用干净的 ruby 代码将其连接起来
Rawr可以将您的应用程序打包为可执行 jar
Java 轻松共享库,C 共享库通过jna + libffi
摇摆只是工作。不确定使用 QtJambi 有多容易,但绝对有可能。
很多。Ruby 有一个优秀的社区。
JVM 工作的任何地方
所有的 ruby 数据库和所有的 java数据库
这就是 ruby 明显领先于 groovy 和 python 的地方。该语言在早期做出了一些非常漂亮的设计决策,这体现在标准库的一致性和强大功能上。尤其是Blocks,使用起来很有趣。
这种按功能加分的方式并不是选择编程语言的好方法。你最好选择你最了解的那个。如果您不认识其中任何一个,请尝试一段时间。如果您有一个非常具体的项目,那么也许某些编程语言会更好,但如果您只是有一般偏好,您将永远无法达成共识。
也就是说,Python 非常灵活,它是您列表中最受欢迎的,因此最容易通过搜索解决您遇到的任何类型的问题,所以我推荐 Python。
珀尔?哎呀。
正如有人观察到的那样,Perl 就像标点符号工厂的大爆炸。如果生成的代码不是自我记录的,那么简洁不是优势。
已经使用 Groovy 完成了一些实用任务,很容易上手。完全访问 Java 库,以及一些很酷的附加功能,例如使用闭包列出目录中的文件:
// process all files printing out full name (. and .. auto excluded)
new File(basedir).eachFile{ f->
if (f.isFile()) println f.canonicalPath
}
我知道它不在你的清单上,但至少看看 perl。