URN Logo
UNIX Resources » Linux » China Linux Forum » Python 编 程 » 8 » 访问Matz(转)
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
访问Matz(转)
Author: IPOz    Posted: 2005-07-09 12:57    Length: 17,832 byte(s)
[Original] [Print] [Top]
注: Matz 就是著名的编程语言 Ruby 的创始人(日本人),这段对话翻译自 oreillynet.com 网站对 Matz 的访谈。英文文章原址:http://www.oreillynet.com/pub/a/linux/2001/11/29/ruby.html。

  特别授权5D多媒体,未经本人同意,不要任何地方转载这篇翻译文章(最先发表在本人的网站 http://www.eiffelqiu.com)。


Ruby 创始人

  Ruby 被称一种纯面向对象的语言,它试图集成脚本语言中最好的特点,它本身是用 C 语言开发的,但是在设计的时候更多地考虑到了拥有 Perl,Python 的能力。虽然起源于日本,但是Ruby已经渐渐在美国得到了瞩目。Yukihiro Matsumoto (网上被称为 Matz)是 Ruby 的创始人,同时也是O'Reilly 最新出版的语言类书籍 “Ruby in a nutshell” 的作者。

  Matz 是一位专业的程序员,他在日本的开源公司 netlab.jp 工作。他也是日本最为著名的开放源码传播者之一。他发布了许多开源的产品,包括 cmail,一个基于 Emacs 的邮件客户端程序,完全用Lisp 写的。Ruby 是他第一个在日本以外国家成名的软件。 最近我们跟Matz 谈起了Ruby 的历史,Perl , Python 对 Ruby 的影响以及为什么我们需要另外一种脚本语言。

  以下就是采访片段:

Stewart:
  让我们从回顾历史开始吧,您为什么要决定开发 Ruby 语言?

Matz:
  那追溯到 1993 年的事情了,我当时跟一个同事谈起了脚本语言,它们的强大的功能和可能性给我留下了深刻的印象,我觉得脚本语言是条正确的道路。

  作为一个长期的面向对象编程的忠实拥护者,对我来说面向对象编程也非常适合于脚本语言,所以我开始在网上搜寻。我发现了 Perl 5,当时它还没正式推出,正打算实现一些 OO 的特点,但是那不是我想要的, 我最终放弃了将Perl 作为一个面向对象脚本语言的企图。

  后来我发现了 Python, 它是一个解释型,面向对象的语言,但是我觉得它不是一个“脚本”语言,除此之外,它还是一个包括了过程编程和面向对象编程的混合型语言 。

  我需要的是一个比 Perl 更强大,比 Python 更面向对象的语言,这就是为什么我决定设计我自己的语言的原因。

Stewart:
  你什么时候真正开始编写 Ruby 的? 最终花了多长时间才使成为一个可用的语言?

Matz:
  我开始开发 Ruby 是 1993 年的 2 月 24号, 第一个 Ruby 版本的“Hello world” 运行的时候是同年的夏天。第一个 Alpha 版本发布于1994 年 12 月。

Stewart:
  你是单独完成它的吗?或是由开源社区贡献了大部分代码?

Matz:
  直到 1996 年,我都是独立在开发它,打那儿以后,一个 Ruby 社区形成了,他们帮了我很大的忙,但是我仍然做绝大部分的工作,但是很多人给我提供的代码的修补和补丁。

Stewart:
  日本的开源社区有多活跃?和美国的开源社区运动相比,你觉得如何?

Matz:
  非常的活跃,但是我觉得比美国的社区在规模上要小。

Stewart:
  你怎么会想起用 "Ruby" 这个名字的?

Matz:
  Ruby 是一种珍贵宝石的名字(红宝石)。它不是什么简称。当我始这个语言项目的时候,我就跟一个同事开玩笑说,这个项目必须以一个宝石的名字来命名(比如 Perl),我的朋友想出了“Ruby”,它是一种美丽珍贵的宝石的简称。所以我就采纳的这个名字,它最终成为了这个语言的官方名字。

  后来我发现 Pearl(珍珠)是六月的诞生石,而Ruby 是七月的诞生石, 我认为Ruby 这个名字作为 Perl 之后的一门语言的名字真是再恰当不过了。

Stewart:
  你在设计 Ruby 的时候有什么指导原则吗?

Matz:
  是的, 我称之为“最少的惊奇”,我觉得人们在编程的时候都希望表达他们自己的思想,他们并不想使用语言来斗争。编程语言对程序员来说应该显得自然。 我试图让程序员在使用 Ruby 的时候感受到编程的乐趣,而将注意力集中在编程的趣味和创新上来。

Stewart:
  你在 Ruby 的邮件列表中很活跃,在那里最通常的问题是什么?

Matz:
  各种各样的问题,从“我如何在 windows 2000 的机器上安装 Ruby” 到 “你能将我的补丁合并进来修复你的错误吗”,应有尽有。 Ruby 社区中的人是如此的不同而又互相友好,真是让人惊奇,我相信社区是 Ruby 最强大的力量。

Stewart:
  在 Slashdot 或其他网站上,如果提及 Ruby , 有个问题总是会反复出现,“为什么会需要另外一种脚本语言?”,你对这个问题的想法是怎样的?

Matz:
  为什么需要另外一种语言?理论上,不需要。我们只是需要一个图灵机来解决我们所有的问题。人们需要更多复杂的工具来编程,这是人类的需求。只有有人觉得使用Ruby很快乐,对我来说,这个原因就足够了。

Stewart:
  我注意到,在发明 Ruby 之前你在使用 Perl 和 Python. 在 Ruby 中你集成了 Perl 的那些部分?

Matz:
  很多。 Ruby 的类库是对 Perl 语言功能的面向对象重组,另外添加了一些Smalltalk 和 Lisp 的东西。我想我是用了很多 Perl 的东西, 不过我不应该继承一些风格丑陋的变量。

Stewart:
  那么 Python 呢?你试图重用这个语言中的哪些特点?

Matz:
  远比 Perl 要少,但是我还是偷学了一些东西,比如异常名,另外我从它的源码中学到很多东西。

Stewart:
  如果人们已经熟悉了 Perl 和 Python, 他们有什么理由要转到 Ruby 上来呢。

Matz:
  为什么要转到Ruby? 如果对Perl 或者 Python 很满意,就不需要转到 Ruby上来。但是如果确实觉得需要一门更好的语言,Ruby 可能就是你的选择。学习一种新的语言并没有害处。它给你新的想法和见解,你不比转到它,可以仅仅学习和试试。 在你觉得 Ruby 使用起来非常舒服的时候再决定转到使用它。

Stewart:
  你觉得 Ruby 在日本如此成功,但是在美国和欧洲并流行是什么原因呢?

Matz:
 Ruby 自从 1995 年第一次正式发布就在日本有了名气,直到 1997 年才有了英文文档。 在 1998 年建立 Ruby-talk邮件列表之前我没有对Ruby 做过任何宣传,所以,对非日语国家来说,这是一门非常新的语言。我想这是主要原因。

  现在我们有了关于 Ruby 的英文书籍了,就像我的这本 “Ruby in a Nutshell" 。社区也在发展,去年日本之外没有人知道 Ruby 是什么。今年,人们知道Ruby是一个语言的名字,我想今后三年情况会有所改观。

Stewart:
  文化差异是否也在其中起了作用?

Matz:
  我不这么认为。我设计 Ruby 是为了尽量减少我的惊奇。当世界各地的人告诉我Ruby 减少了他们的惊奇并让他们享受到编程的快乐,这多少让我感到惊讶,现在我确信全世界的程序员都是很相像。

Stewart:
  你未来还有什么计划吗?

Matz:


loop do
read and reply mails
write code
write document/article/book
write code
end


Stewart:
  你现在对下一个版本 Ruby 有什么计划吗?

Matz:
  我希望把它做的更快,更稳定。我计划重写 Ruby 2.0 的解释器,代码名是:”Rite“.它将更小,更容易嵌入,线程安全而且速度更快。它将使用字节码引擎。它可能要让我花上几年的时间来实现,因为光维护现在的版本已经让我相当的忙碌了。

关于技术


Bill Venners:
  在一次CIPS Connections的交流中,你曾经说:” 我读过很多开放源码软件的源码,例如,Perl,Python,和很多风格LISP解释器的源码,我知道在写Ruby 之前我应该了解他们“ 你觉得程序员通过读源码可以得到哪些益处?

Yukihiro Matsumoto:
  程序员通过读源码可以收益颇多。你无法简单的告诉别人如何成为一个好的程序员,你可以向他们提供一些好的编程原则,你可以向他们描述一些你自己的一些好的设计经验,但是你无法给予他们如果成为一个好程序员的实际知识。我相信获取这些实际知识的最好方法就是读代码。写代码当然可以帮助你成为一个好的程序员,但是读代码这种方式更好一些。

Bill Venners:
  为什么

Yukihiro Matsumoto:
  因为成为一个好的程序员实际上是跟经验有关,代码是对程序员思想,态度,想法的表达。通过读代码,你不仅可以了解程序员要完成一个什么特殊的任务以及知道他们是如何实现的,而且你也可以通过他们的思考方式而增长见识。这就是为什么读程序可以让你成为更好的程序员的原因。除此之外,如果你想知道如何用代码实现一些东西,你可以打开一本计算机科学方面的书籍,书本可以向你解释算法,但是如果你想更快的了解算法,那么读代码将是最好的方式。此外,你可以执行代码以实现算法。你可以在代码执行算法的时候使用一个调试器来观察它。这种方式要远比读书本要好。

Bill Venners:
  在CIPS Connection的交流中, 你给出了程序员的十个技巧。其中之一是: ” 学不只一种程序语言,最好是不同风格的,比如脚本语言,面向对象语言,函数式语言,逻辑式语言,等等“,学习多种程序语言有什么好处?

Yukihiro Matsumoto:
  每个程序或者系统都有它自己的文化。每种语言或者系统都有自己的核心概念。这些概念中大多数是好的,但是他们是不同的,通过学习多种语言和系统,你可以接受不同的想法,进而增强你自己的观点。

  例如,如果你不了解Prolog语言,你就不会了解目标指导性编程的威力(通过应用指定规则描述要解决的问题来编程的方式)。这是一个非常有趣的概念,是一种不同的思考方法。但是如果你不了解Prolog或者谓词逻辑的话,很难自己发现这种思考方式。了解其他的系统和范式将会扩展自己头脑中的世界。这就是为什么我极力推荐学习多种语言的原因。

Bill Venners:
  在你的十个最高技巧中你也说过:”不要太过多的关注于工具,工具是会变化的,而算法和基本概念不会“,你这是什么意思。

Yukihiro Matsumoto:
  部分是关于以人为本而不是以机器的观点。人的变化非常的慢,但是系统变化的非常快。100 年前的人们和现在没什么太大的不同。 100 年前我们没有计算机,50年前我们拥有了计算机,但是他们非常原始。从今之后的20年,我无法想象计算机将会是什么样子的,但是我可以想象的出20年后的人们将会如何思考。

  另外一个例子是数学。数学拥有非常悠久的历史。它是非常成熟的科学,但是计算机科学不是。所以从数学中获取思想是非常好的。

  工具会随着时间的流逝轻易的变化。如果你太多的关注现在的工具,那么你的努力只能得到短期的回报。如果你想获得持久的收益,你应该更关注一些基础的东西。关注数学和人类心理学。关注那些已经建立起来的科学和已经建立起来的思维方式。


懒惰

Bill Venners:
  你曾经在你的十大技巧中提到:”懒惰,机器将会服务于人类。经常程序员会不经意的服务于机器。让机器服务于你。尽可能做哪些让你懒惰的事情“,为什么我们要设法变得懒惰?

Yukihiro Matsumoto:
  因为你想变得懒惰。你要做任何可以减轻自己工作的事情,我努力工作来减轻自己的工作,变得懒惰。

Bill Venners:
  我相信这点

Yukihiro Matsumoto:
  我非常渴望变得懒惰。


考虑接口

Bill Venners:
  你在十大技巧中也提到了:”对他人友好,首先考虑接口: 人对人,人对机器和机器对机器的接口。再次记住人的因素是非常重要的 “ ,你这是什么意思,”首先考虑接口?“

Yukihiro Matsumoto:
  接口是我们作为一个用户所看到的一切。如果我的计算机正在内部做非常复杂的事情,但是复杂性并没有表露在外面,我不在乎。我不在乎计算机是否在内部辛苦的工作。我只要以好的方式呈现正确的结果。这就是说接口就是一切,至少对于普通的计算机用户使用计算机的时候,情况就是如此,那就是为什么我们要关注接口的原因。

  一些软件人士,比如天气预报员,数字计算者,他们更多的是了解事物的内部,但是他们所处的是非常有限的计算机科学领域。大多数程序员需要关注表面,接口,因为对他们来说那才是最重要的。

Bill Venners:
  你也提到了机器对机器的接口,你的意思是不是仅仅是对用户的接口或者机器的接口

Yukihiro Matsumoto:
  不只是用户接口。当机器之间通过一个协议互相对话的时候,他们不在乎对方内部是如何实现的,最重要的是通过恰当的协议正确的传递恰当的结果,这才是最重要的。

  如果你有的系统有一个好的接口,足够的时间和财务预算,你可以继续工作在你的系统上。如果你的系统有错误或者是太慢,那么你可以改进它。但是如果你的系统有一个糟糕的接口,那么你就基本上是一无所有了。内部实现有多高的技巧并不重要。如果你的系统有一个糟糕的接口,没有人会使用它。所以接口或者系统的表面特征,无论是对用户还是对其他机器来说,都是非常重要的。

使用 Blocks 做循环抽象  

Bill Venners:
  Ruby 支持 blocks 和 Closure 结构. 什么是 blocks 和 Closure,他们如何使用?

Yukihiro Matsumoto:
  Blocks 基本上就是匿名函数。你可能熟悉诸如Lisp 或 Python等其他语言中的Lambda 函数。 你可以向另外一个函数传递一个匿名函数,这个函数可以调用这个被传递过来的匿名函数。例如,函数可以通过一次传递给匿名函数一个元素来执行循环迭代。在那些可以将函数当作第一类型的编程语言中,这是个通常的方式,称为高排序函数样式。 Lisp 可以这样,Python 也是如此,甚至就连C 也可以通过函数指针实现这点。很多其他语言也可以做这样的编程。在 Ruby中,不同之处只是在高排序函数语法风格上有所不同。在其他语言中,你必须显示的指出一个函数可以接受另外一个函数作为参数。但是在Ruby 中,任何方法都可以 Block 作为一个隐性参数被调用。在方法中,你可以使用 yield关键字和一个值来调用 block.

Bill Venners:
  Block 的好处是什么?

Yukihiro Matsumoto:
  基本上,Block 是被设计来做循环迭代抽象的。Block 最基本的使用就是让你以自己的方式定义如何循环迭代。

  例如,如果你有一个列表,序列,矢量组或者数组,你可以通过使用标准库中提供的方法来实现向前循环迭代,但是如果你想从后往前实现循环迭代呢?如果使用 C 语言,你得先设置四件事情:一个索引,一个起始值,一个结束条件和一个递增变量。这种方式不好,因为它暴露了列表的内部实现方法,我们希望能够隐藏内部逻辑,通过使用 Block 我们可以将内部循环迭代的方式隐藏在一个方法或者函数中。比如,调用list.reverse_each,你可以对一个列表实现一个反向的循环迭代,而不需要知道列表内部是如何实现的。

Bill Venners:
  就是说,我传递一个 Block 结构,这个 Block 中的代码可对循环迭代中每个元素做任何事情,至于如何反向遍历就取决于List 本身了。换句话说,我就是把原本在 C 语言 Loop 循环中写的那些代码作为一个 Block 来传递。

Yukihiro Matsumoto:
  对,这意味着你可以定义许多迭代的方式。你可以提供一种向前循环迭代的方式,一种向后循环迭代的方式,等等。这全取决于你了。C#也有迭代器,但是它对于每个类只有一个迭代器。在 Ruby 中你可以拥有任意数量的迭代器。例如,如果你有一个 Tree 类,可以让人以深度优先或者广度优先的方式遍历,你可以通过提供两种不同的方法来提供两种遍历方式。


Bill Venners:
  让我想想是否我了解了这点,在 Java 中,它们是通过 Iterator 接口实现抽象迭代的,例如,调用程序可以让 Collection 来实现 Iterator。但是调用程序必须使用循环来遍历Iterator 返回的元素。在 For 循环中, 我的代码实现对每个循环迭代的元素的处理,这样循环语句将总是显示在调用程序中。 使用 Block , 我并不调用一个方法来获取一个迭代器,我只是调用一个方法,同时将我希望对循环迭代中每个要处理的元素的处理代码作为一个 Block 块结构传递给该函数。 Block 的好处是不是将一些代码从调用程序中的 for 循环中提取出来。

Yukihiro Matsumoto:
  实现循环迭代的具体细节应该属于提供这个功能的类。调用程序应该尽可能的少知道这些。这就是 Block 结构的本来目的。实际上,在早期版本的 Ruby 中,使用 Block 的方法被称为迭代器,因为它们就是被设计来实现循环迭代的。但是在 Ruby发展过程中,Block的用途在后来已经得到了很大的增强,从最初的循环抽象到任何事情。

Bill Venners:
  例如。。。。

Yukihiro Matsumoto:
  我们可以从Block 中创建一个 Closure 对象,一个 Closure 对象就是像 Lisp中实现的那种匿名函数。 你可以向任何方法传递一个匿名函数(即 Closure)来自定义方法的行为。另外举个例子,如果你有一个排序的方法用于排序数组或者列表,你可以定义一个 Block来定义如何在元素之间进行比较,这不是循环迭代。这不是个循环,但是它使用了 Block 。


使用Closures

Bill Venners:
  什么使得 Block 成为了一个 Closure?

Yukihiro Matsumoto:
  Closure 对象包含可以运行的代码,是可执行的,代码包含状态,执行范围。也就是说在Closure 中你捕捉到运行环境,即局部变量。因此,你可以在一个Closure中引用局部变量,即是在函数已经返回之后,他的执行范围已经销毁掉,局部变量依然作为一部分存在于Closure对象中,当没有任何对象引用它的时候,垃圾搜集器将处理它,局部变量将消失。

Bill Venners:
  这么说,局部变量基本上是被方法和Closure 对象共享的?如果 Closure 对象更新了变量,方法可以看到,如果方法更新了变量,Cosure 对象也可以看到。

Yukihiro Matsumoto:
  是的,局部变量在Closure 和方法之间共享,这是真正的 Closure,它不仅仅是复制。

Bill Venners:
  一个真正的 Closure 有什么好处?一旦我将一个 Block 变为一个 Closure,我能用它做什么?

Yukihiro Matsumoto:
  你可以将一个 Closure 转换为一个 Block,所以 Closure 可以被用在任何Block可以使用的地方。通常, Closure 用来将一个 Block的状态保存在一个实例变量中,因为一旦你将一个 Block 转换为一个 Closure, 它就是一个通过变量可以引用的对象了。当然Closure 也可以像其他语言中那样使用,例如传递给对象以实现对方法行为的定义。如果你希望传递一些代码来自定义一个方法,你当然可以传递给它一个Block. 但是如果你想将同样的代码传递给两个方法(当然这是非常少见的情况),但是如果你确实想这么做,你可以将一个 Block 转换为一个 Closure ,将同一个Closure传递给多个方法。


Bill Venners:
  原来如此,但是获取上下文环境有什么好处呢?真正让 Ruby 的 Closure不同的是它捕捉运行时间的上下文环境,局部变量等等。那么到底拥有上下文环境有什么好处是我们无法通过传递给对象一个代码块所获得的呢?

Yukihiro Matsumoto:
  实际上,说实在的,最主要的原因是向 Lisp 语言表达敬意, Lisp提供了真正的Closure 结构,所以我希望继续提供这个功能。

Bill Venners:
  我看到的一个不同之处是: 数据在Closure 对象和方法之间共享。我想我可以在一个常规的非 Closure 结构的 Block 中放入任何需要的环境数据作为参数来传递,但是 Block 仅仅是对环境数据的一份复制,并不是真正的 Closure.它并没有共享环境数据。共享是Closure 和普通的传统函数对象不同的地方。

Yukihiro Matsumoto:
  是的,共享允许你做一些有趣的代码演示,但是我觉得它对于程序员的日常工作并没有想象的那么有用。这没什么太大的关系,例如像 Java 的内部类那样的普通复制,在许多场合都在使用。但是通过 Ruby 的Clousure 结构,我希望表达我对 Lisp 文化的致意。
----
--
garbage in, garbage out
[Original] [Print] [Top]
« Previous thread
python下的xml.*的读取xml的模块,你们是怎么处理中文问题的?
Python 编 程
8
Next thread »
TKinter好难,学不会,太复杂
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 04:11:09, cost 0.053134918212891 ms.