在这个系列的前言中,我列举了几位在自己的小说中创造语言的大师,比如J.R.R.托尔金、J.K.罗琳、乔治.R.R.马丁等,当然,这几位的才华和天赋无需赘言,不过,with all due respect,我觉得单纯从创造语言这件事儿说,这几位和计算机世界中的各位语言大师相比起来,还是有点轻量级 - 瞧瞧下面这些如雷贯耳的名字:
C语言之父丹尼斯.瑞奇(Dennis Ritchie - Unix之父、图灵奖获得者)
C++之父比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup)
Java之父詹姆斯.高斯林(James Gosling)
Ruby之父松本行弘
Python之父吉多.范罗苏姆(Guido van Rossum)
R之父罗斯.伊哈卡(Ross Ihaka)和罗伯特.杰特曼(Robert Gentleman) - 看看这两位名字的字母缩写你就明白R语言为何叫R语言了
当然,还有这篇的主角Scala的创始人,Scala之父马丁.奥德斯基(Martin Odersky)
Scala篇
杨大侠的玄铁剑,吕奉先的方天戟,孙大圣的金箍棒,关老爷的偃月刀,传奇话本和武侠小说中英雄们在遇到自己趁手的兵刃时,都会产生一种相见恨晚的情愫,然后从此爱不释手不离不弃;同理,每一个程序员也有自己最青睐的一门编程语言,倘若你有闲心去问他们的话,我笃定你也一定会听到各种暮然回首灯火阑珊的故事 ,事实上,大多数被问及这个问题的程序员都会一脸羞涩地凝视着自己的IDE,然后喃喃地说,“其实不是我选择了Java/C#/Haskell/Ruby/F#/Lisp/C++/Eiffel…,而是她选择了我...”,听起来很荒诞,我知道,不过你还相信哈利波特可以和一个帽子对话呢,不是吗?
我没有那么幸运,在大学时没有和我钟意的兵刃不期而遇。
二十一世纪初的软件世界里,C++和Java是当之无愧的Homecoming Queen,她们高贵典雅,又有点小小的俏皮和淘气,以至于所有被汇编和C折磨过的男孩见到她们后都眼前一亮,做梦都希望能一亲芳泽,我当然也不例外。只可惜有缘无分,在几次亲密接触后发现我们之间始终无法来电,于是蹉跎间青春不再,芳踪难寻。
毕业后空窗了好多年 - 好吧,我承认和PHP以及Python曾经有过那么几段暧昧的时光,不过你懂的,彼此之间其实谁也没有认真过;再后来,因为职业发展的轨迹离写代码越来越远,我渐渐都忘记了那种仅靠翻涌的思绪和纷飞的指尖就能让各种樯橹灰飞烟灭的快感了 - 就像贝吉塔教训悟饭时说得那样:“再天才的战士也会被安逸的生活腐化的”,于是没有兵刃的我也渐渐失去了杀手的本能,即便偶尔遇到霸者横栏,我也只是丢丢石块,然后祈祷自己有大卫战胜歌利亚杨过击毙蒙哥时的运气了。
但洛奇说过,只要你曾打过拳,那你就永远不会忘记打拳的脚步和节奏,所以,只要你曾写过代码,那么你命中注定的兵刃总会到来,而我没有想到的是,我的兵刃居然会蜂拥而至,就像夺宝奇兵里的印第安纳.琼斯一样,老天爷给了他一个无所不能的鞭子之后觉得还不过瘾,于是又给他配备了种类繁多的左轮枪。
我的鞭子自然是Salesforce平台上的Apex,这个我在《从“北漂”到“北漂”》系列文章的《第十三章 人生中最精彩的四个月》中有过提及,所以不再赘述,而今天则谈谈我的左轮枪 - Scala。
对于我来说,学习Scala是纯粹的爱好 - 至少在目前为止我在工作上不需要她,而我对她的兴趣,则是因为她设计中展现出来的哲学 - 请别笑,你去知乎上查一下,我估计你看到的大多数对Scala的评价将会是“慎学!这是一个B格很高的语言!” (意思就是:如果你内心不够强大,那么这个女人你驾驭不了;如果你内功不够深厚,那么这件兵刃你施展不开)- 而且,如果你看过安德鲁.尼克尔导演的那部《西蒙妮》(Simone) 的话,你就知道男人爱上有品位有格调的代码,只是早晚的事情。
对于没有IT背景对编程一无所知并且不屑于了解的读者,请允许我给你们做一个通俗易懂的介绍。
Scala语言的名字来源于“scalable language” (可拓展语言),在马丁.奥德斯基亲自操刀编写的《Scala in Programming》中,对于Scala有一段很别致的介绍,我截取了一些部分展示给大家:
Scala’s design has been influenced by many programming languages and ideas in programming language research...Scala adopts a large part of the syntax of Java and C#, which in turn borrowed most of their syntactic conventions from C and C++...Scala also owes much to other languages. Its uniform object model was pioneered by Smalltalk and taken up subsequently by Ruby. Its idea of universal nesting is also present in Algol, Simula, and, more recently in Beta and gbeta. Its uniform access principle for method invocation and field selection comes from Eiffel. Its approach to functional programming is quite similar in spirit to the ML family of languages, which has SML, OCaml, and F# as prominent members. Many higher-order functions in Scala’s standard library are also present in ML or Haskell. Scala’s implicit parameters were motivated by Haskell’s type classes; Scala’s actor-based concurrency library was heavily inspired by Erlang...
(Scala的设计收到了许多编程语言以及编程语言研究的影响...Scala采用了许多Java和C#的语法,而Java和C#的语法则是从C和C++中借鉴来的...Scala还应该感谢很多其他的语言。Scala的uniform object object是由Smalltalk最先尝试,而后被Ruby发扬光大的;Scala的universal nesting的想法则来源于Algol,Simula以及最近的Beta和gbeta; Scala的uniform access principle for method invocation and field selection师承Eiffel;Scala的functional programming方法像极了ML语言家族,包括SML,OCaml,F#等;许多Scala标准库中的高端方法在ML和Haskell中也找的见;Scala的implicit parameters是受到了Haskell type classes的激励而设计的;而Scala的actor-based concurrency library则相当大地受到Erlang的启发...)
没看明白?好吧,请允许我再翻译一下:Scala这个妞身上有诸多美女的影子 - 她有安吉丽娜.朱莉的眼睛、茱莉亚.罗伯茨的微笑、梅丽·史翠普的优雅、妮可.基德曼的野性;当然,她还应该感谢很多其他的美女,你在她身上可以看到周迅、瑞茜·威瑟斯彭、查理兹·塞隆、凯特·布兰切特...我想你明白我的意思了。
具体的技术细节估计大家没兴趣听,咱们谈形而上的那些哲学话题。
比如编程语言中有两大流派:object-oriented programming (面向对象编程) 和functional programming (函数式编程) - 听起来有点玄,彻底解释清楚也确实不容易,但从哲学角度理解就是 - 对前者来说,世界是由一堆名词组成的 (object), 对后者来说,世界是由一堆动词组成的 (function)。
最经典的一个例子是,对于这句话:“一只猫抓了一只鸟并且吃了它” (恩,听起来有点残忍,不过,世界就是这么残酷啊) 来说,下面是两种哲学不同的诠释。
面向对象编程从这句话中看到了两个名词,一只猫和一只鸟,然后猫会两个动作,抓鸟和吃掉,所以代码很直接:
函数式编程则从这句话中看到了两个动词,吃和抓,猫和鸟只是参与这两个动词的参数而已,因此代码也颇直观:
Scala则完美地结合了这两种哲学 - 在Scala里,没有所谓的primitive type,万物皆为object,所以即便最简单的一个 1+1,在本质上也是 1.+(1);而function终于堂而皇之地成为了一等公民,可以作为参数传递,可以当做object处理 - 说白了就是,在Scala的世界里,这个世界是由名词组成的,但每一个名词都自带动词属性...
因为这个特性,Scala的效率会出奇的高,比如试图确认一个字符串中是否有大写字母,用Java实现则需要如下代码:
而用Scala实现则仅需要一句:
这个场景难道没有让你产生似曾相识的感觉吗 - 古文中一句既工整又干练的“此后锦书休寄,画楼云雨无凭”,一旦翻译成现代汉语则变成了啰啰嗦嗦的:“咱俩那天在凯宾斯基的一夜情不算数啊,以后别给我再发短信了...”
不是我们吹中国文化博大精深,仅从文字的设计你就能窥见到我们老祖宗们有着多么无与伦比的世界观了 - 和相对冗余的现代汉语相比,古汉语中一字一意,恰似object-programming的精髓,而名词可随时活用作动词,则又像极了functional programming的本质。
拿韩愈的那篇《龙说》举例:
“然龙乘是气,茫洋穷乎玄间,薄日月,伏光景,感震电,神变化,水下土,汨陵谷”
“薄日月”,典型的functional programing,动词“薄”(意为“迫近”)带两个参数“日月”;
“水下土”,则是不折不扣的object-oriented programming,“水”本是名词,但在此处名词自带动词属性,如果古汉语有解析器的话,这条语句的机器代码其实是“水.淹没(下土)”。
只见那男子满意地将Scala在手中掂了掂,然后突然手腕一抖径直扔到半空中,围观者皆倒吸一口冷气,却见Scala的利刃在耀眼的阳光下闪出一道蓝光后极速落下,又被那男子轻巧地接在了手里,众人还来不及喝彩,却见那男子淡淡一笑,悠悠地说 “别说我矫情,我的飞刀百发百中从不落空的”。