Posted on 2008-06-18 00:20
dennis 閱讀(2058)
評論(0) 編輯 收藏 所屬分類:
java 、
涂鴉
JavaOne2008上有個session《Upcoming Java Programming Language Features》,講了即將到來的jdk7可能引入的新的語言特性,比較開眼界的是jsr308對Annotation的擴展使用,更多地作為斷言或者說checker使用以便減少bug。在ppt前面,我覺的更有意思的是對java語言演化的講述,做個筆記。
1、應用VS.語言
應用是特性越多越好,應用是rich的;而語言是pure的,更少的、普通的特性更好。
2、添加一個java語言特性的三個前提:尊重過去、著眼未來以及顧及模型。
無論是增加、減少或者改變一個feature都可能broken已經存在的代碼,一個新增加的feature必須兼容已經存在的代碼,兼容是個沉重的包袱,就java語言而言,我相當認同尊重過去這一點,哪怕加入閉包這樣的特性也不應當以損壞兼容性為代價,更好的選擇是將這些特性讓jvm上的新語言去實現(比如JRuby、Scala),java語言作為成熟的工業語言本身不應當做太大的改變。而著眼未來,也就是說新的語言特性應該為未來的語法擴展留有空間,它的語法/語義不應當跟現存的或者潛在的特性相沖突,以便可以持續地演化。再談顧及當前的模型,一門語言代表著一種計算模型,比如simula是OO模型(classes),Erlang就是inter-process
communication的模型(actor)。Java語言也有一個簡單的模型:首先它是“高層”語言,是一門通用、并發、基于類的OO語言,其次,它跟API、JVM有良好的結合。Java語言模型有四個原則:
a)鼓勵high-level實踐,通過抽象來隱藏偶然復雜度。簡而言之:do
the right thing。
b)追求清晰,程序被讀的時候遠遠多于寫。簡而言之:do
the thing right.
c)青睞靜態類型,靜態類型能增進對代碼的信心,靜態類型能證明bug在編譯時的不存在,而測試和動態類型能證明bug的存在。我的觀點是,大多數難以尋找和解決的bug都是runtime的,靜態類型在此方面能給出的幫助有限,充分并且適宜的測試更加能增強你對應用的信心。
d)語言比之API的更廣泛。one
language,many
api。API來去匆匆,而語言卻是forever,因而將語言和API分離是明智的,一些特性可以做為庫來實現,jdk5并發庫的引入就很好,jdk7在并發方面同樣將引入fork/join模型。
java語言的演化也當遵循這四個原則。再看看傳說中的閉包語言,當它跟泛型結合的時候寫出來的東西還談得上清晰嗎?閉包的實現能否解決兼容性問題也是個疑問。就四個提案,C3S需要引入method關鍵字(類似lambda),FCM的#號看起來比較怪異,在我看來,CICE和BGGA更符合胃口,CICE對java語言的變動應該最小,學習曲線也比較平緩,BGGA的=>符號更有函數式語言的味道。閉包的引入,某種程度上能減少敲擊鍵盤的次數并實現一些高階功能,特別是在聚合操作(如filter、map等)和單抽象方法類(如Runnable,Callable)的使用上,但是在現代IDE的自動化幫助下,這個帶來的價值是值的懷疑的。