2014年1月16日 星期四

Scala 前言1, 是Java的下一步也是物件導向的下一步

前言
重點不是What is Scala, 而是Why, 重點不是多了酷炫的語法 or Framework, 而是OOP的下一步是甚麼 ?當cpu發展已經走到多核心而你的program只能在一個processor裡面龜速的時候, 該意識到時代正在改變, 學Scala對我來說不是最佳解, 只是邁向下一個進化必然的階段而已


OOP's Next step


OOP是一個劃時代的發明, 電腦語言最原始的0與1的組合被抽象化成現實世界中的物件組合,大大的促進了programming language的推廣與應用. OOP更被CS列為必修課程之一, 然後一路從大學到研究所, 到業界到建置各種Software & Service等等. 當然OOP不是完美語言, 去建置各種不同的Service(ex Web, APP)會很困難, 因此一些彌補OOP不足的Framework(ex MVC)一一浮現出來, 可是根基不改, 最後還是會被一道牆壁而堵住

這道牆若要說是莫爾定律的極限, 但並非IC design人員且跟硬體很疏遠的programmer, 不如換個角度來觀察;現在市面上的CPU Core基本上都是 4核心起跳, 平行化處理是最有效率的去提升Software Performance, 儘管現在大家泛用的語言都有提供 Thread相關的 Library, 先別說到底有多少人真的有去實用過

看OOP最精隨的Call by reference, Shared data很容易在多個Thread 間同時存取&修改,但是造成的Data inconsistency, 導致每一次的Output都像開樂透一般難以預料, 當你的Application不能正確符合邏輯與User的期待時候, 就已經不是一個Program.

Shared data的問題增加了Concurrency的複雜度, 常見的 Lock 機制所導致的Race condition & Dead lock 也不是一天兩天可以解決或者避免. 最糟糕的是當Shared data 在Concurrency處理中出錯了, Recovery 幾乎是不可能的任務. 這種先天上的缺陷, 後天再怎麼補救往往都是自欺欺人. 困難的問題還是留給真正的專家解答, 我們應該有更好的選擇,

換個方面, 直接刪掉看似萬惡根源Shared data, 那麼Thread就失去了Composition的功能, 最後也會無法平行分工, 又回到單一process的問題, 深入探討Shared data在Concurrency中產生的問題是Data inconsistency, 這是當多個Threads有能力修改Shared data時候才會發生, 因此真正問題是Mutable variable; OOP的第一道牆也就是 Mutable variable

Scala First step : Immutable variable


Mutable variable造成的Data inconsistency, 那麼就把它改成Immutable variable, 所謂的Immutable variable 就是當這個Variable的Value只有在宣告時期才能Assign(類似於Java的 final keyword概念), 往後面的執行時期都不能改變, 如此一來就不會有Data inconsistency的問題

Scala的第一步:Immutable variable
先簡單看一下Scala裡面的 variable 宣告
 val message : String = "Hello world"  
val 是Scala中的Keyword, 表示宣告message為Immutable variable
儘管Immutable variable在Scala是很重要的Programming paradigm,但也只是個典範
在Scala中沒有強制所有的Variable為Immutable
也因此在Scala中變數的宣告一開始要先表明該變數是Immutable or Mutable
val Keyword意思就是它是一個Value ,往後不可以再改變

如果messgae variable改用Mutable variable的宣告的話
 var message : String = "Hello world"  
var Keyword意思就是它是一個Variable ,往後還是可以任意改變

繼續把該句語法看完, meaasge就是變數名稱,
:(冒號) 後面指名該變數的Type, 這邊是String
= (等號) 後面就是Assign的值

儘管Scala 有提供var 讓你可以使用Mutable variable, 但若真的要善用Scala Concurrency的特性, 還是得必須換個觀念, 開始使用val, 可是一但Variable宣告為Immutable variable, 在後面執行過程遇到改變, 產生新的值, 那麼就會變的很不方便, 必須不斷的去宣告新的Variable才能儲存新的結果

在這一部分,如果還繼續用著OOP的Mutable variable觀念當然會很難去Programming, 要如何在Programming過程中善用val, 這就是學習Scala要知道的另一大重點:Functional programming

繼續閱讀  Scala 前言2 - is Scalable by OOP & Functional Programming

沒有留言:

張貼留言