今年早期,我被邀请在一个Ruby会议上发言.
我很高兴去那里,但我觉得在那里我是个外人. 我没有写过多少Ruby,但我仰慕这种语言很久了.
我有很多的朋友都放弃了C++和Java,投奔了Ruby和Python.大部分的人都很满意. 他们用这些语言做了很好的项目,而且很亨受.
他们用实际行动证实:所担心的动态语言会带来恶梦般的结果并非不可避免. 你完全可以使用动态语言编写出安全可靠、高质量的程序.
他们一直以来都这样做,但我认为这是和文化有关的。 如果你在一个文化圈内,你在圈内听到一些事情,你觉得很正常,但圈外的人听起来会觉得很奇怪.
如果你不在圈内,你也会奇怪.
对于Ruby,我现在的处境就是这样,在一定程度上。
我没有写过大型的Ruby程序.
我只是用这种语言程序进行过修改,写过一些小工具,到此为止,从来没有真正的浸润在其中。但这并不影响我在边上对这种有趣的语言保持关注。
我曾经提到过,让我感到惊奇的事情之一是Ruby迷们对这种语言的态度与众不同。 我在他们身上发现了一种在其他语言文化中不曾见过的责任道德.
责任道德? 我说的是什么意思呢?
我
想我可以用这种方式解释清楚. 在许多的语言社团里,人们非常关心用“正确”的方法做事情.
他们知道语言里的所有缺点和优点,他们料到有些特性可能会被错用.
于是他们开始编写编程见意和程序风格指导-所有的资料都是来告诉你如何在这种语言里避免这种错误的. 这些建议不停的在增加,改进.
大部分都围绕着合法程序的缺陷问题. 因为有些编程语言真是很难让你去正确的使用. 其他的一些建议最终成为语言文化的一部分.
如果某种编程语言提供了你可以对程序设计进行强制约的方法,如果你不用,就会显得不太正确.
举个例子,我们可以看看C++和Java里的封装和final.
这两种数据定义几乎做的是相同的事情.人们也不厌其烦的告诫要去如何使用它们来保护抽象性.
可是,有趣的是,像Ruby,Python这样的语言里不存在类似的现象.但他们仍然写出了健壮的程序.
我
们先不讨论动态和静态的问题,花几分钟看看其它问题. 我觉得更重要的一个问题是风格问题.
在某些语言中你会有这样的感觉,语言的设计者会告诉你有些东西很危险,以至于你要避免用它,要用有效何工具检测这些特性是否被误用.
结果是整个语言社区把大量的时间花在写处方,提建议和变相方案上. 而且,如果这种语言不提供可以约束人们习惯错用的做法的功能,人们会很生气。
在Ruby圈里我却没有发现这种文化。
用Ruby,你几乎可以做你能想象到的任何事情。
你可以修改类库里的任何类,将aspect-y行为编织进去,并且可以做一些接近疯狂的meta编程。 也就是说,一切全在于你。 你对自己负责。
如果什么地方出错了,你只能责怪自己。
你不能责怪这种语言的设计,责怪它没有某种功能、导致需要你去自己实现,你也不会责怪它会阻拦你做什么事情,因为它不会阻拦你。
所以,为什么没有很多人因此而崩溃和玩过火呢? 我想这有一个很好的理由。 权利越大,责任越大。 你掌握自己的命运。 而且,这样,我认为,是一种提升你的责任心的方法。
多
少年来,在软件业,我们一直以为,有些语言提供的功能过于强大,很容易让开发者误用。 C++不提供反射机制, Java/C#禁止多重继承。
可是,每次,我们发现,当程序员因正当的理由要求的功能没有被提供,而采取的临时解决方案,这种做法带来的坏处比语言提供那种功能带来的坏处要大的多。
Blocks 和 closures 就是典型的例子。
今天的世界上有无数的应用都有各种重复的代码,实际上你完全可以通过模板的设计模式或者通过微型类打包变量的做法消除这些重复。 如果有了blocks
或 closures,程序员就可以消除重复,达到最洁净的程序设计效果。
Meta编程是另外一个好例
子。 商业应用里到处都有我们需要知道一段数据的值,类型,名称的情况,然而,我们的语言却让我们不得不一次次的手工编写这样的功能。
事实上,我们花了近十年的时间才发展出来像Rails里的ActiveRecord这样有用的东西,归咎其原因就是人们担心有些语言的某些功能过于强大的
心理在作怪。
我们为这种态度付出了应有的代价。 幸运的是,我们已经不再是当年的想法了。
新诞生的编程语言都把责任交给开发者自己。 但是,语言设计者们都还坚持他们的推理方式 - 他们认为有些东西就是不应该被允许。
如果你想找一个按这种方式推理的例子,请看Bruce Eckel 博客里的 metaprogramming 部分 ( http://www.artima.com/weblogs/viewpost.jsp?thread=260578
). 我敬重 Bruce,并且我明白他并不是以一个语言设计者的身份说话,但我提到他只是作为一个这样推理类型人的例子 -
他们按照他们的逻辑推理出在一个语言里什么东西应该不被允许,而不是把控制和责任都交到编程者的手里。
也许语言设计者们把我们可能需要元数据编程的地方的95%都考虑到,并提供了方案。但这样做值不值得,而且并不等于剩下我们对其他的问题的变通方案的工作
努力只占剩下的5%。 还有额外的代价对人们对语言的责任感和拥有感的降低。 我想人类的度量方式对软件的影响要远大于人们的想象。
可这个问题的实际情况是:任何一种语言都可能产生混乱。 语言的设计者不可能阻止的了。
他们所能做的就是断定什么样的混乱可能会产生,以及产生这些混乱的难易度。 但是,在他们做定论时,他们还是迫不及待的把那些过于强大的功能给去除了。
程序员们不会这样做。 他们能为自己负责。 实际上,最终必将是,除了程序员自己,没人能负这个责。
外刊IT评论
相关推荐
共享软件时代的终结一文提出的观点是否正确,大家 仍然可以讨论
p2p 终结者 p2p 终结者p2p 终结者 p2p 终结者 p2p 终结者 p2p 终结者p2p 终结者 p2p 终结者 p2p 终结者p2p 终结者 p2p 终结者 p2p 终结者 p2p 终结者p2p 终结者p2p 终结者 p2p 终结者p2p 终结者 p2p 终结者 p2p 终结...
C++终结者课程设计:小游戏“终结者”程序的设计与实现。该课程设计在软件学院教学实验中心进行。学生应独立完成该课程设计的游戏程序 - 终结者(Terminator)软件项目。游戏程序采用面向对象的设计与编程方法,...
《心灵终结3.0 修改器》是一款专为热门即时战略游戏《心灵终结》3.0版本设计的游戏辅助工具,由VB(Visual Basic)编程语言编写而成。VB是一种面向对象的编程语言,以其简洁的语法和易学性在编程领域广受欢迎,尤其...
互联网周回顾:微视时代终结 弹幕A站命悬一线.docx
反P2P终结者则是针对P2P终结者而设计的一款软件,它的主要目的是保护用户免受P2P终结者的限制。当用户发现自己被P2P终结者监控或限速时,可以使用反P2P终结者来解除这些限制,恢复正常的P2P网络连接。反P2P终结者...
驱动防火墙终结者 驱动驱动防火墙终结者 防火墙终结者 驱动防火墙终结者 驱动防火墙终结者
灰色按钮终结者 灰色按钮终结者 灰色按钮终结者 灰色按钮终结者 灰色按钮终结者 灰色按钮终结者 灰色按钮终结者
而“AD库终结版”则是一个全面的、积累了日积月累经验的Altium Designer库资源集合,它包含了大量的封装库和元件模型,旨在为设计师提供便利,提高设计效率。 1. **库的概念**:在Altium Designer中,库是存储元...
完整pb用户自定义报表设计器(终结版) 本程序无须安装,解压后直接运行可执行程序即可,在第一次运行时需要注册演示数据库。 一般来说,在第一次运行时,系统会自动打开数据库连接界面,通过它,你可以 连接到任何你...
编写程序:输入任意文法,统计Vn,Vt Vt表示为终结符,Vn表示非终结符 汇编原理的第一个代码实现
完整pb用户自定义报表设计器(终结版) 如何看演示数据库 本程序无须安装,解压后直接运行可执行程序即可,在第一次运行时需要注册演示数据库。 一般来说,在第一次运行时,系统会自动打开数据库连接界面,通过它,...
易游还原终结者易游还原终结者易游还原终结者易游还原终结者易游还原终结者易游还原终结者易游还原终结者易游还原终结者易游还原终结者易游还原终结者易游还原终结者易游还原终结者易游还原终结者易游还原终结者易游...
通过该课程设计,使学生熟悉路由器、交换机的配置及相关命令。根据网络案例设计出包括网络拓扑结构图、IP分配及规划、特殊网络应用技术和网络测试及协议分析。从而提高设计方案的分析、设计、论证、实现及文档规范...
"AV终结者"很可能是一个专门设计来对抗这些威胁的工具,它的出现是为了应对那些能够绕过传统反病毒软件的恶意程序。这种类型的软件通常会包含先进的检测和清除机制,以及实时保护功能,以防止病毒、木马和其他恶意...
【论坛终结者2.5】是一款专为管理论坛而设计的高效工具,它集成了多种功能,旨在提升论坛运营效率并优化用户体验。这款软件适用于基于主流的论坛软件平台,如Discuz!、PHPWind等,旨在帮助管理员进行更便捷、更精细...
P2P终结者4.26是一款专为网络管理设计的实用工具,尤其针对局域网环境中的带宽控制问题。它能够有效地抑制BT、电驴等P2P下载软件过度占用网络资源,从而确保网络的顺畅运行,对提升整体网络性能具有重要意义。 首先...
这是“石油时代”的终结?
"av终结者杀毒软件"是一款专门针对名为"av终结者"的恶意软件设计的杀毒工具。在网络安全领域,"av终结者"通常指的是一种蠕虫病毒,这类病毒以其高传染性和复杂性对用户的计算机系统构成严重威胁。蠕虫病毒能够自我...
图标终结者