用于元编程的 Python 与 Ruby [关闭]
Posted
技术标签:
【中文标题】用于元编程的 Python 与 Ruby [关闭]【英文标题】:Python vs. Ruby for metaprogramming [closed] 【发布时间】:2010-09-13 18:22:59 【问题描述】:我目前主要是一名D 程序员,并希望将另一种语言添加到我的工具箱中,最好是支持元编程黑客的语言,而这种黑客技术无法在像 D 这样的静态编译语言中完成。
我已经阅读了一点 Lisp,我很想找到一种语言,它允许 Lisp 所做的一些很酷的事情,但没有 Lisp 的奇怪语法等。我不想引发一场语言之战,而且我确信 Ruby 和 Python 都有各自的取舍,所以我将列出对我个人而言重要的内容。请告诉我 Ruby、Python 或其他语言是否最适合我。
重要:
-
良好的元编程。能够在运行时创建类、方法、函数等。最好是代码和数据之间的最小区别,Lisp 风格。
漂亮、干净、理智的语法和一致、直观的语义。基本上是一种经过深思熟虑、使用起来很有趣的现代语言。
多个范例。没有一种范式适用于每个项目,甚至是项目中的每个小子问题。
一种有趣的语言,它实际上会影响人们对编程的看法。
有些重要:
-
性能。如果性能不错就好了,但是当性能是真正的优先事项时,我会改用 D。
有据可查。
不重要:
-
社区规模、图书馆可用性等。这些都不是语言本身的特征,而且都可以很快改变。
职位空缺。我不是一个全职的专业程序员。我是一名研究生,编程与我的研究密切相关。
主要针对由一百万个代码猿完成的大型项目设计的任何功能。
【问题讨论】:
+1 对于一个普遍问得很好的问题。 可悲的是,高评价的答案基本上都说“这取决于”,而较低的答案基本上是 Python 与 Ruby 的火焰之战。 你考虑过 Clojure 吗? 答案是Julia!那时它还不存在:bit.ly/julia_meta ...高兴! Julia 涵盖了 @dsimcha 列出的所有重要点,加上 性能,随着 Julia 不断成熟,所有其他点都变得真实。 【参考方案1】:我用过 Python,但更多的是 Ruby。但是,我认为它们都提供了您所要求的。
如果我看到你所有的四点,那么你至少可以检查一下: http://www.iolanguage.com/
Mozart/Oz 对您来说可能也很有趣: http://mozart.github.io/
问候 弗里德里希
【讨论】:
【参考方案2】:我对 Lisp 进行了一些阅读,我很想找到一种语言,它允许 Lisp 所做的一些很酷的事情,但没有 Lisp 的奇怪语法等。
我们都不会。
代码和数据之间的最小区别,Lisp 风格
可悲的是,代码和数据之间的最小区别以及“奇怪”的语法是彼此的结果。
如果您想要易于阅读的语法,那么您有 Python。但是,代码没有在任何常用的内置数据结构中表示。它失败了——就像大多数语言一样——在你的“重要”列表的第 1 项中。这使得提供有用的帮助变得困难。
你不能拥有一切。请记住,您不是第一个有这种想法的人。如果存在类似您理想语言的东西,我们都会使用它。由于现实世界达不到您的理想,您将不得不重新确定您的愿望清单的优先级。 “重要”部分必须重新排列,以识别对您而言真正重要的内容。
【讨论】:
我发现许多语言在非 Lispy 语法中实现了类似 Lisp 的宏,结果是在那里编写宏非常困难,因为没有人自然知道代码所在的数据结构表示,因此编写宏变得太难了,没有人这样做。 人们发现 Lisp 很难阅读,因为他们不熟悉语法。我发现 Lisp 比 C# 更容易阅读(但比 Python 难)。 我在很大程度上同意这一点,但我对 Ruby 和 Lisp 的经验表明,前者对于元编程和 没有括号一样好。其他接近的替代品可能是 TCL 和 javascript,但出于其他原因我不赞成它们。 Long long agi 有一种语言叫 Dylan,应该就是这样。【参考方案3】:不要将 Ruby 编程语言与 Ruby 实现混合,认为 POSIX 线程在 ruby 中是不可能的。
如果您原谅双关语,您可以简单地使用 pthread 支持和this was already possible at the time this thread was created 进行编译。
这个问题的答案很简单。如果你喜欢 lisp,你可能会更喜欢 ruby。或者,随便你。
【讨论】:
【参考方案4】:我的答案是两者都不是。我知道这两种语言,上过关于 Ruby 的课程,并且已经用 python 编程了好几年。 Lisp 擅长元编程,因为它的唯一目的是转换列表,它自己的源代码只是一个标记列表,所以元编程是自然的。对于这类事情,我最喜欢的三种语言是 Rebol、Forth 和 Factor。 Rebol 是一种非常强大的方言语言,它从其输入流中获取代码,针对它运行一个表达式并使用用该语言编写的规则对其进行转换。非常有表现力,非常擅长方言。 Factor 和 Forth 或多或少完全脱离了语法,您可以通过定义和调用单词来对它们进行编程。它们通常大部分是用他们自己的语言编写的。您不是在传统意义上编写应用程序,而是通过编写自己的文字来定义您的特定应用程序来扩展语言。 Factor 可能特别好,因为它具有许多我只在 smalltalk 中看到的用于评估和使用源代码的功能。一个非常好的工作区、交互式文档等。
【讨论】:
【参考方案5】:我建议您使用 Ruby。
当我第一次开始学习它时,我发现它真的很容易上手。
【讨论】:
【参考方案6】:我推荐 Haskell。对于“重要”标准 1(除非您包含 Template Haskell)或 3(Haskell 是一种坚定的函数式语言,但如果您愿意,您会惊讶地发现在 Haskell 中进行命令式编码实际上是多么容易)到)。不过,您肯定会喜欢 Haskell 的一流函数。
Haskell 是“重要”标准 2 和 4 的可靠选择。尤其是 #4:“一种有趣的语言,实际上会影响人们对编程的看法。”任何学习过大量 Haskell 的人都可以证明它能够扩展您的思维。
【讨论】:
【参考方案7】:@Jason 我分别不同意。有一些差异使得 Ruby 在元编程方面优于 Python——无论是哲学上的还是实用性的。对于初学者,Ruby gets inheritance right with Single Inheritance and Mixins。而当谈到元编程时,您只需要了解这一切都与自我有关。这里的典型区别在于,在 Ruby 中,您可以在运行时访问 self 对象 - 在 Python 中,您不能!
与 Python 不同,Ruby 没有单独的编译或运行阶段。在 Ruby 中,每一行代码都是针对特定的 self 对象执行的。在 Ruby 中,每个类都继承自对象和隐藏的元类。这产生了一些有趣的动态:
class Ninja
def rank
puts "Orange Clan"
end
self.name #=> "Ninja"
end
使用 self.name 访问 Ninja 类的元类 name 方法以返回 Ninja 的类名。元编程在 Python 中开花如此美丽吗?我真的很怀疑!
【讨论】:
【参考方案8】:你尝试过 Rebol 吗?
【讨论】:
【参考方案9】:老实说,就元编程工具而言,Ruby 和 Python 比它们的一些追随者愿意承认的要相似得多。这两种语言的评论提供了一个很好的比较/评论:
http://regebro.wordpress.com/2009/07/12/python-vs-ruby/所以,只需根据一些标准选择一个。也许您喜欢 Rails 并想研究该代码。也许 SciPy 是你的菜。查看图书馆、社区等的生态系统,然后选择一个。根据您的选择,您当然不会错过一些元编程必杀技。
【讨论】:
【参考方案10】:OCaml 呢?
OCaml 特性:静态类型系统、类型推断、参数多态性、尾递归、模式匹配、一流的词法闭包、函子(参数模块)、异常处理和增量分代自动垃圾收集。
我认为满足以下几点:
重要:
漂亮、干净、理智的语法和一致、直观的语义。基本上是一种经过深思熟虑、使用起来很有趣的现代语言。 多个范例。没有一种范式适用于每个项目,甚至是项目中的每个小子问题。 一种有趣的语言,它实际上会影响人们对编程的看法。
有些重要:
性能。如果性能不错就好了,但是当性能是真正的优先事项时,我会改用 D。 有据可查。
【讨论】:
OCaml 允许您在运行时创建类/方法?它是如何工作的? 我刚刚阅读了有关 OCaml 的内容,可能它无法在运行时创建内容,因此我将其删除。【参考方案11】:就成为“主流”而言,Ruby 会比 Lisp 更好(无论 真正 意味着什么,但一个现实问题是,如果本来要这么做的。)无论如何,我发现 Ruby 很容易上手。在我第一次学习 Python(或其他语言)所花费的同样多的时间里,我很快就编写出了比以往任何时候都更有效更好的代码.不过,这只是一个人的看法;我猜是加一粒盐。在这一点上,我对 Ruby 的了解比对 Python 或 Lisp 的了解要多得多,但你应该知道,在我转行之前,我已经有一段时间是 Python 人了。
Lisp 确实很酷,值得研究;正如您所说,社区的规模等可以很快发生变化。话虽如此,规模本身并不像社区的质量那么重要。例如,#ruby-lang
频道仍然充满了一些非常聪明的人。 Lisp 似乎也吸引了一些非常聪明的人。由于我没有太多的第一手经验,所以我不能过多谈论 Python 社区,但有时它似乎“太大了”。 (我记得人们在他们的 IRC 频道上非常粗鲁,从我从真正喜欢 Python 的朋友那里听到的消息来看,这似乎是规则而不是例外。)
无论如何,您可能会发现一些有用的资源是:
1) Pragmatic Programmers Ruby 元编程系列 (http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming) -- 不是免费的,但后面几集很有趣。 (代码是免费的,如果你想下载它,看看你会学到什么。)
2) Paul Graham (http://www.paulgraham.com/onlisp.html) 在 Lisp 上。它有点旧,但它是经典之作(可免费下载)。
【讨论】:
【参考方案12】:关于您的要点(元编程): Groovy 1.6 版具有内置的 AST(抽象语法树)编程作为标准和集成功能。 Ruby 有 RubyParser,但它是一个附加组件。
【讨论】:
【参考方案13】:一种支持元编程黑客的技术,而这种黑客技术无法在静态编译语言中完成
我很想找到一种语言,它允许 Lisp 所做的一些很酷的事情
可以编译Lisp。
【讨论】:
【参考方案14】:使用 JS 只需在我的 github http://github.com/visionmedia 上查看 AJS(替代 JavaScript 语法),它会给你一些看起来更干净的闭包等:D
【讨论】:
【参考方案15】:比较 code examples 在不同语言中执行相同操作(与 myList
列表中的项目的换行非空描述连接)(语言按字母倒序排列):
鲁比:
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")
艾欧:
myList collect(description) select(!="") join("\n")
这是Io guide。
【讨论】:
(format nil "~~a~^~%~" (删除 nil (mapcar #'description mylist))) 很好,但是元编程在哪里?它似乎是一些稍微实用的风格,与问题远程相关。【参考方案16】:如果你爱玫瑰,你就必须学会忍受荆棘:)
【讨论】:
【参考方案17】:Io 满足您所有的“重要”点。我认为没有更好的语言来进行疯狂的元黑客攻击。
【讨论】:
谢谢,不知道。乍一看很有趣,也许很多 (()) 但无论如何。希望我能尽快找到时间看看。【参考方案18】:好吧,如果你不喜欢 lisp 语法,也许汇编程序是最好的选择。 :-)
当然,它在代码和数据之间的区别很小,它是多范式(或者可能是无范式),并且在学习和你可以做的技巧方面,它是一种思维扩展(如果乏味)的体验。
【讨论】:
我认为我用汇编语言完成的元编程比任何其他语言都多。代码就是数据,数据可以尝试成为代码。并且数据没有签名或未签名,它是决定的操作码。 我有你可以声称是 OO 的汇编代码。它有一些看起来很像方法的东西——你称之为依赖于“类”的东西。【参考方案19】:Lisp 满足您的所有标准,包括性能,它是唯一没有(奇怪)语法的语言。如果您在如此令人震惊的消息灵通/错误的基础上避开它,从而错过使用例如Emacs+SLIME+CL,你会对自己造成很大的伤害。
【讨论】:
或者你可以试试 Clojure,我觉得非常好。 强烈同意。如果你想要 Lisp 的强大功能,那就潜入并拥有它!实际上很容易习惯括号;它们并不像大多数人想象的那么重要。【参考方案20】:我不确定 Python 是否能满足您的所有需求(尤其是关于代码和数据之间的最小区别这一点),但有一个支持 Python 的论点。有一个项目可以让您轻松地在 D 中编写 python 扩展程序,因此您可以两全其美。 http://pyd.dsource.org/celerid.html
【讨论】:
【参考方案21】:你在描述 Ruby。
良好的元编程。能够创建类、方法、函数, 等在运行时。最好是最小 代码和数据的区别, Lisp 风格。
在运行时扩展和现有的原语非常容易。在 ruby 中,一切都是对象、字符串、整数,甚至是函数。
您还可以为语法糖构建快捷方式,例如使用class_eval。
漂亮、干净、理智的语法和一致、直观的语义。 基本上是一个经过深思熟虑的,有趣的 使用,现代语言。
Ruby 遵循principle of less surprise,当比较 Ruby 代码与其他语言的等效代码时,许多人认为它更“漂亮”。
多个范例。没有一种范式适合每个项目, 甚至是其中的每一个小子问题 一个项目。
您可以遵循命令式、面向对象、函数式和反射式。
一种有趣的语言,实际上会影响人们的思维方式 关于编程。
这是非常主观的,但从我的角度来看,同时使用多种范式的能力可以产生非常有趣的想法。
我已经尝试过 Python,但它不符合您的重点。
【讨论】:
-1 我正在使用 Python,它非常适合,Python 和 Ruby 之间的区别在于其他方面。***的噪音制造者,你是。 谈了很多,但没有走。愿意提供一个在 Python 中动态添加方法的示例,比如 String 类吗? @john 这正是我的观点;它非常复杂和丑陋(更不用说 impossible 对于 String 类)。 OTOH 在 Ruby 中非常简单:“self.class.send(:define_method, :method_name) method_code ” Ruby 可能尝试遵循 PoLS,但我不会说它确实。例如,lambda
/Proc.new
混乱在 SO 上被称为“令人惊讶的行为”和“非常违反直觉”。 :-) 任何像 Ruby 这样庞大而复杂的语言都必然会有这样令人困惑的领域。
@Token 下面是一个在 Ruby 中为元编程目的对 String
进行猴子修补的示例:coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/…。子类化不行;然而,一个简单的两个参数的函数会。【参考方案22】:
在探索了 Python、Smalltalk 和 Ruby 之后,我选择了 Ruby。
【讨论】:
【参考方案23】:有关 python 风格的语法和类似 lisp 的宏(真正代码的宏)和良好的 DSL,请参阅converge。
【讨论】:
【参考方案24】:你考虑过 Smalltalk 吗?它提供了一种非常简单、清晰和可扩展的语法,具有反射和自省功能,以及一个利用这些功能的完全集成的开发环境。例如,看看Squeak Smalltalk 中的some of the work being done。许多使用 Squeak 的研究人员在 freenode 上的 Squeak mailing list 和 #squeak 上闲逛,因此您可以非常轻松地在复杂问题上获得帮助。
当前相关性的其他指标:它可以在您愿意命名的任何平台上运行(包括iPhone); Gilad Bracha 的新话作品基于 Squeak; V8 团队在Smalltalk VMs 上咬牙切齿; Dan Ingalls 和 Randal Schwartz 在旷野多年后最近回到了 Smalltalk 工作。
祝您搜索顺利 - 让我们知道您最终的决定。
【讨论】:
【参考方案25】:您的 4 个“重要”点完全指向 Ruby,而 2 个“有些重要”点由 Python 主导。就这样吧。
【讨论】:
【参考方案26】:我在许多项目中都使用 Python,我认为 Python 确实提供了您所要求的所有功能。
重要:
-
元编程:Python 支持元类和运行时类/方法生成等
语法:嗯,这有点主观。我喜欢 Python 的简单语法,但有些人抱怨 Python 对空格敏感。
范式:Python 支持过程式、面向对象和基本函数式编程。
我认为 Python 有一种非常实用的风格,这对我很有启发。
有些重要:
-
性能:它是一种脚本语言。但是为 Python 编写 C 扩展是一种常见的优化实践。
文档:我不能抱怨。它并不像人们从 Java 中知道的那样详细,但已经足够了。
作为研究生,您可能想阅读这篇声称Python is all a scientist needs 的论文。 不幸的是,我无法将 Python 与 Ruby 进行比较,因为我从未使用过那种语言。
问候, 丹尼斯
【讨论】:
Python 对空格不敏感,对缩进敏感。【参考方案27】:如果您喜欢 lisp 风格的代码即数据概念,但不喜欢 Lispy 语法,那么Prolog 可能是一个不错的选择。
这是否属于“有趣的现代语言”,我会留给其他人来判断。 ;-)
【讨论】:
【参考方案28】:将 Python 和 Ruby 分开并没有什么特别之处。我想说 Python 社区比 Ruby 社区更大、更成熟,这对我来说真的很重要。 Ruby 是一种更灵活的语言,它有正面和负面的影响。但是,我相信会有很多人详细介绍这两种语言,所以我会提出第三种选择。 JavaScript 怎么样?
JavaScript 最初是为 web 设计的 Scheme,它是基于原型的,就多范式和元编程而言,这比 Python 和 Ruby 更有优势。语法不如其他两种好,但它可能是现有部署最广泛的语言,而且性能每天都在提高。
【讨论】:
【参考方案29】:至少在意识形态层面上,python 和 ruby 之间并没有太大的区别。在大多数情况下,它们只是同一事物的不同风味。因此,我建议您看看哪一个更符合您的编程风格。
【讨论】:
绝对有不相同的东西。表面上看起来很相似,但是如果您使用了 Ruby 最强大的功能,您就会明白 Python 是无法匹敌的。例如,尝试在 Ruby 中编写 DSL 与编写 Python,或者在运行时创建函数、方法、类等。这在 Ruby 中要简单得多。 您需要进行元编程并不少见,只是很少有人完成。除了最琐碎的程序外,所有程序都有重复模式,这些模式不属于通常的重构工具,但很容易被元编程杀死。 Ruby 和 Python 甚至在支配其设计的想法上也存在巨大差异。 Python 他们想要一种并且希望是一种明显的做事方式。这通常使得该语言不像 Ruby 那样富有表现力,但它使其更加一致。 Ruby 更多地来自于 Perl 的方式,其中有很多方法可以做事。 Ruby 也让一些事情变得超级简单,实际上包含了私有成员的想法。另一方面,Python 最多只会让一些事情变得更难做,所以你必须更加明确(比如在类上添加或覆盖行为)。 您可能应该在这两个方面都参加速成课程,但为了便于元编程,Ruby 似乎更适合。不过,我没有太多经验,所以请持保留态度。 Ruby 和 Python 只有相似之处在于它们都宣扬“美丽的代码”。他们只是对美丽的事物有完全不同的看法(IMO 是好的)【参考方案30】:免责声明:我只涉足任何一种语言,但我至少在这两种语言中都编写过小型工作程序(不仅仅是快速脚本,我使用 Perl、bash 或 GNU make)。
Ruby 非常适合“多范式”第 3 点,因为它努力使创建特定领域的语言变得容易。例如,在线浏览并查看一些 Ruby on Rails 代码和一些 Rake 代码。它们都是 Ruby,您可以看到相似之处,但它们看起来不像您通常认为的同一种语言。
在我看来,Python 更容易预测(可能与“干净”和“健全”第 2 点相关),但我真的不知道这是因为语言本身还是人们通常使用它具有不同的价值。我从未在 Python 中尝试过深度魔法。我肯定会说这两种语言都经过深思熟虑。
在 1 和 4 中都得分很高。[编辑:实际上 1 是很有争议的 - 两者都有“eval”,这在解释语言中很常见,但它们在概念上几乎不是纯粹的。您可以定义闭包、将方法分配给对象等等。不确定这是否达到你想要的程度。]
就我个人而言,我发现 Ruby 更有趣,但部分原因是更容易分心思考做事的酷方法。我实际上更多地使用了 Python。有时你不想酷,你想继续它,所以它在睡前完成......
它们都很难进入,所以你可以决定在一个中完成你的下一个小任务,然后在另一个中完成之后的一个。或者从图书馆拿起一本介绍性书籍,略读一下,看看有什么吸引你。
【讨论】:
以上是关于用于元编程的 Python 与 Ruby [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
用于读取图像内文本的最佳 Python/Ruby 库 [关闭]