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

1.4 Scala尋根

Scala的設(shè)計受到許多編程語言和編程語言研究領(lǐng)域的概念的影響。事實上,Scala只有很少的幾個特性是原創(chuàng)的;大部分特性都在其他語言中實現(xiàn)過。Scala的創(chuàng)新在于將這些語法概念有機地結(jié)合在一起。本節(jié)將列出對Scala設(shè)計有重大影響的語言和觀念。這份清單不可能做到完整(在編程語言領(lǐng)域,各種聰明有趣的點子實在是太多了)。

在表層,Scala借鑒了大部分來自Java和C#的語法,而這些語法特征大部分也是從C和C++沿襲下來的。表達式、語句和代碼塊與Java幾乎一致,類、包和引入的語法也基本相同。[18]除了語法,Scala還用到了Java的其他元素,如基本的類型、類庫和執(zhí)行模型等。

除此之外,Scala也吸收了很多來自其他語言的影響。Scala采用的統(tǒng)一對象模型由Smalltalk開創(chuàng),由Ruby發(fā)揚光大。Scala的統(tǒng)一嵌套機制(Scala幾乎所有語法結(jié)構(gòu)都支持嵌套)也同樣出現(xiàn)在Algol、Simula中,近期Beta和gbeta也引入了類似機制。Scala方法調(diào)用的統(tǒng)一訪問原則和對字段的選取方式來自Eiffel。Scala的函數(shù)式編程實現(xiàn)方式與ML家族的語言(包括SML、OCaml、F#等)也很神似。Scala類庫的許多高階函數(shù)(higher-order function),在ML和Haskell中也有。Scala的隱式參數(shù)是為了做到Haskell的type class的效果,它實現(xiàn)了類似在傳統(tǒng)的面向?qū)ο笳Z境中對于“同一類對象”的那種抽象[19]。而Scala基于actor模型的核心并發(fā)庫——Akka,在很大程度上受到Erlang的啟發(fā)。

Scala并不是首個強調(diào)伸縮性和擴展性的語言。支持不同應(yīng)用領(lǐng)域的可擴展編程語言的歷史,可以追溯到Peter Landin于1966年發(fā)表的論文——《未來的700種編程語言》[20](這篇論文中提到的編程語言Iswim與Lisp并列,是函數(shù)式編程語言的先驅(qū))。具體到使用中綴infix)操作符作為函數(shù)的想法,可以在Iswim和Smalltalk中找到影子。另一個重要的理念是允許函數(shù)字面量(或代碼塊)作為參數(shù),以支持自定義控制結(jié)構(gòu)。這個特性也可以追溯到Iswim和Smalltalk。Smalltalk和Lisp都支持靈活的語法來完整構(gòu)建領(lǐng)域特定語言domain-specific language)。通過操作符重載和模板系統(tǒng),C++也支持一定程度的定制和擴展,但與Scala相比,C++更為底層,其核心更多的是面向系統(tǒng)級的操作處理。

Scala也不是首個將函數(shù)式和面向?qū)ο缶幊碳稍谝黄鸬恼Z言,盡管它很可能是這些語言中在這個方向上走得最遠的。其他將某些函數(shù)式編程的元素集成進面向?qū)ο缶幊蹋∣OP)的語言有Ruby、Smalltalk和Python。在Java平臺上,Pizza、Nice、Multi-Java(還有Java 8自己)都基于Java的內(nèi)核擴展出函數(shù)式的概念。還有一些主打函數(shù)式的編程語言也集成了對象系統(tǒng),如OCaml、F#和PLT-Scheme。

在編程語言領(lǐng)域,Scala也貢獻了自己的一些創(chuàng)新。比如,它的抽象類型提供了與泛型類型相比更加面向?qū)ο蟮臋C制,它的特質(zhì)允許用戶更靈活地組裝組件,而它的提取器extractor)提供了一種與展示無關(guān)的方式來實現(xiàn)模式匹配。這些創(chuàng)新點在最近幾年的編程語言大會和論文中也多有提及。[21]

主站蜘蛛池模板: 太保市| 孝义市| 无棣县| 巴塘县| 临汾市| 天水市| 平泉县| 宝兴县| 新源县| 永德县| 内江市| 甘肃省| 蛟河市| 长垣县| 高安市| 台北县| 固镇县| 望江县| 阜新| 甘孜| 华蓥市| 珲春市| 舞阳县| 耒阳市| 基隆市| 晋宁县| 长垣县| 东明县| 崇仁县| 法库县| 三都| 安陆市| 沁源县| 九龙县| 宜良县| 新营市| 射阳县| 岢岚县| 台北市| 阿拉善右旗| 安平县|