图灵访谈之三十八:专访松本行弘

2012年11月16日,第4届中国Ruby大会开幕前夕,图灵社区就新书《代码的未来》,以及中国读者所关心的一些话题,采访了Ruby语言设计者松本行弘(以下简称Matz)先生。(采访者:《代码的未来》译者周自恒

周:松本先生今年出版了新书《代码的未来》,这本书的中文版正在由我进行翻译,预计明年会在中国出版。您的上一本书《松本行弘的程序世界》在中国受到了读者的好评,这次的新书和前作相比有哪些不同,又有哪些看点呢?

Matz:《松本行弘的程序世界》一共涉及了14个话题,每个话题都是浅尝辄止,内容比较广泛但不是很深入,而这次的新书则是设定了一个大的主题——即对未来即将到来新技术的思考,因此内容比《程序世界》所涉及的范围要窄一些。此外,这本书还在时间尺度上进行了探讨,例如从计算机出现以来,到现在为止经历了怎样的变化,并由此来思考未来可能会发生的变化,也就是对过去和未来两方面都进行了思考。计算机的世界变化非常快,而这本书的目的在于探讨其未来变化的方向。

周:说起计算机的发展,您在书中还提到了关于摩尔定律的一些话题呢。

Matz:摩尔定律是描述计算机将如何发生变化的一个定律,书中所探讨的不仅包括计算机本身的变化,还包括计算机为周围的环境所带来的变化。

周:关于编程语言进化的方向,保罗·格雷厄姆在一篇名叫“一百年后的编程语言”的文章(参见图灵图书《黑客与画家》P156)中,主张“拥有最简洁最小核心的编程语言”将是未来发展的趋势。对于这一观点,您在书中表示“不同意”,这是为什么呢?您对编程语言发展方向的看法又是怎样的呢?

Matz:保罗是一个很喜欢Lisp的人,而Lisp所具备的特性正好符合他所说的“一百年后的编程语言”的样子,因此保罗认为一百年后的编程语言就应该变成Lisp这个样子。但实际上,Lisp这个语言的历史已经有50多年了,说实话,Lisp现在并没有成为一种有很多人在用的主流语言。我觉得这也许是因为Lisp对于大多数程序员来说不具备那么大的魅力,也就是说,作为一种“拥有最小核心”的语言,或者从某种意义上说是一种很“美丽”的语言,和程序员们所期望的语言之间,存在着一定的差距。如果一两年的时间里,Lisp的魅力没有被大家所接受,那还可以理解,但已经过了50年还没有被广泛接受的话,是不是它在本质上就不太符合大家的期望呢?“对人类来说好用的语言”和“拥有最小核心的语言”之间的这个差距可能是很大的,我觉得可能将来100年也没办法消除。至于未来的编程语言应该是怎样的,我觉得应该是兼具接近Lisp的运行模型,以及人类容易理解的语法这两方面特征,这么一看Ruby是不是更接近这样一种语言呢?

周:松本先生被称为Ruby之父,我们知道在编程语言的设计过程中,可能要做出很多选择,例如动态还是静态、基于原型还是基于类等等。在Ruby的特性中,您认为当初最难做的选择是什么?

Matz:在设计Ruby之前,我在上大学的时候还设计过另外一种语言,而那种语言是完全静态的,和Eiffel语言非常相似。而我原本也是特别喜欢静态语言的,不过上大学时设计的那种语言是以学术研究为目的的,多年之后,当我想设计一种编程语言作为自己的工具来用的时候,我就觉得还是动态语言实际用起来比较好用。抱着这样的想法,我设计了Ruby,现在看来这个设计还是正确的。那么当初对于Ruby应该是静态还是动态这个问题,也许算不上是最难的吧,但至少是我在设计中做出的“最大”的一个判断。而在此之后,因为是动态语言,那就借鉴一下Smalltalk和Lisp吧,Perl有一些功能也不错,于是如此这般吸收了这样一些语言的特性,也就显得比较自然而然了。Ruby的特点在于Mixin模块,而这个特点在Ruby诞生当时还算是非常罕见的,因为我不喜欢多继承,总觉得应该有一个更简单的方式,所以就设计了Mixin模块。

周:那么现在回过头来看,Ruby当中有哪些地方会让您觉得“如果当初设计成这样就好了”呢?

Matz:最开始的时候我的目标只是想实现Perl所具备的功能,因此从Perl借鉴了很多,比如说用美元符号($)来修饰变量名之类的,现在看来觉得学得有点过了,搞得和Perl太像了。当然,除此之外还有其他一些小地方,但最主要的我觉得就是这个了,也就是跟Perl太像了这一点。刚开始的时候,还没有形成Ruby的语法习惯和文化,因此很多东西都是从Perl“抄”过来的,现在看来好像一股脑拿过来的东西太多了,里面其实有一些是不需要的。而经过一段时间之后,Ruby自己的文化已经形成,Rails出现之后又形成了Rails的文化,而到了这个时候再看的话,可能就会觉得这些Perl的部分好像没啥必要呢。

周:大家都认为“Ruby有现在的人气基本上都是由于Ruby on Rails的贡献”,您在书中也认同这个观点,那么您认为Ruby on Rails获得巨大成功的原因是什么呢?

Matz:首先是得益于Web的快速发展,几乎所有的软件开发平台都在瞄准Web这个领域。以往在用CS(客户端-服务器)架构来开发的系统,现在都可以在Web上实现了。在Web上能够开发的应用变多了,这是一个主要的背景。另外,Ruby的优势在于进行软件开发非常容易,也就是开发效率比较高。这两点结合起来,我认为就是Ruby on Rails成功的主要原因。

此外,Ruby还有一些比其他语言强大的特性,例如元编程(Metaprogramming)、通过猴子补丁(Monkey patch)所带来的可扩展性等等,通过这些特性,甚至可以对基础的类进行增强。DHH正是运用了Ruby的这些强大之处,开发出了Rails。而对于没有接触过Ruby的人,比如只用过Java这种比较“死板”的语言的人来说,会觉得“唉?居然还可以做到这样吗?”,我觉得这也是Rails成功的原因之一。

周:据说DHH曾经是准备用PHP来开发这样一个框架的,但后来却转向了Ruby?

Matz:对,因为PHP在元编程方面有很多限制吧。Rails推出之后,又出现了很多(在PHP上实现的)模仿Rails的开发框架,比如Symfony、CakePHP等等,但是Ruby所拥有的强大特性PHP却并非完全具备,即便不考虑它们各自的背景,只是单纯去对比这些开发框架的话,我还是觉得Rails更强大一些,我觉得DHH选择Ruby也正是看重了这一点。顺便,我其实是见过DHH的,在丹麦,那时候他还没开始学习Ruby,说不定那次见面也是对他产生影响的一个原因吧。

周:中国读者很关心的一个话题是,Ruby目前最广泛应用的领域就是Web开发,那么在Web开发这个领域之外,Ruby的发展方向又是什么呢?

Matz:的确,Ruby在Web开发领域被用得很多,例如Rails、Sinatra等开发框架。但编程的世界并非只有Web而已,我也一直希望Ruby能够从Web中走出去。在不久的将来,我认为Ruby有望被应用的领域,主要有三个。

  1. 科学计算(Scientific computing),也就是大学科研中所要用到的计算。在这个领域,Python、R、matlab等语言用得非常多。我希望Ruby也能够进入这一领域,为此我们正在开发一个叫做SciRuby的项目,希望借此推动Ruby在大学科研计算领域的应用。
  2. 高性能计算(High performance computing)。这个和科学计算有点接近,是运用超级计算机来进行计算的领域。和C++比起来Ruby确实要慢很多,所以大家都觉得Ruby不可能被用于高性能计算领域。东京大学一个研究生做了一个研究项目,将Ruby写的代码编译成C语言代码,然后再编译成二进制程序,这个过程中需要用到类型推导等技术,最好的情况下,速度能够达到C语言(指用C语言人工编写的同等程序)的90%。这个项目目前只发表了论文,还没有公开源代码,我希望明年这个项目的成果能够全部公开。
  3. 嵌入式(Embedded)开发。所谓嵌入式就是指在微型设备,例如手机、医疗器械、机器人,在这些环境下,现在的Ruby其实并不是很适合,内存开销很大,API也不合适,因此才需要开发适合嵌入式开发的,内存开销比较小的,并且具备面向嵌入式开发API的Ruby引擎,这也就是mruby。

以这三个领域为首,我希望Ruby能够在Web开发以外的领域有更多的发展。

周:Twitter主要是用Rails开发的,最近我看了一则新闻,说美国大选的时候Twitter遇到了前所未有的大访问量,Twitter称为了应付访问量的上升,正在从Ruby转移到其他语言,您对这个问题怎么看呢?

Matz:这里面原因很多吧。首先,Twitter刚开始开发的时候,没人知道Twitter会获得今天的成功,当时很多人觉得,这种只能写140个字的博客有什么意思呢?但Twitter却出人意料地获得了巨大的成功。在这个过程中,Twitter增加了很多新功能,在它快速发展的过程中,Ruby的贡献是相当大的。因为一个新功能从构思出来到付诸实现,可以用很短的时间就能够完成。Twitter刚开始开发的时候不可能考虑到会有现在这样大的访问量,也就是遇到了设计上的瓶颈了,因为一般的网站也不可能会有每秒上万的访问量,因此可以说现在的Twitter发展到当初在设计上的极限了。

为了解决这个问题,Twitter需要开发一个全新的架构,以应付现在越来越大的访问量。不过,即便要重写架构,我觉得沿用Ruby也是可以做到的吧?(笑)话说,一个网站在遇到设计极限的时候,有很多解决方法,比如重写架构、换其他语言等等,其中重写架构我觉得是最重要的,而实际上Twitter也正是做了这方面的工作。但在这个过程中,他们的工程师想要挑战一些新的东西,那么从编程语言上来说,就提出要改用Scala,因为Scala是编译型语言,性能也不错,正好适合编写新的架构,我觉得这样也不错。

在我看来,在网站所提供的服务还没有完全成型的时候,最重要的是能够对需求的变化做出快速的反应,这个时候就需要Ruby这样灵活性比较高的语言;而在网站获得成功之后,遇到了设计瓶颈,用一种新的语言,比如Scala,来编写一个新的架构,以节约一定的资源,我认为这也是很好的一个结果。Twitter转向Scala还只是在其核心部分,而在Web前端和一些内部工具上还有很多地方在用Ruby。其实,上个月我还去拜访了一下Twitter,跟他们的工程师进行了一些交流,Ruby还是用得很多的哦(笑)。

周:近年来随着智能手机、平板电脑等移动设备的普及,移动平台开发也变得非常热门。从编程语言来看,Android上是用Java,而iOS上则是用Objective-C来进行开发的,那么作为脚本语言,不仅限于Ruby,您认为在移动开发上面会有怎样的发挥呢?

Matz:目前,提到移动开发,在Android上用Java,在iOS上用Objective-C似乎是板上钉钉的事情,不过这也产生了一定的隔阂,比如某个App是为iOS开发的,如果要移植到Android的话,就得全部用Java重写才行。现在也逐步产生了一种新的尝试,例如PhoneGap、Titanium等框架,通过用JavaScript、Lua等脚本语言,编写出来的App就可以实现在iOS和Android的跨平台移植。作为Ruby来说,也有一种叫Rhodes的框架,通过它就可以用Ruby编写出在iOS、Android以及Blackberry上通用的App。

以前移动设备和PC相比性能差距太大,如果App不能全速运行的话,就根本没法用了。但现在移动设备的性能已经得到了大幅度的提升,通过在通用框架的基础上,采用脚本语言来进行开发的方式,性能也逐渐变得可以接受,我想今后通过这种方式,用JavaScript、Lua、Ruby等脚本语言来提升移动开发效率的做法,应该会越来越流行吧。对了,刚才我们说到mruby,其实用mruby来编写iOS和Android应用的项目也已经开始了呢,希望不久的将来这样的App能越来越多吧。

周:刚才您提到了mruby,而明天您的演讲题目是Ruby 2.0,可以就mruby和Ruby 2.0的一些亮点,做一下简单的介绍吗?

Matz:刚才我们也提到了,mruby是为了在微型设备上运行而设计的一种Ruby,它并非拥有Ruby的所有功能,相应地,能够在微型设备上工作才是它的长处。因此,在以往无法使用Ruby的一些设备上面,例如自动售货机、控制器、机器人等等,今后也可以用Ruby来进行开发了。说不定几年之后,在电视机、汽车等地方也能够见到Ruby开发的软件。

Ruby 2.0则包含了两个信息。第一,Ruby从开始开发算起,明年将迎来20周年了。而作为对20周年的纪念,是2.0这个名字所包含的最大的一个信息。如果但从变化来看,从1.8到1.9已经是一个非常大的变化,很多人表示说很不适应,而从1.9到2.0的变化,并不像版本号的变化看起来那么大。实际上,我的目标是保证在1.9上能运行的所有程序,在2.0上面也都能运行,不会因为引擎版本升级导致原来的程序就不能用了。

Ruby 2.0确实也增加了一些新的功能。比如说,现在的Ruby中,可以通过猴子补丁,对某个类中的方法进行添加和替换,但这样一来,所有的用户都会受到影响,可能有人觉得还是原来那样的好,不想跟着改,或者说这样的改动和我现在的开发会发生矛盾、冲突等等。为了解决这个问题,Ruby 2.0中可以限定猴子补丁的作用范围,这样就可以在团队开发、库开发中,避免一些改动对开发范围之外的其他人造成不必要的麻烦。以往Ruby可能都是用在小规模的项目中,而当项目逐渐扩大,开始由多个团队合作的时候,这样的机制就显得非常重要了。除此之外,Ruby 2.0中还有一些其他的新功能,也是针对团队开发的需求来设计的。

周:目前世界范围内广泛使用的语言大部分都是来自欧美的,作为例外大概只有来自巴西的Lua和来自日本的Ruby,您在书中也说这种情况让人感觉“很寂寞”,那么造成这种情况的原因是什么呢?要改变这种局面,我们应该做出怎样的努力呢?

Matz:关于Lua呢,其实如果你要说它是欧美的也可以,巴西是属于“拉丁美洲”嘛(笑)。要说亚洲或者东亚这边的话,那就只有Ruby了,真的是蛮寂寞的一件事。从世界范围来看,(对于编程语言来说)欧洲和美国的影响力应该是最强的,而亚洲虽然有众多的人口,但却没有能够出现很多的编程语言,确实挺寂寞的。

如果说对将来的期待,别的国家我不太清楚,至少在日本,其实是有很多人在开发各种各样的编程语言,但除了Ruby以外,其他的语言在日本以外几乎就没人知道了。如果对编程语言感兴趣的人越来越多,所创造出来的编程语言也越来越多的话,这其中应该就会有那么一两个能够取得成功吧。在日本还存在一个问题就是语言障碍,日本人除了母语以外,精通外语的人不多,有趣的是,居然有用日语来编写程序的编程语言呢。(周:说到这个,其实中国也有用汉语写程序的编程语言呢。)中国也有吗?果然。不过这些语言虽然有趣,却只能给日本人用,也就无法走向世界了。

说句题外话,我曾经收到过一个美国人发给我的一封邮件,他说你是个日本人,但Ruby看上去却跟英语没什么区别,因为Ruby程序都是用英语写的嘛,难道没有用日语写程序的编程语言吗?为什么没有呢?我只好回答说:有啊,只不过你不知道而已,即便知道你也没办法用嘛。

现在在日本对编程语言感兴趣的人不断增加,大概我总是在网上还有书里说编程语言多么有趣,多少也是受了我的这些言论的影响吧,现在有不少人在挑战设计新的编程语言。在这些新的编程语言中,如果能有千分之一的语言能够最终获得成功,我认为就是很好的结果了。我不知道中国、韩国,以及其他一些亚洲国家中,有多少人想要挑战这一领域,不过如果大家以我的这本书为契机,能够改变“编程语言是别人给我们的,我们只能被动接受”这种看法,继而抱有“自己创造一种编程语言也不错嘛”这样想法的人能够越来越多的话,这其中一定会有人获得成功。

说到开源,无论是日本,还是中国、韩国,在世界范围内发表的项目还很少,这也算是一个可以去努力的切入点。这里面可能有很多原因,比如英语很难学,(周:比如GitHub也很难用?)哈哈,GitHub在中国能用吗?(周:能用能用……)唔,还好还好。不过,这个(哔——)的影响还是很大的,有很多资料不太容易获得吧。(周:是啊,比如Go语言的官网就上不去呢。)啊!Go的官网上不去吗!果然是因为它是Google的吧(笑)。总之,需要面对的难题还是很多的。另外,在日本也是如此,程序员把大多数时间都用在了工作(挣钱)上,要进行开源项目之类的活动就比较困难了。10年前,开源这个概念在日本也没人接受,而现在大家都逐渐明白了开源的主要性,开源项目也就逐渐增多了,我想未来几年中,在中国应该也会产生类似的变化吧,我很期待。

而且,在刚开始做的时候,没人知道到底做什么会成功。我在设计Ruby的时候,也不可能想着Ruby很不错以后一定会在全世界广泛使用。因此,一种编程语言生逢其时可能更重要一些,但这种事情,你不去尝试一下是不会知道结果的。在中国,也一定会有一些编程语言或者软件因为生逢其时,从而走向世界并获得成功。

周:在书里讲到Dart的时候,您说过对于编程语言来说,生态环境是很重要的。那么要建立这样的生态环境,需要一些怎样的努力呢?

Matz:从用户的角度来看,用这种编程语言,对我有什么益处,这一点很重要。在Rails出现之前,使用Ruby的人,包括我自己在内,大多数都是觉得Ruby写程序很轻松,这可能是选择Ruby的主要目的。当然,Rails出现之后,因为“我要做个网站,Rails最快”这样的理由而使用Ruby的人变多了。因此,如果你设计一种新的语言,如果能够准确地传递给用户使用这个语言所能带来的好处,我想这样的语言成功的可能性会更大一些。

周:非常感谢,在采访的最后,请您谈谈对中国程序员的寄语吧。

Matz:在《程序世界》中我也提到了,我觉得编程的未来应该会以开源的形式发展下去,未来的创新性软件或者编程语言,可能都会以开源的形式出现。作为开源软件来说,别人做出来我可以免费使用,这一点大家都很开心。在经历了这个阶段之后,如果能够更进一步,将自己做的软件开源,使其对全世界产生影响,如果能做到这一步的话,你可能就会成为一名一流的软件工程师。中国的软件工程师,就我接触的这些人来看,大家都非常认真和努力地学习技术,我希望这些人之中,能够有更多的人迈出这一步,从而成为可以影响世界的一流程序员。

 

左起:图灵编辑乐馨、笔者、Matz、增满Koz先生