要是没有Ruby能产生出Rails吗? (Could Rails have been built without Ruby? )

翻译 2006年06月24日 20:47:00

要是没有Ruby能产生出Rails吗?
原文出处:http://www.billkatz.com/node/42
翻译:Suninny

读了保罗·格雷厄姆(译注:Paul Gramham,著名的Lisp黑客,著有《On Lisp》和《黑客与画家》等书)关于计算机语言的杂文,由他提出的一些有趣观点使我受到启发。这篇博客条目完全可以叫做《保罗如何使我领悟了Ruby on Rails》。

首先,新的语言多半将趋向于Lisp,也许因为Lisp是麦卡锡(McCarthy)的一次理论演练,一个思维实验,与其说它是被真正设计出来硬塞进当时(1958年)的计算局限,而宁可说是被用来探索“设法使计算公理化”(见格雷厄姆的论文《The root of Lisp》,译注:中文版的译文叫《Lisp之根源》)。与之相反,Fortran和C,从硬件中采纳了大量的尾接指令(cues)来提高运行速度。随着时间的流逝,低级语言被用来处理算法简单、计算贫乏的问题,而脚本语言(如Perl、PHP、Python、Ruby)却得到迅速发展,由简单粘合剂的角色渗入到更加复杂的处理任务中。

从我开始Lisp编码到现在已有二十年了,我想知道我喜欢Ruby是否源于它跟我遥远记忆中的语言一样强大,并且比我用过的C、C++、PHP更加优美和灵活。她是一个真正面向对象(基于消息)的语言,拥有强类型、闭包并且看上去万事万物皆动态(类型、开放类)。尽管于Ruby和Rails来说我还只是个新手,但我知道她会是一个让我乐在其中的语言。

格雷厄姆谈到了“自底向上设计”--通过改变语言去适应问题域。它暗示出为什么相对于其他Web架构,Rails看上去如此棒的一个原因:Rails就像是一个加大了马力的Ruby而不只是一堆类、过程调用和拴在一块的代码的组合。

“在Lisp中,你不仅编写你的程序向下朝向语言,你还建立语言向上朝向你的程序”,格雷厄姆写道:“语言和程序一同进化…到最后这门语言将看起来似乎就是专门为你的程序而设计的。而且当语言和程序默契地配合,你最终得到的是短小、清晰而高效的代码。”这是一个出自1993年关于Rails很好的描述,它指出了Web框架之间相当微妙的一个区别。

正如标准的Ruby让你使用“attr_writer :some_attribute”,Rails提供了一个用于定义数据关系的记法“has_many :data_thing”。这条Ruby之路似乎更深奥,随着Rails的扩充,不知她是否会继续坚持Ruby的风格。

是时候问答这个问题了――“如果没有Ruby能产生出Rails吗?”,我认为不但得着眼于功能性而且要从美学方面作考量--它不只是简单代码行上的比较,你向上朝着Rails建立了一个解决Web开发共同问题的语言。如格雷厄姆所言,你能用任何图灵机等效的语言来建立Rails。真正的问题在于你得将美学也复制过来,不管你是否会在这过程中做一个Ruby解释器的秘密实现。对于Python用户来说,移植也算特难;而作为C用户,还是构造一个Ruby解释器来得容易。

与Zope 2(一个主力的Python应用和后端服务器架构)相冲突的一个问题是,怎么使非Python化的架构呈现在开发者面前,架构师们选择了重写,Zope X3就是重写后的作品。在早期开发的路标中,他们写道,“我们知道Python是一个伟大的语言,因为它有一个小型的核心,值明确而一致,并且有一个巨大的标准库。Zope将追随这一指针。至少一个Python大虾Xavier Defrang,认为“将不会有[Rails] in Python/PHP/Perl/Java,正是因为语言的关系…一个架构能否最终博得你的好感,在于她简洁和优雅的设计,而不是看上去像一个设计模式库。”

Defrang关于草率运用模式的抱怨很生动。格雷厄姆的这篇杂文是这样结尾的:
…在面向对象的世界里,你经常会与“模式”打交道。这些模式往往不是作为第C种情况――人编译器(human compiler)来运转〔译注:保罗的原文列出了A、B、C情况〕。当在我的程序中看到模式,我认为它是麻烦的征兆。一个程序的形态仅仅能反射它需要解释的问题,这其中任何其它的规律性,于我来说只是我的抽象工作未做到家的征兆,通常我会手工写一些宏来解决这方面的问题。

我认为格雷厄姆将模式视为副本的同义词,这非常不同于Martin Fowler对模式的看法--怎么会认为模式就是使“怎样”(how)和“何时”(when)形式化呢。

Rails的缔造者--David Heinemeier Hansson如此热衷于模式,他甚至为Martin Fowler的模式门类建立了漂亮的图表。Rails即是MVC模式的例证。一定数量的其他样式,如Active Records影响了框架的设计,这种无缝结合有时甚至让评论家都不会察觉到他们的存在。Rails的开发者试图尽可能地提取出这种规律性。按Rails的话说,他们称之为DRY(Don't Repeat Yourself)原则;惯例(译注:Rails的另一原则是惯例优于配置)允许我们从数据库从提取模型信息,避免了重复代码;助手(Helpers)减少了我们建立窗体及其他的面向视图的代码的数量。Rails不是第一个进行这种简化尝试的框架,但也许她是最干净的一种,因为这种抽象适合Ruby语言的风格。

一些框架信奉规律性,甚至使其成为一种文化--可能伴随附加语言--这样的工具能分析并自动产生一部分代码。当人们阅读代码时,就会明白它是何等的罗嗦。在这样的环境下编程就是使用工具。开发不只意味着用X语言而是Y工具中的X语言。我认为Ruby on Rails与之相反,底层的代码用Ruby构造并使用元编程(如上面的has_many)来尽可能的保持简洁,也许这是因为Rails缺乏一个如Visual Studio般全效的IDE。

有许多Rails专用的关键字,像你所期待的那样建立一门语言用于Web应用,但这些关键字以Ruby方式运作。与此相对的是,有些未混入底层语言的框架不仅需要掌握新的标识符而且还要掌握一门新的方法学。Ruby on Rails拥有代码生成脚本能快速建立脚手架,并且我想知道这种抽象能否做得更出色。

Rails尚未发布1.0版(译注:原文写于05年,目前最近的Rails版本为1.1.2),她是一件进展中的艺术品,将来的Rails版本会有所出入。随着我的Ruby和Rails编程水平的提升,我将致力于抽象级别的优化,哪种模式比较适合以及服务器端代码怎么尽可能与各式各样的胖客户做好接合…格雷厄姆的杂文让我回想并巩固了许多有关编程和Web开发方面的知识点――即便你不同意他的观点。这就是好文章的印记。

通过弹出层实现新建功能 ruby on rails

(1)在布局文件中讲弹出层代码和主体代码分开 (2)改写添加商品的时候按钮的方法,增加data属性,里面设定当按钮点击的时...

Ruby on Rails Tutorial第三章关于$ bundle exec respec 出错的问题的解决方案

Ruby on Rails Tutorial第三章关于bundle exec respec 版本的debug     Ruby on Rails Tutorial 教程中--第三章的第一个测试 最后...

通过js实现编辑功能ruby on rails 弹出层

(1)首先给每一行进行id的标注,并且修改edit链接,使它的remote: true, 请求类型是json格式,在这个链接上,增加class:editProductLink ,这样在我们...

Ruby on rails开发从头来(windows)(四)-第一个添删查改例子

在上一篇Ruby on rails开发从头来(windows)(三)-实现页面间的跳转中,我们创建了两个页面来进行跳转迁移,这次我们来写一个单表维护的添删查改的例子。   1.       这次我...

win7 64位官方旗舰版上搭建ruby on rails的步骤

今天在win7上安装ruby成功,步骤记录下来了,分享给朋友们。亲测,可行。 ----------第一步:安装ruby------------ 1.安装 rubyinstaller-2.2.4-x64...
  • evic520
  • evic520
  • 2016年05月24日 18:26
  • 3009

ruby on rails 关于微信企业号回调模式初步验证通过后再次签名验证失败的解决

这块我在8月17号的时候碰到过,再回调模式初步验证通过以后,微信服务器后续的信息会由原来的msg_signature. timestamp. nonce. echostr改为3个参数msg_signa...

自己总结的ruby on rails 查询方法

闲来无事,结合以前的代码,总结了ruby on rails的查询方法,方便自己以后查看,也方便后来人,如下,欢迎批评指正 1::simpleDB modules = find(:all, :con...

提升Ruby on Rails性能的几个解决方案

简介 Ruby On Rails 框架自它提出之日起就受到广泛关注,在“不要重复自己”,“约定优于配置”等思想的指导下,Rails 带给 Web 开发者的是极高的开发效率。 ActiveRecord ...

Ruby on Rails 控制器分组实现及命名规则

1.  把控制器(controller)分组到模块中 现在,我们的所有的controller都放在app/controller目录下,有时候我们的controller可能比较多,为了不污染到...
  • sean_cd
  • sean_cd
  • 2011年12月28日 17:57
  • 1256

Ruby on Rails,使用where方法对持久化对象进行条件查询

http://blog.csdn.net/abbuggy/article/details/8094043 在《Ruby on Rails,使用find方法加载持久化对象》一文中,我们使用find...
  • ABBuggy
  • ABBuggy
  • 2012年10月21日 00:40
  • 10033
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:要是没有Ruby能产生出Rails吗? (Could Rails have been built without Ruby? )
举报原因:
原因补充:

(最多只允许输入30个字)