在這個(gè)系列的前言中,我列舉了幾位在自己的小說(shuō)中創(chuàng)造語(yǔ)言的大師醉蚁,比如J.R.R.托爾金燃辖、J.K.羅琳、喬治.R.R.馬丁等网棍,當(dāng)然黔龟,這幾位的才華和天賦無(wú)需贅言,不過(guò)滥玷,with all due respect氏身,我覺(jué)得單純從創(chuàng)造語(yǔ)言這件事兒說(shuō),這幾位和計(jì)算機(jī)世界中的各位語(yǔ)言大師相比起來(lái)惑畴,還是有點(diǎn)輕量級(jí) - 瞧瞧下面這些如雷貫耳的名字:
C語(yǔ)言之父丹尼斯.瑞奇(Dennis Ritchie - Unix之父蛋欣、圖靈獎(jiǎng)獲得者)
C++之父比雅尼·斯特勞斯特魯普(Bjarne Stroustrup)
Java之父詹姆斯.高斯林(James Gosling)
Ruby之父松本行弘
Python之父吉多.范羅蘇姆(Guido van Rossum)
R之父羅斯.伊哈卡(Ross Ihaka)和羅伯特.杰特曼(Robert Gentleman) - 看看這兩位名字的字母縮寫(xiě)你就明白R(shí)語(yǔ)言為何叫R語(yǔ)言了
當(dāng)然,還有這篇的主角Scala的創(chuàng)始人如贷,Scala之父馬丁.奧德斯基(Martin Odersky)
Scala篇
楊大俠的玄鐵劍陷虎,呂奉先的方天戟,孫大圣的金箍棒杠袱,關(guān)老爺?shù)馁仍碌渡性常瑐髌嬖?huà)本和武俠小說(shuō)中英雄們?cè)谟龅阶约撼檬值谋袝r(shí),都會(huì)產(chǎn)生一種相見(jiàn)恨晚的情愫霞掺,然后從此愛(ài)不釋手不離不棄谊路;同理,每一個(gè)程序員也有自己最青睞的一門(mén)編程語(yǔ)言菩彬,倘若你有閑心去問(wèn)他們的話(huà)缠劝,我篤定你也一定會(huì)聽(tīng)到各種暮然回首燈火闌珊的故事 潮梯,事實(shí)上,大多數(shù)被問(wèn)及這個(gè)問(wèn)題的程序員都會(huì)一臉羞澀地凝視著自己的IDE惨恭,然后喃喃地說(shuō)秉馏,“其實(shí)不是我選擇了Java/C#/Haskell/Ruby/F#/Lisp/C++/Eiffel…,而是她選擇了我...”脱羡,聽(tīng)起來(lái)很荒誕萝究,我知道,不過(guò)你還相信哈利波特可以和一個(gè)帽子對(duì)話(huà)呢锉罐,不是嗎帆竹?
我沒(méi)有那么幸運(yùn),在大學(xué)時(shí)沒(méi)有和我鐘意的兵刃不期而遇脓规。
二十一世紀(jì)初的軟件世界里栽连,C++和Java是當(dāng)之無(wú)愧的Homecoming Queen,她們高貴典雅侨舆,又有點(diǎn)小小的俏皮和淘氣秒紧,以至于所有被匯編和C折磨過(guò)的男孩見(jiàn)到她們后都眼前一亮,做夢(mèng)都希望能一親芳澤挨下,我當(dāng)然也不例外熔恢。只可惜有緣無(wú)分,在幾次親密接觸后發(fā)現(xiàn)我們之間始終無(wú)法來(lái)電臭笆,于是蹉跎間青春不再叙淌,芳蹤難尋。
畢業(yè)后空窗了好多年 - 好吧耗啦,我承認(rèn)和PHP以及Python曾經(jīng)有過(guò)那么幾段曖昧的時(shí)光凿菩,不過(guò)你懂的,彼此之間其實(shí)誰(shuí)也沒(méi)有認(rèn)真過(guò)帜讲;再后來(lái)衅谷,因?yàn)槁殬I(yè)發(fā)展的軌跡離寫(xiě)代碼越來(lái)越遠(yuǎn),我漸漸都忘記了那種僅靠翻涌的思緒和紛飛的指尖就能讓各種檣櫓灰飛煙滅的快感了 - 就像貝吉塔教訓(xùn)悟飯時(shí)說(shuō)得那樣:“再天才的戰(zhàn)士也會(huì)被安逸的生活腐化的”似将,于是沒(méi)有兵刃的我也漸漸失去了殺手的本能获黔,即便偶爾遇到霸者橫欄,我也只是丟丟石塊在验,然后祈禱自己有大衛(wèi)戰(zhàn)勝歌利亞楊過(guò)擊斃蒙哥時(shí)的運(yùn)氣了玷氏。
但洛奇說(shuō)過(guò),只要你曾打過(guò)拳腋舌,那你就永遠(yuǎn)不會(huì)忘記打拳的腳步和節(jié)奏盏触,所以,只要你曾寫(xiě)過(guò)代碼,那么你命中注定的兵刃總會(huì)到來(lái)赞辩,而我沒(méi)有想到的是雌芽,我的兵刃居然會(huì)蜂擁而至,就像奪寶奇兵里的印第安納.瓊斯一樣辨嗽,老天爺給了他一個(gè)無(wú)所不能的鞭子之后覺(jué)得還不過(guò)癮世落,于是又給他配備了種類(lèi)繁多的左輪槍。
我的鞭子自然是Salesforce平臺(tái)上的Apex糟需,這個(gè)我在《從“北漂”到“北漂”》系列文章的《第十三章 人生中最精彩的四個(gè)月》中有過(guò)提及屉佳,所以不再贅述,而今天則談?wù)勎业淖筝啒?- Scala洲押。
對(duì)于我來(lái)說(shuō)武花,學(xué)習(xí)Scala是純粹的愛(ài)好 - 至少在目前為止我在工作上不需要她,而我對(duì)她的興趣诅诱,則是因?yàn)樗O(shè)計(jì)中展現(xiàn)出來(lái)的哲學(xué) - 請(qǐng)別笑髓堪,你去知乎上查一下,我估計(jì)你看到的大多數(shù)對(duì)Scala的評(píng)價(jià)將會(huì)是“慎學(xué)娘荡!這是一個(gè)B格很高的語(yǔ)言!” (意思就是:如果你內(nèi)心不夠強(qiáng)大驶沼,那么這個(gè)女人你駕馭不了炮沐;如果你內(nèi)功不夠深厚,那么這件兵刃你施展不開(kāi))- 而且回怜,如果你看過(guò)安德魯.尼克爾導(dǎo)演的那部《西蒙妮》(Simone) 的話(huà)大年,你就知道男人愛(ài)上有品位有格調(diào)的代碼,只是早晚的事情玉雾。
對(duì)于沒(méi)有IT背景對(duì)編程一無(wú)所知并且不屑于了解的讀者翔试,請(qǐng)?jiān)试S我給你們做一個(gè)通俗易懂的介紹。
Scala語(yǔ)言的名字來(lái)源于“scalable language” (可拓展語(yǔ)言)复旬,在馬丁.奧德斯基親自操刀編寫(xiě)的《Scala in Programming》中垦缅,對(duì)于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的設(shè)計(jì)收到了許多編程語(yǔ)言以及編程語(yǔ)言研究的影響...Scala采用了許多Java和C#的語(yǔ)法驹碍,而Java和C#的語(yǔ)法則是從C和C++中借鑒來(lái)的...Scala還應(yīng)該感謝很多其他的語(yǔ)言壁涎。Scala的uniform object object是由Smalltalk最先嘗試,而后被Ruby發(fā)揚(yáng)光大的志秃;Scala的universal nesting的想法則來(lái)源于Algol,Simula以及最近的Beta和gbeta; Scala的uniform access principle for method invocation and field selection師承Eiffel怔球;Scala的functional programming方法像極了ML語(yǔ)言家族,包括SML,OCaml,F#等浮还;許多Scala標(biāo)準(zhǔn)庫(kù)中的高端方法在ML和Haskell中也找的見(jiàn)竟坛;Scala的implicit parameters是受到了Haskell type classes的激勵(lì)而設(shè)計(jì)的;而Scala的actor-based concurrency library則相當(dāng)大地受到Erlang的啟發(fā)...)
沒(méi)看明白?好吧担汤,請(qǐng)?jiān)试S我再翻譯一下:Scala這個(gè)妞身上有諸多美女的影子 - 她有安吉麗娜.朱莉的眼睛又官、茱莉亞.羅伯茨的微笑、梅麗·史翠普的優(yōu)雅漫试、妮可.基德曼的野性六敬;當(dāng)然,她還應(yīng)該感謝很多其他的美女驾荣,你在她身上可以看到周迅外构、瑞茜·威瑟斯彭、查理茲·塞隆播掷、凱特·布蘭切特...我想你明白我的意思了审编。
具體的技術(shù)細(xì)節(jié)估計(jì)大家沒(méi)興趣聽(tīng),咱們談形而上的那些哲學(xué)話(huà)題歧匈。
比如編程語(yǔ)言中有兩大流派:object-oriented programming (面向?qū)ο缶幊? 和functional programming (函數(shù)式編程) - 聽(tīng)起來(lái)有點(diǎn)玄垒酬,徹底解釋清楚也確實(shí)不容易,但從哲學(xué)角度理解就是 - 對(duì)前者來(lái)說(shuō)件炉,世界是由一堆名詞組成的 (object)勘究, 對(duì)后者來(lái)說(shuō),世界是由一堆動(dòng)詞組成的 (function)斟冕。
最經(jīng)典的一個(gè)例子是口糕,對(duì)于這句話(huà):“一只貓抓了一只鳥(niǎo)并且吃了它” (恩,聽(tīng)起來(lái)有點(diǎn)殘忍磕蛇,不過(guò)景描,世界就是這么殘酷啊) 來(lái)說(shuō),下面是兩種哲學(xué)不同的詮釋秀撇。
面向?qū)ο缶幊虖倪@句話(huà)中看到了兩個(gè)名詞超棺,一只貓和一只鳥(niǎo),然后貓會(huì)兩個(gè)動(dòng)作呵燕,抓鳥(niǎo)和吃掉棠绘,所以代碼很直接:
函數(shù)式編程則從這句話(huà)中看到了兩個(gè)動(dòng)詞砂沛,吃和抓仁烹,貓和鳥(niǎo)只是參與這兩個(gè)動(dòng)詞的參數(shù)而已挤庇,因此代碼也頗直觀:
Scala則完美地結(jié)合了這兩種哲學(xué) - 在Scala里抡锈,沒(méi)有所謂的primitive type彼乌,萬(wàn)物皆為object器紧,所以即便最簡(jiǎn)單的一個(gè) 1+1邓尤,在本質(zhì)上也是 1.+(1)畔况;而function終于堂而皇之地成為了一等公民敦跌,可以作為參數(shù)傳遞澄干,可以當(dāng)做object處理 - 說(shuō)白了就是逛揩,在Scala的世界里,這個(gè)世界是由名詞組成的麸俘,但每一個(gè)名詞都自帶動(dòng)詞屬性...
因?yàn)檫@個(gè)特性辩稽,Scala的效率會(huì)出奇的高,比如試圖確認(rèn)一個(gè)字符串中是否有大寫(xiě)字母从媚,用Java實(shí)現(xiàn)則需要如下代碼:
而用Scala實(shí)現(xiàn)則僅需要一句:
這個(gè)場(chǎng)景難道沒(méi)有讓你產(chǎn)生似曾相識(shí)的感覺(jué)嗎 - 古文中一句既工整又干練的“此后錦書(shū)休寄逞泄,畫(huà)樓云雨無(wú)憑”,一旦翻譯成現(xiàn)代漢語(yǔ)則變成了啰啰嗦嗦的:“咱倆那天在凱賓斯基的一夜情不算數(shù)啊拜效,以后別給我再發(fā)短信了...”
不是我們吹中國(guó)文化博大精深喷众,僅從文字的設(shè)計(jì)你就能窺見(jiàn)到我們老祖宗們有著多么無(wú)與倫比的世界觀了 - 和相對(duì)冗余的現(xiàn)代漢語(yǔ)相比,古漢語(yǔ)中一字一意紧憾,恰似object-programming的精髓到千,而名詞可隨時(shí)活用作動(dòng)詞,則又像極了functional programming的本質(zhì)赴穗。
拿韓愈的那篇《龍說(shuō)》舉例:
“然龍乘是氣憔四,茫洋窮乎玄間,薄日月般眉,伏光景了赵,感震電,神變化煤篙,水下土斟览,汨陵谷”?
“薄日月”,典型的functional programing辑奈,動(dòng)詞“薄”(意為“迫近”)帶兩個(gè)參數(shù)“日月”;
“水下土”已烤,則是不折不扣的object-oriented programming鸠窗,“水”本是名詞,但在此處名詞自帶動(dòng)詞屬性胯究,如果古漢語(yǔ)有解析器的話(huà)稍计,這條語(yǔ)句的機(jī)器代碼其實(shí)是“水.淹沒(méi)(下土)”。?
只見(jiàn)那男子滿(mǎn)意地將Scala在手中掂了掂裕循,然后突然手腕一抖徑直扔到半空中臣嚣,圍觀者皆倒吸一口冷氣,卻見(jiàn)Scala的利刃在耀眼的陽(yáng)光下閃出一道藍(lán)光后極速落下剥哑,又被那男子輕巧地接在了手里硅则,眾人還來(lái)不及喝彩,卻見(jiàn)那男子淡淡一笑株婴,悠悠地說(shuō) “別說(shuō)我矯情怎虫,我的飛刀百發(fā)百中從不落空的”。