官术网_书友最值得收藏!

見證一門新編程語言的誕生是一件有趣的事。對任何一位使用編程語言的人而言——無論你是首次嘗試編程的人還是職業軟件工程師——編程語言看起來就在那里。就像錘子或斧子一樣,編程語言也是一種工具,讓我們可以做我們想做的。我們很少會想到工具是怎么來的,它的設計過程是怎樣的。或許我們對工具的設計有自己的看法,但除此之外,我們通常只能接受并運用它。

編程語言的創造過程讓我有了完全不同的視角。各種可能性似乎無窮無盡。同時,編程語言也必須滿足看起來同樣無窮無盡的各種約束。這是一種奇怪的張力。

創造一門新的編程語言有很多方面的原因,例如,某種個人想要解決的“痛點”,或者某種學術上的洞見,或者技術債,或者其他編譯器架構的潛在收益,甚至可能是政治因素。對Scala 3的創造而言,上述原因多少都有一些。

無論出于何種原因,一切都開始于Martin Odersky在某一天突然消失,當他幾天后再次出現在某個研究組會議上時,他向大家正式宣告自己已經開始嘗試從零起步編寫一個全新的編譯器,將DOT演算[1]實施落地。而在場的我們是一群博士研究生和博士后,在那之前主要負責Scala 2的開發和維護。當時,Scala看起來正在接近看上去難以企及的成功高度,尤其是對于這樣一門誕生于瑞士的、一個聽起來有些奇怪的學校的偏門學術編程語言。然而就在不久前,Scala得到了舊金山灣區的很多創業公司的追捧,成立了Typesafe也就是后來的Lightbend,專注于支持、維護和管理Scala 2。那么為什么突然要做一個全新的編譯器,以及由此帶來的不一樣的編程語言呢?我們當中的大多數人對此心存疑慮,但Martin Odersky已經下定了決心。

幾個月過去了。就像上了發條一樣,每天中午12點,整個實驗室的人都會出現在連接各個辦公室的門廳。當聚集了一定數量的人員以后,我們就會一起來到EPFL的某個餐廳吃午飯,并享用飯后咖啡。在每天都會舉行的這個“儀式”中,關于新編譯器的想法是反復出現的討論話題,例如,從“150%”兼容Scala 2(避免陷入Python 2和Python 3的困境),到創造一門全新的“全光譜”依賴類型編程語言。

研究組中持懷疑態度的人,一個接一個地被Scala 3的某個特性征服,比如,對類型檢查器的精簡,全新的編譯器架構,以及對類型系統的增強等。隨著時間的推移,社區主流也認為Scala 3相比Scala 2而言具有顯著的改進。對于這個結論,不同的人有不同的理由。對有些人而言,是因為Scala 3將花括號和條件判定語句的括號變為可選的,從而改善了可讀性。對其他人而言,是因為Scala 3的類型系統更強了。如此種種。

我可以很有信心地說,Scala 3的設計并不是完全依靠直覺的“閉門造車”,而是吸納了過去設計的寶貴經驗,以及EPFL研究組和Scala社區的多年溝通與交流經驗。并且,除從頭開始在全新的“地基”上搭建之外,別無他途。既然Scala 3是從頭開始設計的,其內核就是一門全新的編程語言。

Scala 3是一門全新的編程語言。誠然,它兼容Scala 2,聽起來像是一門已經存在的編程語言的第三個重大版本。但是不要被這個影響了你的判斷,Scala 3實現了在Scala 2中先行試驗、探索的諸多想法的重大精簡。

在Scala 3的所有特性中,可能最“Scala”的一個專屬的變化是對隱式的改動。Scala從一開始就被聰明的程序員們用來實現某種基于Scala特性本就很少有人能想到的功能,更別提這些功能與Scala設計本意的背離程度有多大了。這個先前被稱作隱式的特性可能是Scala中最著名的被用來以各種奇怪的方式改變Scala 2代碼行為的功能點了。隱式的使用場景包括:對一個類在“事后”追加方法,不擴展也不重新編譯;或者,在某種特定的上下文中,基于某種類型簽名,自動選擇適用于該上下文的正確實現。上述只是冰山一角——我們甚至為此寫了一篇論文以對開發人員使用隱式的各種方法進行歸類。[2]

這就像是把旋鈕和杠桿交給用戶,期待他們能做出一臺精密的儀器,如圖1所示的機械計算器。但通常我們得到的是類似于Theo Jansen的動力雕塑,如圖2所示,而不是某種能一眼看出用途的物件。[3]簡單而言,如果你交給編程社區的是一些旋鈕和杠桿,則社區中那些強悍的選手總能找到這些工具的創新用法。這是人的本性。不過可能正是在這里,Scala 2犯了錯誤,將最基礎、最通用的旋鈕和杠桿交給了程序員。

圖1 機械計算器

圖2 類似于Theo Jasen的動力雕塑

我想說的是,在Scala 2中,隱式有無窮無盡的可能性,這些可能性足夠我們撰寫研究生論文,而社區對于如何使用隱式并沒有一個統一的認識。這種沒有清晰用途的編程語言特性不應該存在。但是很可惜,隱式就是這樣一種存在:很多人將隱式看作Scala獨有的強大功能,沒有其他語言能做到;還有很多人認為隱式是神秘且經常令人困惑的機制,會侵入你的代碼,將你的代碼改得面目全非。

你可能已經聽說過很多種不同形式的表述,但Scala 3代表了這之前所有Scala版本的簡化版本。隱式是一個很好的例子。在意識到那些“后空翻”程序員希望通過隱式來實現更廣泛的編程模式[如類型族(typeclass)派生]后,Martin Odersky在其他人的幫助下得出的結論是,我們不應該把注意力集中在人們一般如何使用隱式作為編程機制,而應該關注程序員們想用隱式做什么,然后把這個目標變得更加容易且高效。這就是口頭禪“Scala 3專注于意圖而不是機制”的來源。

Scala 3并不把注意力集中在作為編程機制的隱式的通用性上,而是關注開發人員在使用隱式時想要滿足的特定使用場景,讓其用起來更加直接。例如,隱式地將上下文或配置信息傳遞給某方法,而不需要程序員顯式地給出重復的參數;在“事后”給類追加方法;在算術運算中對不同類型的值進行轉換。如今,Scala 3將這些使用方法直接提供給程序員,使他們不需要“深入”理解Scala編譯器如何解析隱式值,只需要關心“在不重新編譯Bar類的前提下給Bar類追加foo方法”這樣的任務即可;不需要具有博士學位,只需要把之前的“隱式”替換成其他更直接的與特定使用場景相關的關鍵字即可,如given和using。更多內容參見第21章和第22章。

“專注于意圖而不是機制”的故事并不止于對隱式的改造,這個設計哲學幾乎貫穿了這門語言的方方面面。例如,對Scala類型系統的增強和簡化,包括并集類型(union type)、枚舉(enum)、匹配類型(match type)等;對Scala語法的清理,包括if、else、while,讓條件判斷讀起來更像英文。

當然,我說的這些,你不必盲目相信。無論你是Scala新手還是有經驗的Scala開發人員,我希望你和我一樣,Scala 3所包含的許多新的設計理念能讓你感到耳目一新且直截了當!

Heather Miller
瑞士洛桑
2021年6月1日

[1]DOT(Dependent Object Type,依賴對象類型)演算是一系列形式化的推演,嘗試對Scala類型系統的本質進行提煉和描述。

[2]Krikava等,《Scala隱式無處不在》[Kri19]

[3]關于Theo Jansen動力雕塑(標題為Strandbeest)的更多動態效果展示參見網址列表條目[1](譯者注:網址列表獲取方式見讀者服務)。

主站蜘蛛池模板: 双城市| 金寨县| 德昌县| 阳朔县| 尉犁县| 凤台县| 高州市| 四会市| 扎赉特旗| 平顶山市| 新乡市| 荆州市| 新乡县| 安庆市| 齐齐哈尔市| 邵阳县| 邻水| 八宿县| 大足县| 嘉兴市| 赣州市| 威海市| 尚义县| 汉源县| 东台市| 隆子县| 灯塔市| 邵东县| 庄浪县| 城口县| 新野县| 高雄县| 赤峰市| 衡阳县| 上思县| 甘孜| 海阳市| 甘德县| 瓦房店市| 巧家县| 怀仁县|