作者ericyu (Eric)
看板Ruby
标题Re: [连结] 松本行弘: Code 的世界~成为超级程式设 …
时间Sun Aug 9 13:59:38 2009
拿到书了,片段片段摘译了前言与第一章的部份内容。欢迎指教有问题的地方。
(有些地方也没办法看得很懂...)
= 前言 =
本书并非深入讲述特定技术的书籍,也不是 Ruby 解说书,而是俯瞰程式
开发技术的一本书。不是详细地图,而是技术的世界地图。
每种技术和考虑都有其目的与历史,以及发展和进步的经纬。本书尝试退
一步重新思考这些技术。
本书 2~14 章是以 2005/5 ~ 2009/4 间在日经 Linux 杂志连载的专栏为底,
添加内容与修正。第一章「我为何要开发 Ruby」则是新写的。
= 第一章 我为何要开发 Ruby =
Ruby,在日本诞生的程式语言,近年来特别因为在 Web 方面的高生产力而
受到世界注目,应用范围也广及企业领域。
不过一开始也不是因为要让世界使用等理由而开发的,只是身为工程师的
我为了兴趣而开始的。
若问我为何要开发 Ruby,最适当的答案应该跟 Linux 开发者 Linus
Torvalds 所说的一样:
"Just for fun"
从高中开始学写程式时,不知怎麽的就被程式语言吸引。周遭喜欢电脑的
人通常是「想做游戏」、「想计算」等「要写什麽程式」,而我则被「要
用什麽程式语言」、「用什麽程式语言会更愉快」这些事情没来由地吸引。
高中时还没有自己创作程式语言的技术与技术,连自己的电脑也没有。但
是读了程式语言的文章与书籍,後来大学时研究主题选了程式语言,十年
後以 Ruby 的形式实现了梦想。
1993 年开始创作 Ruby 以来虽经过 16 年,中间从没有讨厌或厌烦了
Ruby 的设计过。程式语言真的很有趣。
== 程式语言的重要性 ==
因为语言是人类思考的本质。语言会影响说话者的思考。(这里还提到
Sapir-Whorf 假说,请见
http://tinyurl.com/krz6nv )
20 年来的名着「人月神话」也提到「程式人员一定时间内能产出的程式码
行数是一定的,不论用什麽语言」。假设这是真的,那麽一天五百行,
用组合语言,C,或是 Ruby 都是五百行。
但这五百行能做到的事有天壤之别,根据选择的语言,可能有十倍百倍甚
至千倍的差距。
没有软体的电脑只不过是个箱子,能够更快速更便宜地开发程式语言是我们
所企求的。
写程式不只是为了乐趣,还要为了社会整体变化追求高生产力。程式语言
因此成了解决软体危机的重要工具。
== Ruby 的原则 ==
Ruby 原来只是我为了兴趣而作的,其设计参考了古今东西的语言,这个功
能好,那个功能有点... 等,在之间取舍平衡与选择。
什麽都不思考就拿进来的话,会成为扭曲的语言,丧失新语言的存在价值。
语言设计困难之处就在这之间的取舍,幸好 Ruby 在这方面做得不错,许
多人都给了不错的评价。
Ruby 的目标是为了让我(设计者)能够快乐地写程式,并因此提高生产力。
因此,有以下三个设计原则:
* 简洁性
* 延展性
* 安定性
== 简洁性 ==
Paul Graham 说「简洁就是力量」。
随着程式语言进步,我们能够更简洁地书写,更抽象化。电脑性能提昇也
让以前程式语言不允许的事情变得可能。
譬如物件导向语言,执行时成本较高,但现在是能允许的。为了能提高开
发生产力,稍微浪费一些电脑性能,在现在这时代大家也不会生气。
另外像是记忆体管理,现在就交给 garbage collection。变数型别在执行
期才检查。
来看看阶层计算的例子。
图一 Java
class Sample {
private static int fib (int n) {
if (n<2) {
return n;
}
else {
return fib (n-2) + fib (n-1) ;
}
}
public static void main (String[] argv) {
System.out.println ("fib (6) ="+fib (6)) ;
}
}
图二 Ruby
def fib (n)
if n<2
n
else
fib (n-2) + fib (n-1)
end
end
print "fib (6) =", fib (6) , "\n"
演算法相同,但 Ruby 的看起来密度较低。Ruby 不需要明确给定型别,
不必要的型别指定可以省略,因此可以较简洁。
演算法教科书使用虚拟程式码来描述演算法,若要实际使用,就要处理类
似指定型别这些非本质的部份,而无法集中在演算法的本质部分。
如果能直接执行虚拟程式码不是很好吗?像 Ruby 这样以高生产力为目标
的语言就是这种「可执行的虚拟程式码」。
== 延展性 ==
1999 年第一本 Ruby 书写到 Ruby 不适合的领域是「数值计算为主体的
程式」以及「数万行的程式」。不过在几年後,已经有数十万行的程式,
连 NOAA 及 NASA 也在使用 Ruby。
为了程式语言的延展性,需要「抽象化」 (abstraction)。Ruby 开发当时
(1993) 没什麽人认为可以在 script 语言里用物件导向程式,连内建型
别都是都以 class library 方式提供的可说是相当稀奇。之後看 Ruby
的成功,我想这个判断是成功的。
Ruby 的延展性可不只这些。
例如像 Lisp 的一样的高阶函式语言内的 block,用程式人员容易理解的
方式提供,将控制结构 (control flow) 这种高阶函数语言中也能让使用
者自行定义的延展性提供给「普通人」。另外,能够自由扩充既存 class
的 open class,也提供了更大的弹性(以若干危险性交换)。
这些功能的共通点是,对程式语言来说,对程式人员提供最大程度的延展
性的这种态度。另外,不是保护程式人员写错的安全性,而是重视能自行
负责、提供最大程度能力的弹性。身为 Ruby 设计者的我是 Ruby 最初的
target user,因此,比起保护自己,能够发挥自己最大程度的力量更为重要。
关於延展性,还有一个不能不提的是,「没有先入为主的限制」。例如初
期的 Unicode(全世界文字只需 16-bit 即可容纳),西元年份两位就够
引起的 Y2K 问题等。Ruby 整数的表现范围没有限制,尽力做到排除这种
先入为主的限制。
== 安定性 ==
即使是非常重视延展性的 Ruby 也有长年拒绝加入的功能,也就是巨集
(macro),特别是 Lisp style 的巨集。有了巨集,可以随意扩充语言。
为了 Ruby 拒绝此功能?因为此功能会造成各程式发展到最後就如同不同
语言一般,有不同的文法与单字。
程式设计除了写以外,读也会花许多时间。解读时的路标就是语言的文法。
「这里是呼叫函式」、「这里是条件分支」等常识在解读程式时是很重要的。
若导入巨集功能,会引起严重的副作用,这里到底是函式呼叫,控制结构,
还是要代入什麽,得再查文件才能知道。
嗯,也许世界上也有不会为此所苦的 Lisp 程式人员,不过我认为这只是
少数人。
要能在世界上普及的程式语言,我相信必须要有「不为风所摇动的核心」
的文法。
== 都是为了乐趣 ==
程式语言存在目的是为了生产程式,以及尽可能有效率地生产。还有与程
式设计的快乐连结在一起。
在国外活动等演讲後,有许多人跟我交谈,其中典型的就是「用了 Ruby
以後又能快乐地写程式了,谢谢。」
写程式本来就很快乐,是既刺激又富创造性,让人兴奋的知识活动。我想
起中学时用 BASIC 这种贫弱的语言写程式时也很快乐,不过也有因为工作、
期限等而造成不快乐的程式撰写,这是世间常情。
即使如此,Ruby 所提供的生产力若能解开程式人员身上的枷锁,重新找回
程式设计的乐趣的话,那就是我开发 Ruby 的理由。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.31.3
1F:推 dryman:感谢分享! 08/09 14:17
2F:推 godfat:翻译得很顺畅 :D 08/09 16:43
3F:推 itsZero:感谢您的翻译,看的很快乐XD 08/09 17:08
4F:推 poga:有看有推 08/09 17:12
5F:推 zero00072:感谢翻译及分享,我也觉得很快乐。 08/09 18:04
6F:推 huge:不知翻译得如何,但是文章超顺的 08/09 23:49
7F:推 andyhorng:感谢分享! 08/10 00:14
8F:推 chchwy:推推 太棒啦 还有续集嘛XDDDD 08/10 10:41
※ 编辑: ericyu 来自: 140.112.31.3 (08/10 19:06)
9F:推 fcamel:感谢翻译, 看了这篇解开我对 macro 的一些疑问 08/10 21:47
10F:推 reizarc:推 看起来是很直得一读的书 08/12 23:46
11F:推 ericsk:看到 ericyu 大神快拜 m(_ _)m 08/13 16:25
12F:推 TJS:m(_ _)m 08/14 22:58
13F:推 johnnycgi:看到还蛮想弄一本来看的 05/25 02:53
14F:推 ptta:感谢~翻译得很好! 07/23 15:41