时隔16年Jeff Barr重返10.23-25 QCon上海站,带你看透AI如何重塑软件开发! 了解详情
写点什么

社区专家谈 Ruby 及 Rails 的发展

  • 2012-11-14
  • 本文字数:2748 字

    阅读完需:约 9 分钟

最近,Ruby 社区专家 Paul Wilson撰文回顾了Ruby 发展的过去和现状,同时对Ruby 未来发展的方向表示了自己的担忧。

Paul 从 2005 年开始接触 Ruby,当时还有许多醉心于极限编程的同事,一起加入到 Rails 的时尚潮流中。许多 Ruby 开发者都来自敏捷社区,大家都对企业级 Java 编程中为了实现一点功能却要大量的代码和 XML 配置的做法很厌倦:

元编程能力、动态类型、Ruby/Rails 带来的约定优于配置(Conversion Over Configuration)的模式都使我们能够快速写出简洁的代码。语言、框架和社区内在的测试驱动开发原则是我们的代码优美、严谨。Java 语言苦苦支撑的行为驱动开发(Behaviour Driven Development)在 Ruby 中出现并发展:Rspec、Cucumber 都是很好的例子。直到现在,Ruby 的开发模式仍然是敏捷 / 极限编程的范例,这是其他语言无法比拟的。

关于 Ruby 语言的优势,我们可以简单的从以下几个方面了解下:

元编程

元编程支持在编程语言特性中占有重要的地位,开发人员可能对反射等概念比较了解,“在代码中动态分析、生成代码”的元编程能力对于基于编程语言的开发框架来说很重要,如果语言自身提供了强大的元编程支持,框架的开发者会事半功倍。Ruby 提供了 attr_accessor 方法,支持开发人员动态生成访问变量的方法。Ruby 的反射功能可以获取、更改各种范围内的变量值,而且能够获取、删除类方法,以及其他一些分析功能,当开发人员希望实现“通用编程”的模式或者后面提到的猴子补丁时,这些元编程功能会提供有效的支持。相比之下,C、C++ 语言可能实现起来就比较困难,虽然存在宏定义等低效的办法。

高阶函数

高阶函数的使用同样可以提高开发效率,在函数模板化、容器迭代器等方面有着重要的应用。高阶函数在 C 语言中采用了传递函数指针的形式来实现,但是存在局限性,即实现函数间的信息传递只有两种方法,要么明确地传递参数,要么使用全局变量。这种限制导致代码编写的低效。为了解决此问题,Ruby 和 Javascript 语言引入了闭包的概念,即函数(块)可以引用外部的局部变量。通常的外部变量在方法执行结束时就不存在了,但是如果被包括进了闭包,那么在闭包存在期间,外部局部变量也会一直存在(当然,闭包也会引起潜在的内存泄露问题)。Ruby 中的块结构是高阶函数的一种特殊形式,代码块可以作为参数传递给方法,在被调用的方法中可以执行传递过来的代码块,执行后程序的控制权返还给方法,块中最后执行的表达式的值是块的值,这个值可以返回给方法。块结构的经典应用是对集合对象(容器)的处理,比如循环执行、条件排序、条件搜索等,开发人员只需把块结构传递给容器方法,就可以方便的执行块结构中的表达式并返回结果。之前 C++ 和 Java 等容器类的迭代器,使用别的类对象来处理容器元素,属于外部迭代器。Ruby 通过块结构和闭包实现了内部迭代器,不用额外生成对象。Ruby 中的集合方法非常丰富,包括 all、any、find、map、min、max、select、sort、inject 等,这样的设计能够让对数据结构和算法有要求的开发人员操作起来更加简洁和高效。

猴子补丁

编程语言对于猴子补丁的支持对软件开发同样重要。猴子补丁可以解释为,不改变源代码而对功能进行追加和变更。软件开发过程中,有一个著名的开放 - 封闭原则(open-closed principle):对模块扩展必须开放,对修改必须封闭。模块是可以扩展的,比如追加新的数据结构或者功能,能够满足未来的需求。修改是封闭的,指被引用的模块内部细节发生变化时,对外接口应当是稳定的。猴子补丁能够遵循该原则,它的主要目的包括追加和变更功能、修补程序错误等。Ruby 这样的语言提供了开放类,也就是说类定义之后也能任意的追加新内容,不仅如此,Ruby 还提供了若干类操作方法,undef 可以取消之前本类或者父类定义的方法,alias 可以给方法起一个别名,开发人员可以在重新定义的方法中用别名来调用原来的方法,从而给原来的方法增加新功能,include 可以把其他模块的功能包含进来。Ruby 提供的这些方法使猴子补丁的实现过程更容易,对比 Java 等静态语言,读者可以发现 Ruby 语言在这方面处理灵活,开发效率更高。

函数式编程

函数式编程是与面向对象编程相提并论的编程方法,最近越来越受到关注,它的最大优点在于,程序可以按照数学的形式以及声明的形式来编写。支持函数式编程的语言能够帮助开发人员把工作重点放在描述算法上,而不是具体的实现操作。像 Lisp、Erlang 和 Ruby 都支持函数式编程,不少语言是各种结构化编程、面向对象编程和函数式编程的混合体,开发人员可以根据需要选择高效的编程方式。说起这个话题,笔者不禁想起技术专家老赵,他经常会在讲座前拿容器的集合方法为例对比 Java 和 C#的代码实现,强调声明式编程和 Lambda 表达式的好处,Ruby 这样的语言在设计时对此有所考虑,并选择了有益的实现。

Paul 在文中提到:一转眼来到了 2012 年,革新已经结束。Ruby 开发已经发展壮大并成为主流,至少存在主流的趋势。虽然传统企业如银行的 IT 业务中,Ruby 难以渗透,但是,使用 Ruby 语言的创业公司如 LivingSocial 和 Groupon 都已经发展成大公司。而显示 Ruby 成为主流的关键时刻是 Salesforce.com 在 2010 年 12 月份收购了 Heroku,在第二年的七月,Ruby 的创立者 Matz (Yukihiro Matsumoto) 成为 Heroku 的首席架构师。同时,Rails 成为了互联网创业公司的必备工具。成功并没有对敏捷 /XP 社区产生太大的而影响,大家依然关注编程工艺,喜欢尝试各种不同的语言,比如 Clojure 和 Erlang。

他表示,现在,大部分 Ruby 开发依然首选 Rails,但是我们却进入了 Rails 的低潮期。简单的模型 - 视图 - 控制器架构在 2005 年非常吸引人,但是现在却饱受批评,因为缺乏合适 的分层结构。Rails 3 的推动者 Yehuda Katz 在 Twitter 风趣的说:“Rails 现在的问题在于,一半的人担心 Rails 变成 Java,而另一半人却在努力把它变成 Java”。Paul 希望 Ruby on Rails 社区能够逐渐成熟,在 Web 开发中引入合适的架构,而不是重新发明一个企业级 Java Beans 这样的东西。

除此之外,Paul 还介绍了目前优秀的 Ruby 解释器:

  • YARV 是目前 Ruby 1.9.x 的官方解释器,相比 Matz 最初的 Ruby 解释器,在性能上有了很大的提升。
  • JRuby 是目前最成熟、广泛应用的能够替代 YARV 的 Ruby 解释器,它的开发团队一直保持更新。JRuby 利用了 Java 虚拟机的所有优势:包括即时编译、种类丰富的 Java 库、与遗留系统的 Java 代码互操作、真正的原生多线程支持。最后一点非常重要,因为可以利用现在的多核服务器:使用多线程比新进程更能有效地利用内存。
  • Iron Ruby 是.Net 框架上的 Ruby 实现,虽然缺少了微软官方的直接支持,但依然在发展。

还有用 Ruby 写成的 Ruby 解释器 Rubinius 、基于 VMWare GemStone/S 3.1 虚拟机上的 Ruby 实现 Maglev 、RubyCocoa 的继任者 MacRuby 等等。

2012-11-14 00:363298
用户头像

发布了 501 篇内容, 共 280.8 次阅读, 收获喜欢 64 次。

关注

评论

发布
暂无评论
发现更多内容

数字经济加速落地,能为中小企业带来什么?

脑极体

短视频源码开发,优质的短视频源码需要做好哪几点?

开源直播系统源码

软件开发 短视频源码

机器学习实践:基于支持向量机算法对鸢尾花进行分类

华为云开发者联盟

人工智能 模型 华为云

DAP事实表加工汇总功能应用说明

agileai

数据分析 数据集成 数仓建设 基础事实表 汇总事实表

网页制作存在的一些难点

源字节1号

详解openGauss多线程架构启动过程

华为云开发者联盟

数据库 后端

如何给研发团队分钱?

菜根老谭

研发体系 绩效管理 激励体系

物联网开源开发平台 Shifu 开放内测!第一版技术文档发布

亚马逊云科技 (Amazon Web Services)

物联网 Tech 专栏

如何在物联网低代码平台中使用数据字典功能?

AIRIOT

物联网 低代码平台

洞见科技牵头的全球「首个」IEEE隐私计算「互联互通」国际标准正式启动

洞见科技

隐私计算 IEEE 互联互通

web技术分享| 【高德地图】实现自定义的轨迹回放

anyRTC开发者

前端 Web 音视频 地图 轨迹回放

如何做好研发效能度量及指标选取

思码逸研发效能

研发效能

活动预约|阿里云如何搭建云服务 SRE 与可观测体系

阿里巴巴云原生

阿里云 云原生 可观测 峰会

预约直播|机器学习PAI:AI加速计划

阿里云大数据AI技术

AI 模型开发训练

数据科学家是不是特有前途的职业?

袁袁袁袁满

企业级软件开发新模式:低代码

力软低代码开发平台

华为云招募工业智能领域合作伙伴,强力扶持+商业变现

华为云开发者联盟

云计算 华为云 工业数据智能

[译]关于 Python 中的数字你可能不知道的 3 件事

宇宙之一粟

Python 6月月更

如何低成本快速搭建企业知识库?

小炮

一张图解码 OpenCloudOS 社区开放日

腾源会

视频爆炸时代,谁在支撑视频生态网高速运行?

郑州埃文科技

flow IP地址 NetFlow

关河因果将机器学习融合逻辑规则,突破黑盒壁垒

6979阿强

数据分析 大数据分析 关河因果 关河智图 因果分析

学习 | 写论文看这一篇就够了~

写程序的小王叔叔

学习笔记 论文阅读 论文写作 6月月更

年中大促 | 集成无忧,超值套餐 6 折起

融云 RongCloud

支持在 Kubernetes 运行,添加多种连接器,SeaTunnel 2.1.2 版本正式发布!

Apache SeaTunnel

Apache 大数据 开源 workflow

Fegin的解析

卢卡多多

OpenFegin 6月月更

5分钟快速上线Web应用和API(Vercel)

Liam

前端 前端开发 开发 Postman API

51万奖池邀你参战!第二届阿里云ECS CloudBuild开发者大赛来袭

阿里云弹性计算

阿里云 分布式缓存 开发者大赛 加密计算 大数据加速

再读凤凰架构-分布式架构更清晰

AiDaddy

分布式 凤凰架构

博睿数据出席阿里云可观测技术峰会,数字体验管理驱动可持续发展

博睿数据

可观测性 智能运维 博睿数据 数字体验管理

万字攻略,详解腾讯面试(T1-T9)核心技术点,面试题整理

C++后台开发

后台开发 面试题 Linux服务器开发 C++后台开发 腾讯面试

社区专家谈Ruby及Rails的发展_Ruby_崔康_InfoQ精选文章