編程思想碰撞 Scala不是改良的Java
Scala 2.8的發(fā)布又一次帶來(lái)Scala和Java區(qū)別與聯(lián)系的熱烈討論。Scala編程語(yǔ)言擁有所有Java的語(yǔ)言特征,而且還支持所有的新興的有趣的概念,例如閉包,higher-kinded類(lèi)型,內(nèi)聯(lián)XML。如果你要?jiǎng)?chuàng)建一個(gè)JVM上的新項(xiàng)目,你是否會(huì)考慮使用Scala?
Scala編程環(huán)境非常的有意思,在2.8版本中,編譯器會(huì)為帶有unboxed的基本數(shù)據(jù)類(lèi)型的函數(shù)編譯出多個(gè)版本——這樣泛型函數(shù)就免去了性能昂貴的unboxing和boxing操作了。
Scala允許操作符重載,通過(guò)它隱含的機(jī)制,你甚至能在實(shí)例化后的對(duì)象里動(dòng)態(tài)的添加新的方法。
這些功能使你編碼時(shí)感到更方便。你基本上不需要再顯式的把數(shù)組和其它的序列類(lèi)型區(qū)分開(kāi),不需要把未封裝的double類(lèi)型和其它數(shù)字類(lèi)型區(qū)分開(kāi)。JVM上的數(shù)組、基本數(shù)據(jù)類(lèi)型和其它相關(guān)類(lèi)型的“平?;?ldquo;在某種程度上減少了使用這些類(lèi)型的復(fù)雜度。
雖然與Scala的第一次親密接觸會(huì)讓你感覺(jué)到Java如影隨形,但這些理念從根本上與Java之所以成為Java的原因相抵觸。Scala把自己定位為旨在以一種簡(jiǎn)潔、優(yōu)雅的方式表現(xiàn)常見(jiàn)編程模式的多范式編程語(yǔ)言。Java從文化上反對(duì)這些理念:Java慎重的簡(jiǎn)單。 Java設(shè)計(jì)團(tuán)隊(duì)研究了“現(xiàn)代”C和C++語(yǔ)言的各個(gè)方面后才決定了在現(xiàn)代面向?qū)ο缶幊陶Z(yǔ)言環(huán)境中哪些功能特征應(yīng)該被取消,同時(shí)又要保留C++相類(lèi)似的語(yǔ)法。
特別的,一個(gè)已知的原則,任何事情都必須非常的直接明了: C和C++里一個(gè)主要的麻煩是,你需要在大量的語(yǔ)境中去理解他人的代碼:在理解一段程序之前,你必須閱讀所有相關(guān)的頭文件,所有相關(guān)的#defines, 所有相關(guān)的typedefs。本質(zhì)上,使用#defines和typedefs編程會(huì)導(dǎo)致每個(gè)程序員都像是在發(fā)明一種新編程語(yǔ)言,只有開(kāi)發(fā)的人自己能理 解,這種情況不符合好的編程過(guò)程的設(shè)計(jì)目標(biāo)。
這種對(duì)好的編程過(guò)程的理念正是Scala極力反對(duì)的。在核心中集成領(lǐng)域特定語(yǔ)言(domain specific languages)的能力被Scala當(dāng)作一種積極因素被提倡。
按我的觀點(diǎn),判斷好的編程過(guò)程的依據(jù)應(yīng)該考慮是否能產(chǎn)生好的結(jié)果這個(gè)因素。HotJava實(shí)驗(yàn)失敗后,我們應(yīng)該承認(rèn),所有的三種主要的web瀏 覽器(Mozilla Gecko, Webkit, 和 Internet Explorer)都是用C++寫(xiě)成的,這是人們根據(jù)結(jié)果來(lái)選擇編程語(yǔ)言的行為,而不是根據(jù)了一種習(xí)慣經(jīng)驗(yàn)。
Java被認(rèn)為是從小語(yǔ)言慢慢長(zhǎng)壯大的,是一種從Lisp和Smalltalk之類(lèi)的語(yǔ)言獲取了積累經(jīng)驗(yàn)的果實(shí)。 Scala自豪于擁有強(qiáng)大的higher-kinded類(lèi)型,Java自豪于去除了多重繼承。它們更本不是相互的競(jìng)爭(zhēng)者:它們的文化取向差異巨大。
在《Java,正在老去的王者》一文中,我們分析Java的未來(lái)在于JVM語(yǔ)言的繁盛和興起,也許Scala可以推動(dòng)JVM跟其它的平臺(tái)進(jìn)行競(jìng)爭(zhēng)。它有一些好的Web公司支持它(例如Fourquare),作為一種具有強(qiáng)類(lèi)型校驗(yàn)的面向?qū)ο蟮哪_步語(yǔ)言,它是很稱職的。
Java是有意設(shè)計(jì)成非面向程序員的。這就是Java的特點(diǎn)——它是專(zhuān)門(mén)被設(shè)計(jì)成防止那些有問(wèn)題的程序員給自己制造麻煩。如果你討厭JVM,我想問(wèn)題應(yīng)該是:多少防護(hù)措施對(duì)你的程序員是合適的?Scala給出的答案本質(zhì)上和Java是相反。
【編輯推薦】