最近在 Codecademy 把 Ruby 這個我沒學過的語言給跑了一遍,之前我是覺得這語言有點醜啦,但深入了解一下之後,我發現是有他的哲學存在的。
所以我現在想稍微比較一下我碰過的語言,比較一下社群的生態
Ruby
先拿 Ruby 來聊聊,因為才正剛好跑完一趟他的教學。一開始我看到 Ruby 的 Block 是用 end 結束,我就聯想到 Pascal 這個號稱當代最美的程式語言。
Pascal 真的很美,也幾乎都做得很好,但是美中不足的就是 begin - end 來當作程式的 block ,換在 C 或是絕大部分語言就是 '{', '}' 這兩個括號
為什麼美中不足,就是因為當一個軟體開發變得很大的時候,過多的巢狀 begin 跟 end 在程式碼裡面,是會讓眼睛花掉的,可讀性大大的降低。
不過我想 Ruby 應該是有考慮到這點,所以絕大部分的語法像是 if, else, method, class 是沒有 begin 只有 end 代表宣告這段 code 的結束。
而我之所以突然不覺得 Ruby 有我想得那麼糟,是因為 Ruby 的功能之強,必須在語言的可讀性和強度間作到一個平衡,他的可讀性絕對沒有 Python 好。 但是已經可以讓人看懂了,而除了一般語法就夠好用之外,也生了算是蜜糖的東西讓開發者用簡單的語法寫出以往是比較長的程式碼。
但是程式碼短,並不代表可讀性高,舉個 push 的例子。
[1, 2, 3].push(4)
[1, 2, 3] << 4
這兩個用途是一樣的,但後者是一個蜜糖,讓你可以把東西塞到裡頭,我想 Ruby 哲學應該是「少勝於多」,所以小弟我在練習的時候,有些許的壓力。
因為有很多很棒的東西可以幫你縮短語法,但是又很怕哪一天沒記住,就少了一個強而有力的工具。其實這部份的「強」真的是跟 Perl 有得比。
但我不喜歡 Ruby 的其中一個點就是 Ruby 的語法因為有太多方法作到同一件事情,很沒有一致性,雖然是很方便沒錯,但是比較沒有共同的規範。
舉個例子來講,我覺的 Ruby 呼叫 method 的時候可以不用括號來丟參數是很不錯,以往要像 Hello("FreedomKnight")
這樣,現在可以
def Hello name
puts "Hello #{name}"
end
Hello "FreedomKnight" #不需要括號就能夠呼叫 Hello
但是那個括號是可選可不選的,雖然這樣看起來像 tcl 這種命令式語言一樣輕鬆,但是我卻不能做到我以為可以做到的單行宣告(參數跟程式碼在同一行會混淆直譯器),
像是 def Hello name puts "Hello #{name}" end
,我是有找到可以作到單行宣告的方法,但是就像是前面的蜜糖那樣,又多了很多方法作到同一件事。題外話,其實我最初以為加個 do 在中間讓他看起來像個 Block 就可以,但好像行不通。
基本上,我覺得 ruby 的哲學是在可讀性跟功能性取平衡。因此功能很多,而且不少是直接降到語法、語言層次,而不是以 API 或是 function 的方式處理,在不熟 ruby 的階段,會有害怕某些強大功能沒記起來的壓力。
Python
Python 的哲學我想大家都知道,就是簡潔、同一件事盡量只有一種方法做到。跟 ruby, perl 的哲學完全相反,以往是因為 Python 才對 ruby, perl 有起了小反感,直到我這陣子摸了 ruby ,只能說哲學不同而已。
Python 一切就很好,也很會斟酌新功能的可讀性與美感,就像 Guido 所想的那樣,他認為一個 programmer 讀 code 比寫 code 的時間還要多,因此才要加強一個語言的可讀性,也生出了 PEP 8 這樣的規範。
換句話說,Python 跟我一樣有偏執狂,甚至從 Python 2 升級到 Python 3 時,把以往設計不好的地方給大改,完全不相容。是讓語言變好了,但對軟體界是個大傷害,Python 3 出到現在也好幾年了,卻還有一些軟體卡在 Python 2 升不上來,而 PyPI 裡的 Package 還要特地標註為 Python 3。
而偷看了一下 ruby 跟 nodejs 的崛起,其實有很大部份是靠他們的官方 package repo ,像是 gem 跟 npm ,而 Python 卡在這個版本的鴻溝之外,也沒有一個官方的 repo 系統(python 3.4 終於準備要包進 pip 了),只有兩個第三方的軟體 pip 跟 easy_instell,剛玩 python 應該都還不知道有這麼方便的 repo ,Python 應該考慮把 PyPI 經營成 gem 那個樣子。
NodeJS
這東西我玩不多,但是我知道很多人對 js 有著厭惡感,其實我相信,這絕對是拿以往學程式的經驗跳過來。發現 js 的物件機制怎麼跟以往不同。還有為什麼 js 這麼多匿名的 function 。如果對 js 有厭惡感應該得細心的體會一下這些呀!匿名的 function 非常的 event driven 的呀!
不少先入為主的觀念卡在 js 上,但是時間讓 js 從瀏覽器上當作跑馬燈的工具 -> 瀏覽器上的王者前端語言 -> 我何必後端要用其他語言呢?跟前端一樣就好了
而 NodeJS 雖然很年輕,但是成長幅度卻是眾多語言當中,爬升最快的語言,當然 npm 也是對社群幫助很大。
PHP
跟 js 比起來,PHP 的誤會也不少,因為 PHP 早期可是為了讓初學網頁的人,都能用直觀的方式寫後端,所以他設計成嵌入在 HTML 當中。也就是可以當作樣板引擎,當看到 PHP 的標籤,就把標籤內的東西全部轉換成 HTML。
而早期為了簡單,對物件導向的支援根本趨近於零。但是近期已經強化超級多,我覺得到 5.5 已經差不多完整一切了。但是許多人還是拿舊印象來打 PHP。
PHP 看到 npm 跟 gem 之後,社群也開始在思考 pear 的缺點,而開出一個新的計畫叫做 composer ,讓人人都有機會可以把 package 丟上去,而且拿來管理專案的dependency 也超棒,我比較相信 PHP 未來只會越來越壯大,而不會被罵到變小。