自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java程序員,你為什么要關(guān)注Scala

原創(chuàng)
開發(fā) 后端
Scala是一種針對 JVM 將函數(shù)和面向?qū)ο蠹夹g(shù)組合在一起的編程語言。Martin Odersky創(chuàng)建這個(gè)語言之時(shí),希望它能夠解決Java語言中的一些問題。Scala現(xiàn)在還相對比較小眾,但也已經(jīng)擁有了相當(dāng)忠實(shí)的擁護(hù)群體。

51CTO編輯推薦:Scala編程語言專題

【51CTO獨(dú)家特稿】上周我們從Scala創(chuàng)始人Martin Odersky的訪談錄中了解了Scala創(chuàng)建的背景,這次讓我們來看一看Martin Odersky對于Scala語言的設(shè)計(jì)目標(biāo)是怎么說的。在創(chuàng)造“超越Java的語言”的過程中,具體都需要考慮到哪些方面呢?

讓步

thinking in Javaprogramming in Scala

Frank Sommers:您之前提到,想要?jiǎng)?chuàng)造一種存在于Java體系內(nèi),集成Java基礎(chǔ)架構(gòu)的語言。為了做到這一點(diǎn),Scala要做出什么樣的讓步,使其能夠兼容Java平臺? 

Martin Odersky:很幸運(yùn),我們不需要做出太多妥協(xié),或者說,很難判斷我們所做出的所有妥協(xié)都是對我們不利或是有利的。其中一個(gè)我們不得不做的妥協(xié)是購買Java的靜態(tài)重載模型。也許我們應(yīng)該更積極地嘗試一些其他方法,如使用多方法,盡管當(dāng)時(shí)我們嘗試過這一點(diǎn),但并沒有充分探討有關(guān)多方法的設(shè)計(jì)。也許直到今天也還沒有充分探討過,所以我不能完全肯定這種方法是否行得通。這種方法本來有著令人振奮的可能性,但我們并沒有采用它,因?yàn)槲覀兿氡3峙cJava的兼容性。 

另外一件時(shí)而會引來人們否定的事是Scala既包含Traits技術(shù)又包含類技術(shù)。大家認(rèn)為一個(gè)整潔的設(shè)計(jì)應(yīng)該是只采用Traits技術(shù)。目前已有一些只采用Traits而放棄類概念的整潔設(shè)計(jì),但我們并沒有這樣做。因?yàn)槲覀兿霃倪@兩方面保留與Java的互用性。我們希望有一種方式可以讓Java代碼很容易地調(diào)用Scala代碼,而Traits并不含有映射到Java的特性,因?yàn)樵贘ava中根本不存在這種技術(shù)。因此,我們選擇了Java中所擁有的類的概念,因?yàn)槲覀兿M軌蛳蚝笥成洌@樣我們就可以很容易地在兩個(gè)方向保留互用性。 

第3個(gè)問題,與其說是語言上的問題,不如說是類庫的問題。我們很想要拋棄null(空值)這種概念。NULL是很多錯(cuò)誤的根源。在Scala中,不允許null作為任何類型的可能值,取而代之的是選項(xiàng)類型(option type)。當(dāng)然,有很多Java類庫中的類都返回null,我們必須要解決這個(gè)問題。

51CTO編者注:在新語言兼容舊語言的這個(gè)方面,《Think in Java》和《Think in C++》的作者Bruce Eckel也曾經(jīng)寫過一篇文章,就C++和C的關(guān)系評論兼容老語言為新語言帶來的好處和限制。這篇文章相關(guān)的討論可以參見這里

#p#

選擇你需要的戰(zhàn)斗

Bill Venners:為了能讓Java程序員接受Scala,您都做了哪些努力?例如,像Java使用大括號而不是其它符號來分塊程序,這使得C和C + +程序員感到使用Java就如同使用C和C++一樣。 

Martin Odersky:我們并沒有為了推銷產(chǎn)品而設(shè)計(jì)什么特殊功能,但是為了避免產(chǎn)生使用障礙,我們做了一些努力。舉例來說,我認(rèn)為大括號起了很好的分割作用,所以我選擇使用它。我們本可以堅(jiān)持使用begin/end或是其它符號,但我不認(rèn)為這些符號能起到更好的效果。 

其中有一個(gè)我們做了改動的地方。最初我們曾使用冒號-等號表示變量賦值,就像是Pascal、Modular和Ada那樣,使用單個(gè)等號表示相等。很多編程理論會認(rèn)為這是最恰當(dāng)?shù)姆绞健Yx值并不表示相等,因此,你必須使用不同的符號。但后來我與一些使用Java的人進(jìn)行交流。我得到的反應(yīng)是,“哦,這看起來像是一個(gè)很有趣的語言。但是,為什么你要寫冒號-等號?它是什么意思?”我解釋說,意思就像Pascal中使用的那樣。他們說,“那我明白了,但我不明白為什么你堅(jiān)持要使用這個(gè)?!比缓笪乙庾R到,這并不是我們想要堅(jiān)持的東西。我們并不想說,“我們有了一個(gè)更好的語言,因?yàn)槲覀冇妹疤?等號代替了等號?!边@完全是不值一提的小事,人們完全可以適應(yīng)任何方式。因此,我們決定不再計(jì)較這些小事,而是有其他更重要的地方我們想要與眾不同。

Bill Venners:這次您沒有說那句您曾經(jīng)說過的“選擇你需要的戰(zhàn)斗”?;旧?,您認(rèn)為,等號并不那么重要,還有其他您更在意的東西。那么那些重要的事情是什么?您有什么方法能夠說服人們?nèi)ジ淖兯麄兊南敕ɑ虺绦颍?/EM>

Martin Odersky:我們首要關(guān)心的一件事是,擁有一個(gè)盡可能整潔的集成了函數(shù)式和面向?qū)ο蟮某绦蛟O(shè)計(jì)。我們希望擁有一流的功能,還希望擁有其他函數(shù)式程序設(shè)計(jì)的特征,如類型,泛型,模式匹配。我們希望能夠以一個(gè)更加整潔的方式整合函數(shù)式和面向?qū)ο蟆_@是我們從一開始就深感關(guān)心的事情。 

后來,我們發(fā)現(xiàn)這實(shí)際上是很容易實(shí)現(xiàn)的,因?yàn)楹瘮?shù)式語言有一套固定的特點(diǎn)。這些特點(diǎn)已經(jīng)被深入研究和充分證明過了,因此,我們所面臨的問題只是如何以最佳方式整合這些特點(diǎn)到面向?qū)ο蟪绦蛟O(shè)計(jì)。在做Pizza時(shí),我們已經(jīng)進(jìn)行了嘗試,在Scala,我認(rèn)為我們得到了兩者之間更順暢的集成。但后來我們發(fā)現(xiàn),在面向?qū)ο蠓矫嫒杂泻芏嗍虑橛写_發(fā)。面向?qū)ο蟪绦蛟O(shè)計(jì),至少擺在一個(gè)靜態(tài)類型系統(tǒng)上,是一個(gè)非常未知領(lǐng)域。目前我們可以看到和使用一些已有的工作,但我們發(fā)現(xiàn)幾乎所有的語言都做出了很大的妥協(xié)。 

因此,隨著開發(fā)Scala,我們開始發(fā)現(xiàn)如何能夠混合對象,如何能夠抽象自我類型,如何能夠使用抽象類型成員,以及如何能夠讓這一切集成到一起。已有一些研究語言以特殊方法關(guān)注了以上幾個(gè)方面,但幾乎還沒有任何主流語言,能夠涵蓋以上所有方面。最終結(jié)果表明,Scala的主要?jiǎng)?chuàng)新在于面向?qū)ο蠓矫妫@也是我們真正關(guān)心的事情。

#p#

面向?qū)ο蟮膭?chuàng)新

51CTO推薦閱讀:面向?qū)ο蟮乃季S過程

Bill Venners:您能不能給出一個(gè)具體的列表,列出一些您認(rèn)為是Scala面向?qū)ο蟮膭?chuàng)新? 

Martin Odersky:首先,我們想要?jiǎng)?chuàng)造一個(gè)純粹的面向?qū)ο蟮恼Z言,其中的每個(gè)值都是一個(gè)對象,每個(gè)操作都是一個(gè)方法調(diào)用,每個(gè)變量都是一些類的成員。因此,我們不想要靜態(tài)變量,但我們需要一些其他的東西來替代它們,所以我們提出了Singleton對象。但是,即使是Singleton對象仍然是全局結(jié)構(gòu)。因此,我們所面臨的挑戰(zhàn)是如何盡可能少地使用它們,因?yàn)楫?dāng)你使用一個(gè)全局結(jié)構(gòu)時(shí),你就不能再改變它了。你不能實(shí)例化它。它很難測試。很難對它以任何方式進(jìn)行修改。 

因此,我們所面臨的挑戰(zhàn)是,如何能夠不使用靜態(tài)或全局思想來建立復(fù)雜的組件。尤其是,我們不得不處理組件間的遞歸依賴。例如我有兩個(gè)組件A和B。A使用B,同時(shí)B使用A。我要如何才能讓他們發(fā)現(xiàn)對方,并協(xié)同工作?我們所做的第一件事是基于mixin(混合式)合成的概念,然而,Java只有單一類和一串含有虛定義而沒有代碼的接口概念,Scala有類和Traits概念,其中Traits可以包含帶有定義和函數(shù)域的方法,例如可以帶有函數(shù)體。然后,我們就擁有了mixin合成,而不只是具有類實(shí)現(xiàn)接口,在mixin合成中,我們定義類和所有Traits。有關(guān)這項(xiàng)工作是如何工作的細(xì)節(jié)在此就不詳述,我們稱之為線性化。

因此,我們定義一個(gè)線性化Scala。但隨之而來的問題是,怎么樣能讓一個(gè)mixin發(fā)現(xiàn)其他mixin?如果他們需要一些來自其他mixin的服務(wù),他們?nèi)绾沃付繕?biāo)?標(biāo)準(zhǔn)的面向?qū)ο蠓绞绞峭ㄟ^抽象成員,只要你處理方法,這種方式就會運(yùn)作良好,但是,我們還必須要處理變量。如何才能讓mixin找到對方的域?更重要的是,我們不得不處理類型。因?yàn)槲覀儚囊婚_始就有類型嵌套,就像內(nèi)部類,這是另一個(gè)我認(rèn)為非常重要的事情。如果你選擇了mixin合成,一個(gè)Trait如何能夠找到有關(guān)所有其他Trait的內(nèi)部類,然后訪問那些類?我們發(fā)現(xiàn)(不僅是發(fā)現(xiàn),更是設(shè)計(jì)),我們可以通過在自我類型上定義一個(gè)抽象來做到這一點(diǎn)。 

那么“自我類型上的抽象”究竟是什么意思?比如在一個(gè)類中,this類型代表什么意思?你會說,“表示這個(gè)類的類型?!贝蠖鄶?shù)人都會這么回答。但實(shí)際上卻沒有任何令人信服的理由。This類型很可能是指其他的東西。只存在一個(gè)界定條件,就是當(dāng)你實(shí)際創(chuàng)建一個(gè)類的實(shí)例的時(shí)候,然后這個(gè)你所創(chuàng)建的對象就與該類有同樣的功能。這就與處理抽象方法時(shí)相同。你可以在一個(gè)類中定義一個(gè)抽象方法,并且不需要實(shí)現(xiàn)。這其實(shí)并不危險(xiǎn),因?yàn)楫?dāng)你創(chuàng)建一個(gè)該類的實(shí)例時(shí),你將會檢查是否所有抽象方法都有具體實(shí)現(xiàn)。因此,自我類型的抽象只是這種問題的一個(gè)一般化,也可以讓你處理域和類型。 

自我類型抽象的技術(shù)非常值得探索。早期,我們建立一種演算來研究這個(gè)問題,稱為nu對象演算—νObj,我們于2003年,在面向?qū)ο蟪绦蛟O(shè)計(jì)歐洲會議上公布它( ECOOP 2003年)。我們最初發(fā)現(xiàn)這一概念只是作為一個(gè)技術(shù)訣竅,為了使演算過程能夠簡單。直到后來開始使用它之后我們發(fā)現(xiàn),也許這將是有益于語言的東西。那時(shí)候我們還不太了解到底會有什么用處,但我們決定嘗試。直到后來,我們才發(fā)現(xiàn),它實(shí)現(xiàn)了我們想要的,即讓一個(gè)Traits聲明它所需要的來自其他Traits的東西。這就像是現(xiàn)在的一些工具,如Spring所實(shí)現(xiàn)的功能,被稱為依賴注入。但通常這種依賴注入只能適用于域,也許對方法也管用,但我們可以讓它還能應(yīng)用于類型。此外,在Scala中,這種注入是靜態(tài)完成而不是運(yùn)行時(shí)完成,其次,它達(dá)到了對于內(nèi)部類型的類型安全要求。因此,從某種意義上說,它比目前的一些工具如Spring做的更好。

我為什么要學(xué)習(xí)Scala?有什么好處嗎?

51CTO推薦閱讀:基于JVM的語言正在開始流行

Bill Venners:以后的采訪中,我們將會繼續(xù)再次探討依賴注入,您剛才談到關(guān)于自我類型的“抽象”。您提到的必須要解決的兩件事是函數(shù)式和面向?qū)ο蟮娜诤弦约懊嫦驅(qū)ο蟮膭?chuàng)新。如果我的工作室Java編程,在實(shí)際工作中,這些東西如何能夠幫助我?我能得到什么實(shí)質(zhì)的益處? 

Martin Odersky:我們正面臨的挑戰(zhàn)之一,是我們想融合函數(shù)式和面向?qū)ο蟆N覀兒茉缇痛_定了這種概念,即不可變類是非常非常重要的。現(xiàn)在大家都在談?wù)摬豢勺冾?,因?yàn)槿藗冋J(rèn)為這是解決目前由多核電腦所引起的問題的一個(gè)關(guān)鍵方法。大家都說,不管你做什么,你都要嘗試讓你的代碼盡可能多的使用不可變類。在Scala中,我們也從很早就采用這種方法。五,六年前,我們開始深刻考慮不可變的類。但事實(shí)證明,大量的面向?qū)ο箢I(lǐng)域一直都在使用可變對象。對于他們來說,可變狀態(tài)和對象是同一回事:可變狀態(tài)是一個(gè)對象中必不可少的組成部分。我們必須從本質(zhì)上解釋這個(gè)問題。 

例如,對于一個(gè)標(biāo)準(zhǔn)的Java對象,你將創(chuàng)建一個(gè)域,基本上是一個(gè)可變域。然后你還需考慮構(gòu)造函數(shù),接收參數(shù)并為域賦值。這就是可變的概念,內(nèi)置到每一個(gè)Java類?,F(xiàn)在,Java具有final域概念,它不被認(rèn)為是可變的,因?yàn)樗辉跇?gòu)造函數(shù)中被賦值一次。但你仍然能看到賦值操作。我們希望能有一個(gè)更清晰的概念,讓你不需要看到構(gòu)造函數(shù)和賦值操作。 

使用Scala我們最后所做的事是直接確定類的參數(shù)。你只需要在類名后寫一個(gè)參數(shù)列表,這些就成為類的參數(shù)。不存在獨(dú)立可變域和構(gòu)造函數(shù)的概念,這些實(shí)際上轉(zhuǎn)變成了一些我們必須要解決的問題。其中之一是,如果你想要有幾個(gè)構(gòu)造函數(shù),那要怎么辦?我們必須為其確定語法和規(guī)則。你可以在你的primary(主要)構(gòu)造函數(shù)之外使用auxiliary(輔助)構(gòu)造函數(shù)。另一個(gè)問題是,如果你希望你的參數(shù)作為一個(gè)域可見化,該怎么辦?需要?jiǎng)?chuàng)建一個(gè)單獨(dú)的域,然后再賦值嗎?或者是有可能傳遞參數(shù)給一個(gè)類,然后立即變成一個(gè)域而對其他人可用?因此,我們必須為其創(chuàng)建語法,我相信這種做法也是全新的。最后在面向?qū)ο蠓矫孢€有很多其他新穎的想法。 

Bill Venners:對于我這樣的一個(gè)Java程序員,能得到什么益處? 

Martin Odersky:好處就是你可以用更簡潔的語法來定義類。使用Scala編寫類,能夠更容易、更簡潔。如果你想要使用不可變類,那將更加容易,因?yàn)樗浅_m合做這件事。你還可以像使用Java那樣來使用Scala定義可變類。這甚至比用Java更方便,但Scala真正耀眼的地方還在于它的不可變類。它比Java更自然、更簡明。

編者后記:

隨著業(yè)界開始流傳基于JVM的語言正在開始流行這樣的聲音,處在基于JVM的非Java語言之首的Groovy和Scala被寄以相當(dāng)大的期望。曾經(jīng)有一篇英文文章對于幾個(gè)JVM語言(Groovy,Scala和JRuby)進(jìn)行了比對,結(jié)果是無論從速度,緩存需求還是垃圾處理方面,Scala都是最適合企業(yè)級開發(fā)的語言。究竟Scala是否真的如此神奇,還讓我們拭目以待。

【相關(guān)閱讀】

  1. Java以外的選擇 Scala編程語言簡介
  2. Java之外,選擇Scala還是Groovy?
  3. Scala創(chuàng)始人:創(chuàng)造比Java更好的語言
責(zé)任編輯:yangsai 來源: 51CTO.com
相關(guān)推薦

2015-11-02 09:19:10

程序員JavaScript

2010-10-09 09:20:08

.NET

2015-07-20 10:11:08

程序員幸福

2009-11-17 09:41:49

程序員的學(xué)歷

2016-12-01 13:40:37

2024-08-30 09:51:06

JavaPython語言

2016-03-21 14:33:23

JavaPython程序員

2018-03-27 10:52:59

程序員不適合C++

2018-10-24 10:24:41

JavaScala開發(fā)者

2011-08-11 14:52:59

2013-10-29 10:24:31

程序員漫畫

2015-09-24 09:04:36

程序員

2015-06-05 14:15:13

程序員難升職

2011-09-18 09:42:08

程序員

2014-08-15 11:07:09

程序員

2011-12-20 09:01:25

.NET

2012-09-06 10:30:58

2016-03-15 08:51:12

程序員生活怪異

2020-10-20 11:33:36

聯(lián)網(wǎng)安全

2014-05-30 15:56:26

iOS 8WWDC2014
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號