Preface:
> 這篇文章是在圖靈社區中接受的第一份翻譯工作 ---- 翻譯[AOSA(The Architecture of Open Source Application)](http://aosabook.org/en/index.html),目的是:
>
> * 在翻譯文檔的過程中深入學習開源軟件架構,同時進行知識共享
> * 認識更多的人
>
> 以下是AOSA的第2卷的第22章,關于Yesod這個Web框架的(由),Yesod的簡單介紹可以參照[Wiki](http://en.wikipedia.org/wiki/Yesod_(web_framework)),及其[官網](http://www.yesodweb.com/ "Yesod website"). 由于是初稿翻譯,今后也將不斷完善,歡迎指正。
[Yesod](http://www.yesodweb.com/ "Yesod website")?是用[Haskell](http://www.haskell.org/ "Haskell website")語言編寫的Web框架。目前流行的眾多Web框架得益于其宿主動態語言的某些特性,而Yesod則不同----其得益于Haskell的靜態語言的特性,使得代碼更高效,也更安全。
[Yesod](http://www.yesodweb.com/ "Yesod website")的開發從兩年前起至今,一路不斷地發展,也使之變得越發地強大。[Yesod](http://www.yesodweb.com/ "Yesod website")被創造伊始,便是為了滿足解決實際項目問題的需要,同時其也在實際項目經驗積累中不斷地完善起來。起初,該框架的開發以及維護完全就是“個人秀”的行為,而緊接下來的一年里,在源自于社區不斷開發以及維護努力之下,終于使得[Yesod](http://www.yesodweb.com/ "Yesod website")一躍成為了非常活躍的一個開源項目。
[Yesod](http://www.yesodweb.com/ "Yesod website")處于萌芽階段時,并沒有很好的定義、設計,有哪個實際項目組愿意嘗試其進行開發是一件讓人想都不敢想的事。后來,[Yesod](http://www.yesodweb.com/ "Yesod website")的變更使之逐漸進入穩定階段,并且也被應用到了一些實際項目中,這時候我們也開始著手對設計決策的不足進行重新考察。那時起,我們將改善項目的主要精力投放于如何讓面向用戶的API更易用 ---- 很快我們有了穩定的1.0發行版。
你可能會問:為什么要再開發一個Web框架呢? 或者讓我們換一種提問方式:為什么要用[Haskell](http://www.haskell.org/ "Haskell website")呢? 一般看來,目前世界上大多數開發者都圍繞以下兩類語言風格:
* 靜態類型語言,比如Java,C#和C++。這些編程語言提供高效的代碼執行以及類型安全,但開發起來總讓人覺得比較笨重
* 動態類型語言,比如Ruby和Python。這些編程語言極大地提升了生產效率(至少短期來說是這樣),但是卻難掩執行效率的相對低下以及編譯器對程序正確性驗證支持不足的特點(對于最后這點而言,解決方案是進行一定的單元測試。我們一會兒會談到。)
這是對語言的一種錯誤的二分法。靜態類型語言沒有理由變得這么愚蠢。Haskell在作為強類型語言的同時,也兼顧了許多Ruby和Python中的表達特性。事實上,Haskell的類型系統比Java及其語言家族更加嚴謹,能在編譯期糾正更多的錯誤:空指針異常被排除了;不可變的數據結構簡化了代碼推理的同時,也簡化了并行與并發編程。
那么為什么選擇[Haskell](http://www.haskell.org/ "Haskell website")? 它是一門高效的,對開發者友好的編程語言,它也提供了許多編譯時期程序正確性的檢查。
[Yesod](http://www.yesodweb.com/ "Yesod website")的目標就是Haskell的強大特性引入到Web開發中去。[Yesod](http://www.yesodweb.com/ "Yesod website")努力讓你的代碼更加緊湊,盡最大可能讓你的每一行代碼在編譯器都完成正確性檢查。換句話說,與需要大型庫去單元測試程序基本屬性相對地,編譯器都為你做好了。
從深層面來說,我們在[Yesod](http://www.yesodweb.com/ "Yesod website")中運用了盡可能多的高級性能優化技術,有了它們的幫助,你的高層次代碼運行起來便能如虎添翼。
## 22.1 與其他Web框架的比較
總的來說,[Yesod](http://www.yesodweb.com/ "Yesod website")與其他主流框架(Rails,Django之流)大同小異。其主要采用了MVC范式----通過一個模板系統將邏輯與表現分離,同時提供了一個對象關系映射(ORM)系統,以及一個用于完成路由的前端控制器。
[Yesod](http://www.yesodweb.com/ "Yesod website")強大的地方在于一些細節之處。[Yesod](http://www.yesodweb.com/ "Yesod website")盡可能在編譯階段捕獲錯誤或者異常,而非延遲到運行時,并且通過類型系統提供自動化捕捉bug以及保證安全性缺陷。盡管[Yesod](http://www.yesodweb.com/ "Yesod website")的目標是維護一系列用戶友好,高層的API,但其采用了許多函數式編程世界的新技術來提升程序的性能的同時,也不懼對開發者暴露這些內部細節。
[Yesod](http://www.yesodweb.com/ "Yesod website")在架構上的主要挑戰來自于如何平衡這兩個看上去相互沖突的目標。舉例來說,[Yesod](http://www.yesodweb.com/ "Yesod website")的[路由方式](http://www.yesodweb.com/blog/2012/01/aosa-chapter#file1414-routes)(稱為類型安全的路由)并沒有格外標新立異。從歷史上來看,實現類似問題的解決方案總是一個乏味,伴隨錯誤叢生的過程。應對類似的問題,[Yesod](http://www.yesodweb.com/ "Yesod website")的解決方案在于采用了模板Haskell(Template Haskell,代碼生成的一種形式)使得一些中間步驟實現了自動化,從而加速了解決方案實現的過程。
類型安全的HTML已經存在好一段時間了,在這個方面,[Yesod](http://www.yesodweb.com/ "Yesod website")既保證類型安全的威力得到充分發揮,也保持了對于開發者友好的通用模板語言所應有的特點。
## 22.2 Web應用接口(WAI)
> 待續..
- 前言(卷一)
- 卷1:第1章 Asterisk
- 卷1:第3章 The Bourne-Again Shell
- 卷1:第5章 CMake
- 卷1:第6章 Eclipse之一
- 卷1:第6章 Eclipse之二
- 卷1:第6章 Eclipse之三
- 卷1:第8章 HDFS——Hadoop分布式文件系統之一
- 卷1:第8章 HDFS——Hadoop分布式文件系統之二
- 卷1:第8章 HDFS——Hadoop分布式文件系統
- 卷1:第12章 Mercurial
- 卷1:第13章 NoSQL生態系統
- 卷1:第14章 Python打包工具
- 卷1:第15章 Riak與Erlang/OTP
- 卷1:第16章 Selenium WebDriver
- 卷1:第18章 SnowFlock
- 卷1:第22章 Violet
- 卷1:第24章 VTK
- 卷1:第25章 韋諾之戰
- 卷2:第1章 可擴展Web架構與分布式系統之一
- 卷2:第1章 可擴展Web架構與分布式系統之二
- 卷2:第2章 Firefox發布工程
- 卷2:第3章 FreeRTOS
- 卷2:第4章 GDB
- 卷2:第5章 Glasgow Haskell編譯器
- 卷2:第6章 Git
- 卷2:第7章 GPSD
- 卷2:第9章 ITK
- 卷2:第11章 matplotlib
- 卷2:第12章 MediaWiki之一
- 卷2:第12章 MediaWiki之二
- 卷2:第13章 Moodle
- 卷2:第14章 NginX
- 卷2:第15章 Open MPI
- 卷2:第18章 Puppet part 1
- 卷2:第18章 Puppet part 2
- 卷2:第19章 PyPy
- 卷2:第20章 SQLAlchemy
- 卷2:第21章 Twisted
- 卷2:第22章 Yesod
- 卷2:第24章 ZeroMQ