作為三十天鐵人挑戰賽的第一篇,我想先說明一下系列選題的緣起。標題中除了前三種常見熱門框架之外,Phoenix (Elixir)目前還非常罕見,Sinatra(Ruby)則是鋒芒完全被rails掩蓋。這邊我說明一下選擇框架的原因:
之所以想寫這個系列的緣起是前陣子在學Elixir,當我知道居然沒有迭代器時我實在相當震驚,震驚到當下立馬發臉書動態:
這個週末利用 Code School Free weekend學 #Elixir,得知一個驚嚇到想要馬上來分享的事實:(雖然大部份人可能不懂驚嚇的點)
「Elixir居然沒有for each方法!!!」
在Elixir 裡面要利用recursion方法(自我呼叫),寫兩個條件不同的同名函式來實作loop的效果。雖說之前就知道不同語言實際上蘊含著不一樣的思考模式,但第一次遇到這樣的差異還是覺得很吃驚。
Elixir的特性是效能與高度可取用性,可能就是因為for each是效能殺手,所以先天就不支援吧(?)。雖然還是可以自己寫類似的方法就是。 link
這件事引發我很大的興趣,在我心中視為現代程式語言基本元素之一的迭代器,居然在一個新的程式語言內會沒有,也激起我對其他語言的好奇心。我是不是在不知不覺之間把Ruby on Rails視為標準答案,而忽略了其他可能,希望這樣的比較可以讓我揭開過去的盲點。
作者按:感謝網友指正,Elixir是有each與for方法的,看來這系列是出於一個誤會XD
接下來簡單簡介一下這幾種網頁框架:
http://rubyonrails.org/
沒想到我也有需要介紹rails的一天。
直接引用別人的介紹:
Ruby on Rails 是一個已經被許多公司採用的 Web 框架,是 Ruby 程式語言中 Web 框架的鼻祖,獲得了大量開發者的採用。DHH(Rails 的創始人)曾用它15分鐘左右創建一個博客。Rails 的一大特點是約定優於配置(convention over configuration)。這意味著,它比較模式化、標準化和「約定化」,開發者通常做的是相同的事情,可以讓代碼寫到最少。Rails 還使用了 MVC(Model-View-Controller),讓架構更有組織性,更周密。
https://www.djangoproject.com/
就我先接觸rails的理解,Django就像是運作在python上的rails框架,一樣有 MVC架構(但稱為MVT Model-View-Template)。
https://laravel.com/
PHP算是相當知名且成熟的網路語言,但也長期被詬病為「義大利麵」(意指寫得一團混亂)。但這些問題在引入框架後就可以得到顯著的改善。大部份的介紹都不諱言Laravel參考了Rails的概念,因此也可以理解為運作在PHP上的rails。
http://phoenixframework.org/
不光是框架,這個語言本身知名度都還相當不足。Elixir 是架構一個在古老語言(Erlang),2013年才誕生,是一種函式導向的程式語言(有別於物件導向諸如Java、Ruby)。語法相當接近Ruby,因為語言的作者是Rails的核心團隊成員之一(又是一個像Rails致敬的產物?!),所以有相當多的Rails工程師來學。號稱善於處理 concurrency 問題,利於開發分散式/雲端運算平台。而Phoenix是Elixir的網頁框架。
http://sinatrarb.com/
本身是Ruby的一個Gem。最引人注目就是四行程式碼將伺服器跑起來,相信所有第一次接觸的人都會大為驚嘆他的簡潔性。但對我來說最大的疑惑就是,如果按照需求把最今實踐都跑起來,會不會跟rails有九成像?目前看到比較多的使用情境是API server之類的輕量服務。
至於各框架的優點、缺點,詳細比較,就留待這三十天中娓娓道來。
有這樣的比較真好。
想要指出一些小問題,首先 Elixir 是有 Enum.each/2
可以用的。它的 list comprehension 語法 for/1
也偶爾被拿(錯)來做類似的事(雖然其實這語法基本上不是用來做迭代的):
for n <- 1..10 do
IO.inspect n
end
再來 Phoenix 框架是 Chris McCord 做的,他跟語言作者 Josè Valim 甚至不是同一家公司的。此外若試著去跟 Django vs Rails 對照,這個框架在許多哲學與範式上都與前兩個 MVC 框架極度不同,像是沒有 Model 的概念之類的。而從 1.3 版開始,連基本結構都大異其趣。說受到 Rails 影響是一定有的,但是想來是不會用"致敬"這個詞。
期待你接下來的文章!
另外可以偷推 Elixir.tw meetup 及明年的 Ruby & Elixir conf Taiwan 嗎? XD
感謝你的回饋,沒想到第一天就有人報錯XD
for each 不可能有效能問題吧。比起 recursion,for 只會快不會慢。
你也太厲害了,
一下就跨那麼多不同的程式語言的framework…
我只是挖一個大洞給自己跳,逼自己要生出東西來