Python 对比用于元编程的 Ruby [关闭]
-
02-07-2019 - |
题
我目前主要是 D 程序员,我希望在我的工具箱中添加另一种语言,最好是支持元编程技巧的语言,而这在像 D 这样的静态编译语言中是无法完成的。
我读过一些关于 Lisp 的文章,我很想找到一种语言,它可以实现 Lisp 所做的一些很酷的事情,但又没有奇怪的语法等。Lisp 的。我不想引发一场语言之战,而且我确信 Ruby 和 Python 都有各自的权衡,所以我将列出对我个人而言重要的内容。请告诉我 Ruby、Python 还是其他语言是否最适合我。
重要的:
- 良好的元编程。能够创建类、方法、函数等。在运行时。最好是代码和数据之间的最小区别,Lisp 风格。
- 漂亮、干净、合理的语法和一致、直观的语义。基本上是一种经过深思熟虑、使用起来很有趣的现代语言。
- 多种范式。没有一种范式适合每个项目,甚至适合项目中的每个小子问题。
- 一种有趣的语言,实际上影响着人们对编程的思考方式。
有一些重要:
- 表现。如果性能不错那就太好了,但是当性能是真正的优先事项时,我会改用 D。
- 有据可查。
不重要:
- 社区规模、图书馆可用性等。这些都不是语言本身的特征,而且都可以很快改变。
- 工作机会。我不是一个全职的专业程序员。我是一名研究生,编程与我的研究无关。
- 任何主要针对由一百万个代码猴子处理的大型项目而设计的功能。
解决方案
至少在意识形态层面上,Python 和 Ruby 之间并没有太大的区别。在大多数情况下,它们只是同一事物的不同口味。因此,我建议看看哪一种更符合您的编程风格。
其他提示
我读过一些关于 Lisp 的文章,我很想找到一种语言,它可以实现 Lisp 所做的一些很酷的事情,但又没有奇怪的语法等。Lisp 的。
我们都不会吧。
代码和数据之间的最小区别,Lisp 风格
可悲的是,代码和数据之间的最小区别以及“奇怪”的语法是彼此的结果。
如果你想要易于阅读的语法,Python 是你的选择。然而,代码是 不是 以任何常用的内置数据结构表示。它失败了——就像大多数语言一样——在“重要”列表的第 1 项中。这使得提供有用的帮助变得困难。
你不可能拥有一切。请记住,您不是第一个有这种想法的人。如果存在像您理想的语言那样的东西,我们都会使用它。由于现实世界达不到你的理想,你必须重新排列你的愿望清单的优先顺序。必须重新排列“重要”部分以确定什么是 真的 对你很重要。
老实说,就元编程工具而言,Ruby 和 Python 比它们的一些追随者承认的要相似得多。对这两种语言的评论提供了很好的比较/评论:
因此,只需根据某些标准选择一个即可。也许您喜欢 Rails 并且想研究该代码。也许 SciPy 是你的菜。查看图书馆、社区等生态系统,然后选择一个。您当然不会因为您的选择而失去一些元编程必杀技。
免责声明:我只涉足任何一种语言,但我至少都用这两种语言编写过小型工作程序(不仅仅是快速脚本,我使用 Perl、bash 或 GNU make)。
Ruby 对于“多范式”第 3 点来说非常有用,因为它努力使创建特定于领域的语言变得容易。例如,在线浏览并查看一些 Ruby on Rails 代码和一些 Rake 代码。它们都是 Ruby,您可以看到相似之处,但它们看起来不像您通常认为的同一种语言。
在我看来,Python 更容易预测(可能与第 2 点“干净”和“理智”相关),但我真的不知道这是因为语言本身还是因为它通常被具有不同价值观的人使用。我从未尝试过使用 Python 进行深层魔法。我当然会说这两种语言都是经过深思熟虑的。
1和4都取得了不错的成绩。[编辑:实际上 1 是相当有争议的 - 两者都有“eval”,这在解释语言中很常见,但它们在概念上很难纯粹。您可以定义闭包、为对象分配方法等等。不确定这是否如您所愿。]
就我个人而言,我发现 Ruby 更有趣,但部分原因是它更容易让你分心思考很酷的做事方式。其实我用Python比较多。有时你不想冷静,你想继续做下去,所以就在睡前完成......
它们都不难进入,因此您可以决定在其中一个中完成下一个小任务,然后在另一个中完成之后的任务。或者从图书馆挑选一本关于这两本书的介绍性书籍,浏览一下这两本书,看看哪一本吸引你。
你考虑过Smalltalk吗?它提供了非常简单、清晰和可扩展的语法,具有反射和自省功能,以及利用这些功能的完全集成的开发环境。看一下 一些正在进行的工作 在 吱吱小语 例如。许多使用 Squeak 的研究人员都在 吱吱声邮件列表 以及 freenode 上的#squeak,因此您可以轻松获得有关复杂问题的帮助。
当前相关性的其他指标:它可以在您愿意命名的任何平台上运行(包括 iPhone);Gilad Bracha 的新话作品以《Squeak》为基础。V8 团队开始尝试 Smalltalk 虚拟机;Dan Ingalls 和 Randal Schwartz 在荒野多年后最近又回到了 Smalltalk 工作。
祝您搜索顺利 - 让我们知道您最终的决定。
Lisp 满足您的所有标准,包括性能,并且它是唯一没有(奇怪的)语法的语言。如果您在如此消息灵通/错误的基础上回避它,并因此错过了使用例如的体验。Emacs+SLIME+CL,你会给自己带来很大的伤害。
你的 4 个“重要”点完全指向 Ruby,而 2 个“有点重要”点则由 Python 决定。就这样吧。
您正在描述 Ruby。
- 良好的元编程。能够创建类,方法,功能等能力。在运行时。优选地,代码和数据,LISP样式之间的最小区别。
很容易扩展 和 在运行时修改现有原语。在 ruby 中,一切都是对象,字符串,整数,甚至函数。
您还可以构建语法糖的快捷方式,例如 类评估.
- 漂亮、干净、合理的语法和一致、直观的语义。基本上是一个经过深思熟虑,使用有趣的现代语言。
红宝石遵循 少惊喜原则, ,当将 Ruby 代码与其他语言中的等效代码进行比较时,许多人认为它更“美丽”。
- 多种范式。没有一个范式适合每个项目,甚至没有一个项目中的每个小子问题。
您可以遵循命令式、面向对象、功能性和反思性。
- 一种有趣的语言,实际上会影响人们对编程的思考方式。
这是非常主观的,但从我的角度来看,同时使用多种范式的能力可以产生非常有趣的想法。
我尝试过Python,但它不符合你的要点。
比较 代码示例 做同样的事情(加入一个换行符的项目的非空描述 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())
珀尔:
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")
这是一个 木卫一指南.
就“主流”而言,Ruby 会比 Lisp 更好(无论如何) 真的 意思是,但一个现实的问题是,如果你这样做的话,找到关于 Lisp 编程问题的答案是多么容易。)无论如何,我发现 Ruby 很容易上手。在我第一次学习 Python(或其他语言)所花费的时间里,我很快就开始写作 更好的 代码很多 更有效率 比我以前有过的。但这只是一个人的观点;我想,对此持保留态度。目前,我对 Ruby 的了解比对 Python 或 Lisp 的了解要多得多,但你应该知道,在我转用 Python 之前,我已经用了很长一段时间了。
Lisp 确实很酷并且值得研究;正如你所说,社区的规模等。可以很快改变。话虽如此,尺寸本身并不重要,重要的是 质量 社区的。例如, #ruby-lang
频道中仍然充满了一些非常聪明的人。Lisp 似乎也吸引了一些非常聪明的人。由于我没有很多第一手经验,所以我不能过多谈论 Python 社区,但有时它似乎“太大”了。(我记得人们在 IRC 频道上非常粗鲁,从我从真正喜欢 Python 的朋友那里听到的消息来看,这似乎是规则而不是例外。)
无论如何,您可能会发现一些有用的资源:
1) 实用程序员 Ruby 元编程系列 (http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming)——不是免费的,但后面的剧集相当有趣。(该代码是免费的,如果您想下载它并看看您能学到什么。)
2) Paul Graham 的《On Lisp》(http://www.paulgraham.com/onlisp.html)。它有点旧,但它是经典(并且可以免费下载)。
我在许多项目中使用 Python,并且我认为 Python 确实提供了您要求的所有功能。
重要的:
- 元编程:Python 支持元类和运行时类/方法生成等
- 句法:嗯,这在某种程度上是主观的。我喜欢 Python 的语法,因为它简单,但有些人抱怨 Python 对空格敏感。
- 范式:Python 支持过程式、面向对象式和基本函数式编程。
- 我认为Python有一种非常实用的风格,这对我很有启发。
有一些重要:
- 表现:嗯,它是一种脚本语言。但为 Python 编写 C 扩展是一种常见的优化实践。
- 文档:我无法抱怨。它不像某些人从 Java 中了解到的那么详细,但它已经足够好了。
作为研究生,您可能想阅读这篇论文,声称 Python 是科学家所需要的一切。不幸的是,我无法将 Python 与 Ruby 进行比较,因为我从未使用过该语言。
问候,丹尼斯
@Jason 我分别不同意。Ruby 在元编程方面优于 Python,无论是哲学上还是实用上,都有一些差异。对于初学者, Ruby 通过 Single Inheritance 和 Mixins 获得继承权. 。当谈到元编程时,您只需要了解这一切都与 自己. 。这里典型的区别是,在 Ruby 中你可以访问 自己 运行时对象 - 在 Python 中你不需要!
与 Python 不同,Ruby 中没有单独的编译或运行时阶段。在 Ruby 中,每行代码都是针对特定的执行 自己 目的。在 Ruby 中,每个类都继承自对象和隐藏元类。这产生了一些有趣的动态:
class Ninja
def rank
puts "Orange Clan"
end
self.name #=> "Ninja"
end
使用 自己的名字 访问 Ninja 类的元类 姓名 方法返回 Ninja 的类名。Python 中的元编程是否如此美丽?我由衷地怀疑!
好吧,如果您不喜欢 lisp 语法,也许汇编器是您的最佳选择。:-)
它确实在代码和数据之间有最小的区别,是多范式的(或者可能不是范式的),并且在学习和你可以做的技巧方面都是一种思维扩展(如果乏味)的体验。
Io 满足您所有的“重要”点。我不认为有更好的语言来进行疯狂的元黑客攻击。
一个支持元编程黑客的人 无法用静态编译语言完成
我很想找到一种语言,可以实现一些很酷的东西 口齿不清 做
Lisp 可以编译。
你尝试过雷博尔吗?
我的回答是两者都不是。我了解这两种语言,参加过 Ruby 课程,并且已经使用 Python 编程好几年了。Lisp 擅长元编程,因为它的唯一目的是转换列表,它自己的源代码只是一个标记列表,因此元编程是自然的。对于此类事情,我最喜欢的三种语言是 Rebol、Forth 和 Factor。Rebol 是一种非常强大的方言语言,它从输入流中获取代码,对其运行表达式并使用用该语言编写的规则对其进行转换。非常有表现力并且非常擅长方言。Factor 和 Forth 或多或少完全脱离了语法,您可以通过定义和调用单词来对它们进行编程。它们通常大多是用自己的语言编写的。您不编写传统意义上的应用程序,而是通过编写自己的单词来定义您的特定应用程序来扩展语言。Factor 可能特别好,因为它具有许多我只在 Smalltalk 中看到的用于评估和使用源代码的功能。一个非常好的工作空间、交互式文档等。
Python 和 Ruby 之间并没有太多的区别。我想说 Python 社区比 Ruby 社区更大、更成熟,这对我来说非常重要。Ruby 是一种更灵活的语言,它有积极的影响,也有消极的影响。然而,我确信会有很多人详细介绍这两种语言,所以我将提出第三种选择。JavaScript 怎么样?
JavaScript最初被设计为Web的Scheme,并且它是基于原型的,就多范式和元编程而言,这比Python和Ruby具有优势。它的语法不如其他两种语言那么好,但它可能是现有的部署最广泛的语言,并且性能每天都在变得更好。
如果您喜欢 lisp 风格的“代码就是数据”概念,但不喜欢 Lispy 语法,也许 序言 将是一个不错的选择。
这是否算得上是一种“使用起来很有趣的现代语言”,我将留给其他人来判断。;-)
在探索了 Python、Smalltalk 和 Ruby 后,我选择了 Ruby。
那么 OCaml 呢?
OCaml 特点:静态类型系统、类型推断、参数多态性、尾递归、模式匹配、一流的词法闭包、函子(参数模块)、异常处理和增量分代自动垃圾收集。
我认为它满足以下条件:
重要的:
- 漂亮、干净、合理的语法和一致、直观的语义。基本上是一种经过深思熟虑、使用起来很有趣的现代语言。
- 多种范式。没有一种范式适合每个项目,甚至适合项目中的每个小子问题。
- 一种有趣的语言,实际上影响着人们对编程的思考方式。
有一些重要:
- 表现。如果性能不错那就太好了,但是当性能是真正的优先事项时,我会改用 D。
- 有据可查。
我经常使用 Python,但更多地使用 Ruby。不过我认为他们都提供了你所要求的。
如果我看到你所有的四点,那么你至少可以检查一下:http://www.iolanguage.com/
您可能也会对莫扎特/奥兹国感兴趣:http://mozart.github.io/
关于弗里德里希的介绍
对于 python 风格的语法和类似 lisp 的宏(真正的代码宏)和好的 DSL,请参见 收敛.
我不确定 Python 是否能满足您的所有需求(尤其是代码和数据之间的最小区别这一点),但有一个论点支持 Python。有一个项目可以让您轻松地在 D 中编写 python 扩展程序,这样您就可以两全其美。 http://pyd.dsource.org/celerid.html
如果你爱玫瑰,你就必须学会与荆棘一起生活:)
我建议你选择 Ruby。
当我第一次开始学习它时,我发现它非常容易上手。
不要将 Ruby 编程语言与 Ruby 实现混合在一起,认为 POSIX 线程在 Ruby 中是不可能的。
您可以简单地使用 pthread 支持进行编译,并且 在创建该线程时这已经是可能的, ,如果你原谅这个双关语。
这个问题的答案很简单。如果您喜欢 lisp,您可能会更喜欢 ruby。或者,随你喜欢。
我建议您尝试两种语言并选择您感兴趣的一种。Python 和 Ruby 都可以做你想做的事。
另请阅读 这个线程.
使用 JS 只需在我的 github 上查看 AJS(替代 JavaScript 语法) http://github.com/visionmedia 它会给你一些看起来更干净的闭包等:D
关于您的要点(元编程):Groovy 1.6 版本内置了 AST(抽象语法树)编程作为标准和集成功能。Ruby 有 RubyParser,但它是一个附加组件。