上篇提到 Scala 有很大的野心,或說企圖心比較文雅。
Scala的企圖心是什麼?就是一次想要解決很多很多的事,最好把所有關於程式設計相關的事,全部使用同一種程式語言來解決。換句話講,就是想要讓設計師在各種應用都使用 Scala 來製作程式。
Scala的企圖心是什麼?就是一次想要解決很多很多的事,最好把所有關於程式設計相關的事,全部使用同一種程式語言來解決。換句話講,就是想要讓設計師在各種應用都使用 Scala 來製作程式。
這個野心怎麼感覺起來...有點怪怪的?咦,怎麼好像有人說出來了,喔,這個企圖心簡單講就是一統天下啦,那是你說的喔。
Martin (Scala 的設計者) 可是使用了一個很優雅的名稱 Scalable,所以稱它為 Scala,至於 Scala 是不是只是掩飾,你判斷吧。
這段話是真的嗎?Scala 有這麼大的企圖心嗎?
有!我沒騙你。Martin 在他的 Scala 簡報中就說明到,Scala 希望簡化程式者負擔,讓各個領域的開發者都使用同一程式語言來開發,這不就是要用 Scala 取代各種不同領域的程式語言嗎?所以說,他的企圖心,或說是野心,是大的,大師終究是大師,要做轟轟烈烈的事。
有!我沒騙你。Martin 在他的 Scala 簡報中就說明到,Scala 希望簡化程式者負擔,讓各個領域的開發者都使用同一程式語言來開發,這不就是要用 Scala 取代各種不同領域的程式語言嗎?所以說,他的企圖心,或說是野心,是大的,大師終究是大師,要做轟轟烈烈的事。
Martin 在他 Scala 的演講提到程式者真的很可憐,不同的應用需要使用不同的程式語言,光是在他簡報內容出現的就有( Martin 簡報:http://www.youtube.com/watch?v=zqFryHC018k)
1. Web Client 端使用 Javascript
2. Server script 方面使用 Perl / Python / Ruby / Groovy
3. Busuness Logic 方面使用 Java
4. UI 使用JavaFX(筆者:真的嗎?)
5. Datatbase方 面使用 SQL
程式設計者很可憐,不是嗎?Martin 大發佛心來的,他要設計一個程式語言,讓大家解脫,只要學習一個程式語言,就可以在各個應用使用相同的程式語言。當然啦,這個程式語言就是一個有彈性的程式語言 (Scalable Language),因此命名 Scala!
Scala 的複雜性來自於想要把 programming language 的所有問題一次解決(就算不是所有問題,至少也是大部分的問題),以便一次解決各個應用的設計問題。
既然企圖心這麼大,那就要有解決所有問題的本事啦,第一個要做的事就是要能兼納各種程式語言的優點,否則我幹麼轉換現在的程式語言到 Scala。
「好,既然這麼行,那就考考你了。」
「OK,任你考。」
「先來調解一下爭論數十年的小問題吧,到底命令式 (Imperative) 語言好,還是函數式 (Functional) 語言棒?」
「哈,我是大海納百川,兩者通吃!」
「通吃?說真的假的?這兩者語言系列的邏輯,甚至語法都不一樣耶?!」
沒錯,這兩者實在不一樣,但 Scala 就要整合,而且要讓程式設計者用起來一致。
除讓這兩種語言特性的個別優點都能充分發揮,更要能好好的共處,程式設計者用起來就像是使用同一種程式語言一樣。
除讓這兩種語言特性的個別優點都能充分發揮,更要能好好的共處,程式設計者用起來就像是使用同一種程式語言一樣。
「會不會太神了?」
哈,個人我也是覺得有點神。當然啦,你要使用它就要有兩種頭腦,imperative 與 functional 兼具。難怪大家剛接觸時都覺得複雜,覺得頭痛。尤其是 imperative 的程式設計者接觸到 functional language 的感覺,「好玄」是大家共有的心內話,所以別怕,別人跟你也是一樣。
「阿,什麼素 iImperative,什麼素 functional?」
不要擔心,你若沒聽過 functional language,那你用的程式語言就是 imperative 的。舉凡常見的 C, Java, C++, Object,甚至 assembly 都是。
筆者也是 imperative 用慣的,我們的頭腦都是一串串 statement 累積下來,這種寫法就是命令式。
筆者也是 imperative 用慣的,我們的頭腦都是一串串 statement 累積下來,這種寫法就是命令式。
「那什麼是 functional 的呢?」
當有一種程式, 它使用一堆你看不懂的程式碼寫出來,你不仔細看,就很難看得懂(甚至仔細看也看不懂)的,那就是 functional,函數式語言了。
函數式語言顧名思義,就是寫程式很像在寫數學函數一樣,所以腦海裡的思考是哪一個函數要使用哪個函數,算出什麼值,所以都在描述函數的定義,不是在描述一連串的 statement。
玄吧?!
「怎麼 functional language 好像不做正經事,只寫函數就可以把事情做完嗎?」
好像是耶,而且確實也是耶。你會這樣想就代表你的頭腦被命令式 (imperative) 語法深深影響,未來學習 Scala 函數式部份時,會有許多頭腦轉換的痛苦掙扎(當然你也可以只用Scala的命令式的部份,就不會掙扎了)。
「有哪些是 functional language?」
很多,Smalltalk、Haskell、Lisp 都是,函數式語言會寫的人都說很爽,寫起程式來是飛快又容易對。
看到這種情況,對熟悉命令式的程式設計者簡直就是玄,那些人說的是真的還是假的?函數式語言有這麼神奇嗎?
確實是真的!
看到這種情況,對熟悉命令式的程式設計者簡直就是玄,那些人說的是真的還是假的?函數式語言有這麼神奇嗎?
確實是真的!
你若想嘗試看看 functional language 的威力,想好好學一下函數式的程式編寫方式,除了 Scala外,筆者認為 Haskell 會是一個不錯的選擇。
其實,如果你是命令式程式語言的 programmer,學習 Scala 的次序或許應該顛倒一下,先去學一下純函數式的程式語言,回頭再學習 Scala 會比較好,否則你很容易將 Scala 用得缺少了一半的能力,只剩命令式的那一半。
「那命令式與函數式兩者有什麼區別?」
函數式語言最大的特色是操作對象是函數與值,所以會將函數轉來轉去,值也轉來轉去,最常用的資料結構就是 collection,List 是很常見的一個代表。函數式語言強調程式中每個東西都是函數與值。
每次函數的執行只要參數相同,就會得到相同的值,這叫做「可重複性」。函數不應該有副作用 (side-effect),也不受執行時間與次序的影響。
Function 所使用以及所產生出來的值也都是不可變的(都是常數),不會有變數這檔子事。
Function 所使用以及所產生出來的值也都是不可變的(都是常數),不會有變數這檔子事。
這種特性在程式寫作上有它的好處,不會有共用與競賽 (Race-Condition) 的問題。在平行處理上,這種特性非常佔上風,你幾乎不用擔心多個執行緒所造成的問題。
命令式語言的本質剛好與函數式顛倒,開宗明義就是有一大堆資料結構(不管是否是使用 object 包裝起來),然後透過各個 statement 來修改,讀取這些資料,然後繼續後續的工作。
簡單講,命令式語言關心的是 statement 的次序與資料的修改與讀取。
簡單講,命令式語言關心的是 statement 的次序與資料的修改與讀取。
命令式語言以資料修改為主,函數式以函數為主,二者關心的重點不同,思考邏輯也不同,因此才會顯得彼此格格不入,爭論數十年。
在命令式語言中有點點與函數式沾上邊,可能只剩下遞迴 (recursive)。
筆者這樣說,一定有很多函數式語言的基本教義派不認同。沒關係,這麼說只是想讓命令式語言的使用者有點函數式的感覺,請不要太介意。
阿,你不用遞迴,那你該回去修一下基本功了,完全用loop也不是辦法。
筆者這樣說,一定有很多函數式語言的基本教義派不認同。沒關係,這麼說只是想讓命令式語言的使用者有點函數式的感覺,請不要太介意。
阿,你不用遞迴,那你該回去修一下基本功了,完全用loop也不是辦法。
到這,你應該發現,命令式與函數式這兩者的差別就是天跟地,程式設計者頭腦轉的方式都不一樣。
Scala 第一個要解決的就是這個問題,硬是把它們整合在一起,而且在使用上要讓二者一致,不容易吧!其實,Scala 也不是第一個嘗試整合命令式與函數式的語言,也不用太大驚小怪。
Scala 第一個要解決的就是這個問題,硬是把它們整合在一起,而且在使用上要讓二者一致,不容易吧!其實,Scala 也不是第一個嘗試整合命令式與函數式的語言,也不用太大驚小怪。
除了命令式與函數式外,Scala 還要兼顧流行了一、二十年 Object Oriented 設計方式,更要接收 Java 的龐大資產(讓 Java 設計師很容易接受),所以你說,它怎麼會不複雜,功能又怎會不強?
說到這裡,要說一個小秘密,Martin 其實是有點小偏心。為了接收廣大 Java 的資產,Scala 的語法大量參考 Java 的語法精義。所以說他的設計方式是以命令式的 OO 為主,再行接納函數式的好處,妙吧。
個人覺得純函數式的程式設計者看到 Scala 的設計方式,應該也會大大吃不消,覺得離經叛道吧(通常,純函數式的程式設計者也是不習慣命令式的用法的)。
沒有留言:
張貼留言