卷2:第22章 Yesod

22. Yesod


来自The Architecture of Open Source Application -- Volume.2 --第22章

Preface:

这篇文章是在图灵社区中接受的第一份翻译工作 ---- 翻译AOSA(The Architecture of Open Source Application),目的是:

  • 在翻译文档的过程中深入学习开源软件架构,同时进行知识共享
  • 认识更多的人

以下是AOSA的第2卷的第22章,关于Yesod这个Web框架的(由),Yesod的简单介绍可以参照Wiki,及其官网. 由于是初稿翻译,今后也将不断完善,欢迎指正。

Yesod 是用Haskell语言编写的Web框架。目前流行的众多Web框架得益于其宿主动态语言的某些特性,而Yesod则不同----其得益于Haskell的静态语言的特性,使得代码更高效,也更安全。

Yesod的开发从两年前起至今,一路不断地发展,也使之变得越发地强大。Yesod被创造伊始,便是为了满足解决实际项目问题的需要,同时其也在实际项目经验积累中不断地完善起来。起初,该框架的开发以及维护完全就是“个人秀”的行为,而紧接下来的一年里,在源自于社区不断开发以及维护努力之下,终于使得Yesod一跃成为了非常活跃的一个开源项目。

Yesod处于萌芽阶段时,并没有很好的定义、设计,有哪个实际项目组愿意尝试其进行开发是一件让人想都不敢想的事。后来,Yesod的变更使之逐渐进入稳定阶段,并且也被应用到了一些实际项目中,这时候我们也开始着手对设计决策的不足进行重新考察。那时起,我们将改善项目的主要精力投放于如何让面向用户的API更易用 ---- 很快我们有了稳定的1.0发行版。

你可能会问:为什么要再开发一个Web框架呢? 或者让我们换一种提问方式:为什么要用Haskell呢? 一般看来,目前世界上大多数开发者都围绕以下两类语言风格:

  • 静态类型语言,比如Java,C#和C++。这些编程语言提供高效的代码执行以及类型安全,但开发起来总让人觉得比较笨重

  • 动态类型语言,比如Ruby和Python。这些编程语言极大地提升了生产效率(至少短期来说是这样),但是却难掩执行效率的相对低下以及编译器对程序正确性验证支持不足的特点(对于最后这点而言,解决方案是进行一定的单元测试。我们一会儿会谈到。)

这是对语言的一种错误的二分法。静态类型语言没有理由变得这么愚蠢。Haskell在作为强类型语言的同时,也兼顾了许多Ruby和Python中的表达特性。事实上,Haskell的类型系统比Java及其语言家族更加严谨,能在编译期纠正更多的错误:空指针异常被排除了;不可变的数据结构简化了代码推理的同时,也简化了并行与并发编程。

那么为什么选择Haskell? 它是一门高效的,对开发者友好的编程语言,它也提供了许多编译时期程序正确性的检查。

Yesod的目标就是Haskell的强大特性引入到Web开发中去。Yesod努力让你的代码更加紧凑,尽最大可能让你的每一行代码在编译器都完成正确性检查。换句话说,与需要大型库去单元测试程序基本属性相对地,编译器都为你做好了。

从深层面来说,我们在Yesod中运用了尽可能多的高级性能优化技术,有了它们的帮助,你的高层次代码运行起来便能如虎添翼。

22.1 与其他Web框架的比较

总的来说,Yesod与其他主流框架(Rails,Django之流)大同小异。其主要采用了MVC范式----通过一个模板系统将逻辑与表现分离,同时提供了一个对象关系映射(ORM)系统,以及一个用于完成路由的前端控制器。

Yesod强大的地方在于一些细节之处。Yesod尽可能在编译阶段捕获错误或者异常,而非延迟到运行时,并且通过类型系统提供自动化捕捉bug以及保证安全性缺陷。尽管Yesod的目标是维护一系列用户友好,高层的API,但其采用了许多函数式编程世界的新技术来提升程序的性能的同时,也不惧对开发者暴露这些内部细节。

Yesod在架构上的主要挑战来自于如何平衡这两个看上去相互冲突的目标。举例来说,Yesod路由方式(称为类型安全的路由)并没有特别地标新立异。从历史上来看,实现类似问题的解决方案总是一个乏味并且伴随错误丛生的过程。应对类似的问题,Yesod的解决方案采用了Template Haskell(代码生成的一种形式)使得一些中间步骤实现了自动化,从而加速了解决方案实现的过程。

类型安全的HTML已经存在好一段时间了,在这个方面,Yesod既保证类型安全的威力得到充分发挥,也保持了对于开发者友好的通用模板语言所应有的特点。

22.2 Web应用接口(WAI)

待续..