Haskell

2014年断断续续学了一阵子 Scala 语言,Scala 真的不错,将面向对象和函数式编程两种范式结合得很好,对 Java 程序员非常友好。不过,从学编程开始就受命令式编程的思想的浸淫,要使用函数式编程的思想相当困难,思路转不过来,而 Scala 又不强迫你用 FP,所以写出来的程序基本上还是命令式的。不少人都推荐学 Haskell 作为函数式编程的入门,作为一门学院派的语言,它非常纯粹,有助于掌握函数式编程的思维方式。于是开始读 Learn You a Haskell for Great Good,这真是本入门好书,从头开始一点点的理解接受函数式编程的思路。学 Haskell 的感觉非常有趣

不过那本书只是讲语言特性和思想,没有讲 Haskell 的运行环境和使用。上网收集了一些资料,记录下来。

Haskell (缺省)是编译成 native code,并非运行在托管环境下,因此开发出来的程序就像 C 的一样直接可执行的 binary。Haskell 程序需要依赖于 Runtime System (RTS),RTS 提供了内存管理,GC,轻量线程,并发等等功能的支持。包括 RTS 和其他的依赖到的 library,缺省都是静态链接到可执行程序中的,因此编译出来的程序体积会比较大。但现在 GHC 也已经支持动态链接了,如果使用动态链接,则要求运行环境中需要已经安装了 GHC(有 RTS)。在这方面,Haskell 跟 Go 差不多,都是直接得到 native 可执行程序,分发和部署会简单一些。

Haskell 的编译器叫做 Glasgow Haskell Compiler (GHC),它包括了 compiler,boot library 和 runtime system (RTS)。编译器支持多种 backend,除了可以生成 native code (机器码),也可以产生 C 语言源代码(供跨平台移植),或者 LLVM code,(供后面接 LLVM toolchain 使用)。

做应用开发不太可能什么都从头做起,必然要依赖第三方的函数库。Haskell 世界里的包管理和 build 系统叫 Cabal。另外有个工具 Cabal-Install 负责下载 Haskell package 源代码、编译、安装和注册到 GHC 的整个过程。共享的包存放在 Hackage 这个在线仓库中。

Reference: The Architecture of Open Source Applications - GHC