Python VS. ruby的元程序化

我目前主要是一个D程序员,我正在寻找添加另一种语言到我的工具箱,最好是一个支持元编程的黑客,只是不能用像D这样的静态编译语言来完成。我已经读了一下Lisp我很想find一种允许Lisp做的很酷的语言,但是没有Lisp的奇怪语法等等。 我不想开始一场语言的火焰战争,我确信Ruby和Python都有他们的权衡,所以我会列出对我个人来说重要的东西。 请告诉我,Ruby,Python还是其他一些语言对我来说最好。

重要:

  1. 好的元编程。 能够在运行时创build类,方法,函数等。 优选地,代码和数据之间的最小区分,Lisp样式。
  2. 干净,清晰,语法清晰,一致,直观的语义。 基本上是一个深思熟虑,有趣的使用,现代语言。
  3. 多种范例。 对于每个项目,甚至项目中的每一个小的子问题,没有一个范例是正确的。
  4. 一种有趣的语言,实际上影响了人们对编程的思考方式。

有一些重要:

  1. 性能。 如果performance不错,但是如果performance真的是优先考虑的话,我会用D代替。
  2. 充分certificate。

不重要:

  1. 社区大小,图书馆的可用性等。这些都不是语言本身的特点,而且都可以很快改变。
  2. 工作可用性。 我不是一个全职的专业程序员。 我是一名研究生,编程与我的研究是切线相关的。
  3. 任何主要由非常大的项目devise的function都是由百万条代码猴子来完成的。

至less在意识形态层面上,python和ruby之间并没有太大的区别。 大多数情况下,他们只是同一件事的不同口味。 因此,我会build议看看哪一个匹配你的编程风格更多。

我已经阅读了一下Lisp,我很想find一种允许Lisp做的很酷的语言,但是没有Lisp的奇怪语法等等。

我们不会全部。

代码和数据之间的最小区别,Lisp风格

可悲的是,代码和数据与“奇怪”语法的最小区别是彼此的后果。

如果你想要易于阅读的语法,你有Python。 但是,代码并不是在任何常用的内置数据结构中表示的。 在“重要”列表的项目#1中,它像大多数语言一样失败。 这使得很难提供有用的帮助。

你不能拥有一切。 记住,你不是第一个有这个想法的人。 如果你的理想语言存在,我们都会使用它。 由于现实世界不符合你的理想,你将不得不重新排列你的愿望清单。 “重要”部分必须重新排列,以确定对你来说真正重要的东西。

诚实地说,就元编程设施而言,Ruby和Python比他们的一些赞同者更愿意承认。 这两种语言的审查提供了一个很好的比较/审查:

所以,只要根据一些标准select一个。 也许你喜欢Rails,并想研究该代码。 也许SciPy是你的事情。 看看图书馆,社区等的生态系统,挑选一个。 基于你的select,你绝对不会失去一些元编程的必杀技。

免责声明:我只涉及任何一种语言,但至less我写了两个工作程序(不仅仅是快速脚本,我使用Perl,bash或GNU make)。

Ruby对于“多范式”来说非常好,因为它很难使创build领域特定的语言变得容易。 例如,在线浏览并查看几个Ruby on Rails代码和几个Rake代码。 他们都是ruby,你可以看到相似之处,但他们看起来不像你通常认为的相同的语言。

Python在我看来似乎更具可预测性(可能与“干净”和“理智”点2相关),但我不确定这是由于语言本身,还是由于具有不同值的人通常使用。 我从来没有尝试Python的深奥的魔力。 我当然会说这两种语言都经过深思熟虑。

两者在1分和4分都很好。[编辑:实际上1是相当有争议性的 – 在解释性语言中常见的是“eval”,但它们在概念上并不纯正。 您可以定义闭包,将对象分配给对象,以及不需要的东西。 不知道这是否你想要的。]

就我个人而言,我发现Ruby更有趣,但部分原因是因为分散思考冷静的方式来做事情更容易。 我实际上使用Python更多。 有时候你不想要冷静,所以你想继续睡觉,这样睡觉前就完成了。

他们两个都很难进入,所以你可以决定在你的下一个小任务中,一个在另一个之后。 或者从图书馆里拿出一本介绍性的书,仔细阅读它们,看看是什么吸引了你。

你考虑过Smalltalk吗? 它提供了一个非常简单,清晰和可扩展的语法,具有reflection和内省function以及利用这些function的完全集成的开发环境。 例如,看看Squeak Smalltalk 所做的一些工作 。 许多使用Squeak的研究人员都在Squeak邮件列表中出现 ,并且在freenode上发出#squeak,所以您可以非常轻松地获得有关复杂问题的帮助。

当前相关性的其他指标:它可以运行在任何你喜欢命名的平台(包括iPhone )上; 吉拉德·布拉恰(Gilad Bracha)将他的“新闻”(Newspeak) V8团队在Smalltalk虚拟机上切齿; 丹·英格尔斯(Dan Ingalls)和兰德尔·施瓦茨(Randal Schwartz)最近在旷野中回到了Smalltalk工作。

祝你好运 – 让我们知道你最终决定什么。

Lisp满足你所有的标准,包括性能,而且它是唯一没有(奇怪)语法的语言。 如果你在这样一个令人吃惊的错误信息/错误的基础上避开它,结果错过了使用例如Emacs + SLIME + CL的经验,那么你将会对自己造成很大的伤害。

你在描述Ruby。

  • 好的元编程。 能够在运行时创build类,方法,函数等。 优选地,代码和数据之间的最小区分,Lisp样式。

在运行时扩展修改现有的原语是非常容易的。 在ruby中,一切都是一个对象,string,整数,甚至函数。

您也可以构造语法糖的快捷方式,例如class_eval 。

  • 清晰,清晰,清晰的语法和一致,直观的语义。 基本上是一个深思熟虑,有趣的使用,现代语言。

Ruby遵循的是less一些意外的原则,比较Ruby代码和其他语言的代码时,许多人认为它更“美丽”。

  • 多种范例。 对于每个项目,甚至项目中的每一个小的子问题,没有一个范例是正确的。

你可以遵循命令,面向对象,function和反思。

  • 一种有趣的语言,实际上影响了人们对编程的思考方式。

这是非常主观的,但从我的观点来看,同时使用多种范式的能力允许非常有趣的想法。

我试过Python,它不符合你的要点。

你的4个“重要”点正确地导致了Ruby,而Python规定了2个“重要”点。 就这样吧。

比较不同语言(语言按逆序字母顺序排列)执行相同操作的代码示例 (与myList列表中的项目的换行符非空描述结合):

ruby

 myList.collect { |f| f.description }.select { |d| d != "" }.join("\n") 

要么

 myList.map(&:description).reject(&:empty?).join("\n") 

Python

 descriptions = (f.description() for f in mylist) "\n".join(filter(len, descriptions)) 

要么

 "\n".join(f.description() for f in mylist if f.description()) 

Perl

 join "\n", grep { $_ } map { $_->description } @myList; 

要么

 join "\n", grep /./, map { $_->description } @myList; 

Javascript

 myList.map(function(e) e.description()) .filter(function(e) e).join("\n") 

Io

 myList collect(description) select(!="") join("\n") 

这是一个Io指南 。

在“主stream”方面,Ruby比Lisp更好(不pipe是什么意思,但是一个现实的问题是,如果你愿意的话可以find关于Lisp编程的问题的答案)。在任何情况下,我发现Ruby很容易拾起。 在我第一次学习Python(或其他语言)的时间相同的情况下,我很快就比以前更有效地编写了更好的代码。 这只是一个人的意见, 我猜,我可以吃一点盐。 在这一点上,我比Ruby或Lisp更了解Ruby,但在切换之前,您应该知道我是一个Python人员。

Lisp绝对是相当酷的,值得研究; 正如你所说,社区的规模可以很快改变。 这就是说,规模本身并不像社区的质量那么重要。 例如, #ruby-lang频道仍然充满了一些令人难以置信的聪明人。 Lisp似乎也吸引了一些非常聪明的人。 我不能说太多的Python社区,因为我没有太多的第一手经验,但是有时候它似乎“太大”了。 (我记得有人对他们的IRC频道非常粗鲁,而且从我听到的那些真正进入Python的朋友那里听来,这似乎是规则而不是例外)。

无论如何,你可能会发现一些有用的资源是:

1)语用程序员Ruby Metaprogramming系列( http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming ) – 不是免费的,但后来的情节是相当有趣的。 (代码是免费的,如果你想下载,看看你会学到什么。)

2)关于Lisp by Paul Graham( http://www.paulgraham.com/onlisp.html )。 这是一个有点老,但它是一个经典(可免费下载)。

我在很多项目中使用Python,我认为Python确实提供了您所要求的所有function。

重要:

  1. 元编程:Python支持元类和运行时类/方法生成等
  2. 语法:那么多less有点主观。 我喜欢Pythons的语法,但是有些人抱怨Python对空白敏感。
  3. 范例:Python支持程序,面向对象和基本的函数式编程。
  4. 我认为Python有一个非常实用的风格,对我来说非常鼓舞人心。

有一些重要:

  1. 性能:那么它是一种脚本语言。 但是为Python编写C扩展是一个常见的优化实践。
  2. 文档:我不能抱怨。 它不像Java有人可能知道的那样详细,但它足够好。

由于你是研究生,你可能想读这篇文章,声称Python是一个科学家的需要 。 不幸的是我无法比较Python和Ruby,因为我从来没有使用过这种语言。

问候,丹尼斯

@Jason我分别不同意。 有些差异使得Ruby在元编程方面优于Python – 既有哲学也有实用性。 对于初学者来说, Ruby通过单inheritance和混合来获得inheritance权 。 当涉及元编程时,你只需要明白这一切都是关于自我的 。 这里规范的区别是,在Ruby中,你可以在运行时访问自己的对象 – 在Python中你不需要!

与Python不同,在Ruby中没有单独的编译或运行时阶段。 在Ruby中,每行代码都是针对特定的自我对象执行的。 在Ruby中,每个类都从对象和隐藏的元类inheritance。 这使得一些有趣的dynamic:

 class Ninja def rank puts "Orange Clan" end self.name #=> "Ninja" end 

使用self.name访问忍者类的元类名称方法返回忍者的类名称。 在Python中元编程花是如此美丽吗? 我真诚地怀疑它!

那么,如果你不喜欢lisp语法,那么汇编程序就是要走的路。 🙂

代码和数据之间的区别当然是最小的,是多范式的(或者也许这不是范式),它是一种扩展(如果单调乏味的话)在学习和技巧方面的经验。

Io满足您所有的“重要”要点。 我不认为有一个更好的语言做疯狂的元骇客。

一个支持元编程黑客, 不能用静态编译的语言来完成

我很想find一种允许Lisp做的一些很酷的东西的语言

Lisp可以编译。

你试过Rebol吗?

我的答案是既不。 我认识这两种语言,在Ruby上学了一门课,并在Python中编程了好几年。 Lisp擅长元编程,因为它的唯一目的是转换列表,它自己的源代码只是一个令牌列表,所以元编程是很自然的。 我最喜欢这种types的三种语言是Rebol,Forth和Factor。 Rebol是一种非常强大的方言语言,它从inputstream中提取代码,运行一个expression式,并使用用该语言编写的规则进行转换。 非常有performance力,在方言上非常好。 因素和Forth或多或less完全脱离了语法,并通过定义和调用单词来编程。 他们通常主要是用自己的语言写的。 您不会以传统意义编写应用程序,您可以通过编写自己的单词来定义特定的应用程序来扩展语言。 因为它有许多我只在Smalltalk中看到的用于评估和处理源代码的function,所以它可以特别好。 一个非常好的工作区,交互式文档等

分离Python和Ruby并没有太多的东西。 我会说Python社区比Ruby社区更大更成熟,这对我来说非常重要。 Ruby是一种更为灵活的语言,具有积极和消极的影响。 不过,我相信会有很多人对这两种语言进行详细的介绍,所以我会把第三个选项放到环中。 JavaScript怎么样?

JavaScript最初被devise为Web的Scheme,它是基于原型的,就多范式和元编程而言,它比Python和Ruby更有优势。 语法并不像其他两种语言那么好,但它可能是现有最广泛使用的语言,性能每天都在变好。

如果你喜欢Lisp风格的代码是数据的概念,但不喜欢Lispy语法,也许Prolog将是一个不错的select。

无论是否有资格使用“现代语言”,我都会留给别人去评判。 😉

在探索Python,Smalltalk和Ruby之后,Ruby是我的select。

那么OCaml呢?

OCaml的特点:静态types系统,types推断,参数多态,尾recursion,模式匹配,一级词法闭包,函子(参数模块),exception处理和增量分代自动垃圾收集。

我认为它满足以下几点:

重要:

  1. 干净,清晰,语法清晰,一致,直观的语义。 基本上是一个深思熟虑,有趣的使用,现代语言。
  2. 多种范例。 对于每个项目,甚至项目中的每一个小的子问题,没有一个范例是正确的。
  3. 一种有趣的语言,实际上影响了人们对编程的思考方式。

有一些重要:

  1. 性能。 如果performance不错,但是如果performance真的是优先考虑的话,我会用D代替。
  2. 充分certificate。

我已经使用了Python,但更多的Ruby。 不过,我认为他们都提供你所要求的。

如果我看到你所有的四点,那么你至less可以检查: http : //www.iolanguage.com/

而莫扎特/奥兹也可能对你有意思: http : //mozart.github.io/

问候弗里德里希

对于python风格的语法和类似lisp的macros(macros是真正的代码)和良好的DSL看到收敛 。

我不确定Python是否能满足你所​​期望的所有事情(特别是关于代码和数据之间最小区分的观点),但有一个支持Python的论点。 在那里有一个项目,它可以让你在D中编写Python扩展,所以你可以拥有两全其美。 http://pyd.dsource.org/celerid.html

我会build议你去与Ruby。

当我第一次开始学习的时候,发现真的很容易接受。

不要把Ruby编程语言和Ruby实现混合在一起,认为POSIX线程在ruby中是不可能的。

你可以简单地用pthread支持进行编译,如果你原谅了这个双关语,那么在创build这个线程的时候这已经是可能的了 。

这个问题的答案很简单。 如果你喜欢lisp,你可能会喜欢ruby。 或者,无论你喜欢什么。

我build议你尝试两种语言,select一个吸引你的语言。 Python和Ruby都可以做你想做的事情。

也读这个线程 。

如果你爱玫瑰,你必须学会​​与荆棘一起生活:)

去与JS只是检查AJS(替代JavaScript语法)在我的github http://github.com/visionmedia它会给你一些更干净的封闭等等:D

关于你的主要问题(元编程):Groovy 1.6版本已经将AST(抽象语法树)编程作为标准和集成的特性进行内置。 Ruby有RubyParser,但它是一个附加组件。