Scala 3 再也不支持 XML 了嗎?

前段時間,我爲Scala 3提出了XML字面量語法提案,在社區中正在討論。這個提案可能預示着 Scala 三、Scala.js和Binding.scala的將來前景。爲何這麼說?還得先聊聊Scala目前在編程語言界的江湖地位是怎麼來的。html


Scala的原做者Martin Odersky同時也是Generic Java(Java 5泛型的前身)的設計者,並且Sun/Oracle的JDK裏的javac也源於Martin寫的java編譯器。考慮到從2004年的Java 5到2014年的Java 8,語言改動很小。能夠說這十年間Java語言的基礎都是由Generic Java和javac所奠基的。前端

在Genric Java之後,Martin設計了Scala,主要是特點是高度兼容Java字節碼,但又結合了函數式編程和麪向對象特性,是把編程語言學術界的成果移植到工業界的產物。java

我理解Scala的設計儘可能不在語法上標新立異,而是搞舊瓶裝新酒,把現代語言的特性融合到相似Java語法的工業界調調裏。好比說函數式編程語言裏的ADT,到了Scala裏面就用繼承實現,對Java程序員來講很好懂。再如Scala本來設計的賦值符號是「:=」,跟OCaml同樣。Martin問了幾個碼農以後,都說看不懂「:=」,因而Martin就改爲和Java同樣的「=」了。git

不少複雜的應用不適合用Java這樣的工業界流行語言寫,由於於這些工業界語言的語言特性相比學術界落後不少,因此寫起來很是繁瑣、尤爲是造DSL能力太差。但若是換用OCaml、Haskell、Idris這樣的學術界語言,生態環境又太差,無法用。程序員

Scala解決了這個痛點。由於Scala語言兼容JVM但又比Java簡短易讀、表達能力強(有研究代表初學者閱讀一樣功能的Java代碼花費時間是Scala代碼的1.7倍左右),因此實踐中Scala經常被用來開發難度較高的複雜系統的核心部分。好比像是數據挖掘的Spark、消息隊列的Kafka,都是用Scala開發核心部分而後支持Java用戶使用。github

Scala對工業界的友好性到處可見。好比Scala支持XML字面量功能,要比JSX早了不少年。學院派編程語言絕對不會支持這種「冗餘」功能。畢竟一門通用語言要解析XML易如反掌,何須專門設計一個語法呢?可是工業界的實用價值又是另外一回事。編程

除了支持JVM之外,Scala還能夠編譯成JavaScript(即Scala.js)。Scala在前端開發界的狀況和在JVM上相似,兼容JavaScript,但又比JavaScript強大,因此適合複雜系統的核心部分。微信

好比Binding.scala實現了一套數據綁定的monad,而後利用這套monad,結合Scala的XML字面量功能實現了反應式的HTML模板。前端開發只須要把設計好的HTML複製粘貼到Scala文件中,而後把會變的部分替換成變量,整個網站就建好了。這種開發方式一樣也被React和JSX所採用,已經成爲了2018年前端開發的主流方式了。框架

Binding.scala這樣的框架很難在Scala.js之外的技術棧實現出來。在JavaScript裏寫不出來,是由於JavaScript缺乏了monad這樣的函數式編程基礎設施,只能像React那樣搞虛擬dom,時間複雜度要比Binding.scala的精確數據綁定差得多(參見楊博:如何理解楊博老師對 DOM 操做複雜度的評論?)。在Elm裏寫不出來,是由於Elm這種學院派調調的語言沒有XML字面量功能。順便說一句,Elm因爲和工業界開發方式脫節,成熟度遠遠不如Scala.js。Elm一共只有337個庫,而Scala.js有1315個庫dom


不幸的是,Martin極可能正在背離本身的初衷。

Scala 2的XML字面量是個語法糖,會把XML的語法自動翻譯成對scala.xml裏的類調用。那麼,若是想要把XML翻譯成其餘庫(好比Binding.scala),就須要再寫一個宏或者編譯器插件,把對scala.xml的調用翻譯成對其餘庫的調用。宏或者編譯器插件的編寫難度很大,因此能像Binding.scala這樣利用起XML字面量的庫不多。因此,Martin認爲Scala 2的XML字面量功能很難擴展,因而……

Martin提議把XML字面量功能在Scala 3裏面刪掉。我能夠理解學院派語言要保持簡潔、閹割掉冗餘特性,但我真的沒法理解像Scala這樣已經被工業界廣爲接納的語言要刪掉XML,尤爲是在JSX如日中天的今日。

因此,針對Martin的提案,我提出了「name-based XML literal」的反提案。我但願Scala 3可以把XML字面量翻譯成能夠基於名稱的函數調用,用戶import了不一樣的庫,就能夠把XML字面量翻譯到不一樣的庫。


Scala 3的特性將會由SIP(Scala Improvement Process)委員會決定。Martin做爲Scala的做者固然是委員。Marin對Scala 3的願景是這樣的:

In the future, I want to concentrate on making Scala a better language, with better tooling, as opposed to a more powerful toolbox in which people can write their own language .

意思是但願讓Scala內置不少工具和語言特性,開箱即用,而不是給其餘框架用來創造專門語言的工具箱。然而,Martin的想法和構成Scala生態環境的不少Scala框架背道而馳,由於這些框架剛好是看重Scala定製DSL的能力才選用Scala的。前面說的Binding.scala是把Scala當成HTML模板DSL來用,Spark則是把Scala當成MapReduce的DSL來用,還有Chisel搞了設計集成電路的DSL。

因此,在9月SIP會議討論XML的前景時,Martin表態想移除XML,「believes Scala is instead a more lightweight language than its competitors」。相比之下,其餘SIP委員,好比Scala.js的做者Sébastien Doeraene,則對移除XML形成的影響表示擔心。


目前XML在Scala 3中的命運仍然懸而未決。這個特性的去留可能暗示了Scala 3到底能成爲一門適合工業界實際應用的語言,仍是一門精簡優雅的學院派語言。


相關連接:

Binding.scala

Scala.js

SIP委員會9月會議紀要

Scala XML討論摘要

name-based XML literal

移除XML的提案


文/ThoughtWorks楊博

更多精彩洞見,請關注微信公衆號:ThoughtWorks洞見

相關文章
相關標籤/搜索