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