編者按:本文節選自華章科技出版的 《Kotlin 核心編程》一書中的部分章節。

Scala 是洛桑聯邦理工大學的馬丁(Martin Odersky)教授創造的一門語言。他也參與了 Java 語言的發展研究工作,在 Java 5 中引入的泛型就是他的傑作。事實上,在 Java 剛發佈的時候,馬丁教授就開始了 Java 的改良工作——他在 JVM 平臺探索函數式編程,併發布了一個名爲 Pizza 的語言,那時就支持了泛型、高階函數和模式匹配。

然而,在隨後的探索過程中,他漸漸發現 Java 是一門具有硬性約束的語言,在某些時候不能採用最優的方式來實施設計方案。因此,馬丁教授和他的研究夥伴決定重新創造一門語言,既在學術上合理,同時也具備實用價值。這就是開發 Scala 的初衷。

學術和工業的平衡

Scala 是一門非常強大的編程語言,正如它名字(Scalable,可拓展)本身一樣,用 Scala 編程就像擁有了哆啦 A 夢的口袋,裏面裝滿了各種編程語言特性,如面向對象、函數式、宏。

Scala 不僅在面向對象方面進行了諸多的改良,而且徹底擁抱了函數式。因此 Scala 也吸引了函數式編程社區很多厲害的程序員,他們將函數式編程的思想注入 Scala 社區,如此將使用 Scala 進行函數式編程提高到了新的高度。

由於 Scala 設計者學院派的背景,以及 Scala 某些看似“不同尋常”的語法,使它在發展早期(甚至現在)經常被描述爲“過於學院派”,以至於馬丁教授在某次 Scala 大會的演講時,自嘲“Scala 真正的作用是將人引向了 Haskell”。

然而,真實的 Scala 卻是在不斷地探索學術和實用價值兩方面的平衡。不可否認的是:

  • Scala 已經成爲大數據領域的熱門語言,明星項目 Spark 就是用 Scala 開發的,還有很多其他知名的項目,如 Akka、Kafka 等。
  • 越來越多的商業公司,如 Twitter、PayPal、Salesforce 都在大量使用這門語言。

另外,Scala 也確實是一門有着較陡的學習曲線的語言,因爲它強大且靈活,正如馬丁教授所言,Scala 相信程序員的聰明才智,開發人員可以用它來靈活選擇語言特性。但學術和工業的平衡始終是一個難題,與 Java 嚴格標準相比,Scala 的多重選擇也常常因複雜而被人吐槽。

複合但不復雜

那麼,Scala 真的複雜嗎?我們不知聽了多少次類似這樣的抱怨。在搞明白這個問題之前,我們需要先弄清楚到底什麼是“複雜”。在英文中,複雜一詞可以聯想到兩個單詞:complex 和 complicated。實際上它們的含義截然不同,更準確地說,complex 更好的翻譯是“具有複合性”。

Nicolas Perony 曾在 Ted 上發表過一次關於“複合性理論”的演講。

什麼是複合性?複合並不是複雜。一件複雜的事物是由很多小部分組成的,每一部分都各不相同,而且每一部分都在這個體系中有其自身的確切作用。與之相反,一個複合的系統是由很多類似的部分所組成的,而且(就是因爲)它們之間的相互影響形成了一種宏觀上一致的行爲。複合系統含有很多互動的元素,它們根據簡單的、個體的規則行動,如此導致新特徵的出現。

馬丁教授曾發表過一篇名爲《簡單還是複雜》的文章,表達過類似的觀點。如果對搭積木這件事情進行思考,摩比世界提供了固定的方案,而樂高則提供了無窮的選擇。然而,前者的零件種類和數量都比後者要多得的。類似的道理,編程語言可以依靠功能累加來構建所謂的語法,同樣也可以通過簡單完備的理論來發展語言特性。在馬丁教授看來,Scala 顯然屬於後者,它並不複雜,而且非常簡單。

簡單卻不容易

事實上,函數式編程最明顯的特徵就是具備複合性。函數式開發做得最多的事情就是對需要處理的事物進行組合。如果說面向對象是歸納法,側重於對事物特徵的提取及概括,那麼函數式中的組合思想則更像是演繹法,近似於數學中的推導。

“簡單”的哲學也帶來了相應的代價:

  • 這是一種更加抽象的編程範式,諸如高階類型、Typeclass 等高級的函數式特性雖然提供了無比強大的抽象能力,但學習成本更高。
  • 它建立了另一種與採用 Java 面向對象編程截然不同的思維模式。這種思維方式上的巨大差異顯然是一個極高的門檻,同時也是造成 Scala 令人望而卻步的原因之一。

Scala 在選擇徹底擁抱函數式的同時,也意味着它不是一門容易的語言,它無法成爲一門像 Java 那樣主流的編程語言。事實上,即使很多人採用 Scala 來進行開發,也還是採用類似 Java 的思維模式來編程。換句話說,Scala 依舊是被當作更好的 Java 來使用的,但這確實是當今主流編程界最大的訴求。

在這種背景下,Kotlin 作爲一門 JVM 平臺上新興的編程語言,悄悄打開了一扇同樣廣闊的大門。

圖書簡介: https://item.jd.com/12519581.html?dist=jd

相關文章