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