[译] PureScript: 一门编译到 JavaScript 的 Haskell 方言


原文: http://www.infoq.com/news/2014/09/purescript-haskell-javascript


PureScript 是一门编译到 JavaScript 的强类型静态类型语言.
它的功能受到 Haskell 的激发, 并且使用 Haskell 编写, 其目标是:
“编译到 JavaScript 同时保持清洁跟可读” 而且根据 PureScript 作者 Phil Freeman 所说,
PureScript 具备跟其他编译到 JavaScript 的语言相互操作的能力.

PureScript 继承了 Haskell 当中一些突出的功能, 其中有:

  • 类型推断: 允许在任何可能的地方减少类型声明的书写
  • Higher Kinded Polymorphism: 一种类型构造器之上的抽象机制,
    是 Monads 跟 DSLs 的基础
  • 模式匹配: 这种技术让开发者可以通过将函数实现拆分成多个 case
    来写简洁而复杂的函数
  • 类型类: 数据类型智商的抽象机制, 允许开发者在使用时不去思考本身数据结构

根据 Phil 所说, 互操作性是 PureScript 的另一个优势.
PureScript 提供了引用已有的 JavaScript 代码机制,
通过提供其数据和函数的类型, 然后作为正常的 PureScript 代码使用.
这样 PureScript 就有可能在应用的局部使用, 项目本身可以是 JavaScript 活其方言.

InfoQ 跟 Phil Freeman 做了访谈来深入了解这门语言:

可以解释一下为什么你要创造 PureScript 吗? 主要的动机和目标是什么?

我是一年前开始 PureScript 项目的, 那时我在进行一个中等的 JavaScript 应用,
那个项目后来用 TypeScript 重写了. 用 TypeScript 很多时候生成力是很高的
只是应用中一小部分我觉得用强类型系统会带来更多的好处.
那时已经有很多编程语言提供了很有表达能力的类型系统,
可是, 没有一个同时能结合我想要的其他功能一起使用.
更准确地说, 我想要一门 Haskell 语法的语言, 能生成干净可读的 JavaScript,
只是不需要 Haskell 那样一个运行环境.
我知到如果我开始自己写编译器的话后面我就是要在 Haskell 设计这门语言,
但是我决定了, 只想要 Haskell 当中简单的部分来实现 PureScript,
因为我想要吸引更多的编译器开发者.
考虑这一点, 这个项目已经成功了, 因为编译器现在有了很棒的开发者社区.

PureScript 的主要功能是什么?

一套简单的 FFI, 表达能力强的类型系统, 有规律的生成代码.
简单说就是 PureScript 提供了”更好的环境的写有规则的 JavaScript”

能不能总结下 PureScript 带来的比原生 JavaScript 好的地方?

一个巨大的好处是因此能够自信地重构巨大的代码库而不破坏已有的功能.
当你决定使用纯函数式编程之后 – 纯函数, 不可变数据类型, 明确的副作用, 这些
你就可以在编译器的协助下强力地重构你的代码.
另一个好处是类型系统的表达能力, 能开发者能更多属性的断言,
这在目前单纯 JavaScript 的工具来说是难以做到的.
比如说构造 DSL 让它的数据类型在结构上就保证正确,
比如: 二叉树被保证是平衡的, HTML 节点保证有正确的属性, 等等
同时这可以是一套渐变的方案, 不需要依赖特定的 IDE.
最终 PureScript 这样的语言实现了强大的抽象能力, 其他语言无法达到,
包括参数化的多态(?parametric polymorphism), 高阶函数, 类型类等等工具.

PureScript 集成了 Haskell 当中一些功能, 比如类型推断, 类型类等等
这两门语言差别最大是在哪里?

简单说 PureScript 选用了 Haskell 的语法, 但在语意方面源自 JavaScript.
比如 PureScript 是非惰性求值的, 这个就不像 Haskell.
还有 PureScript 只是在单根函数的层面进行了尾递归优化,
就有必要注意 Haskell 常用风格在这里会栈溢出(比如 monadic recursion).
类型系统中也有一些重要的去写.
PureScript 受 Haskell 影响有一些不错的功能(比如多参数类型类, rank-N types),
但也有很多 Haskell 功能我们是没有的(type families, polykinds, datakinds 等等).
也有些新奇功能是 PureScript 有但 Haskell 没的(extensible records 和 extensible effects)

你怎么对比 PureScript 和其他 Haskell 编译 JavaScript 方言, 比如 UHC, ghcjs?

很多 Haskell 类的 Altjs 语言, 比如 Fay, Haste, GHCJS,
它们希望的是编译 Haskell 的子集到 JavaScript, 保留 Haskell 的语义.
这个想法很棒, 因为有大量的 Haskell 代码那样就能在 JavaScript 代码中重用.
PureScript 不是 Haskell 的子集, 而是采用了 JavaScript 的语义.
不过好处是 PureScript 的 FFI 很好用, 我们很容易集成已有的 JavaScript 模块.
比如说那些 npm 当中已经提供了的模块. 这带来了不一样的开发模式.
PureScript 内在当中更接近 Roy 或者 JMacro 这样的语言.
实际上 Roy 很大地影响了 PureScript 的设计.
Elm 是另一个有趣的 Haskell 方言.
Elm 主要是实现了纯函数编程, 以及 FRP, 用来实现交互式的 Web 应用.

能简短分享一下 PureScript 未来的想法吗? roadmap 上有什么?

我们目前专注于发布下一版的编译器管工具,
希望能包含二进制发布文件, 针对三个主要的平台.
我们也花了不少时间开发一个自举的 PureScript 编译器.
如果能用 npm install purescript 安装编译器就很赞了.
下一个版本之后, 我们就能考虑一下很多有意思的功能, 比如:
type wildcards, 模版元编程, idiom brackets 还有 sourceMaps.
还有一些兴趣在于不同的编译器后端, 加上最近的 Lua 后端,
也有一些讨论是关于可能会有的 Python 后端的.
当然, 我们也不缺各种有趣的类库跟工具去写. 开发者社区很热情,
任何有兴趣贡献的人都可以看我们 Freenode 上的 #purescript 频道.

PureScript 是个开源项目, 预编译的二进制文件也支持 Linux.
两份适合开始学习这门语言的资源是Phil Freeman 写的Leanpub 的电子书,
还有网页版的 Try PureScript, 不用安装就可以尝试这门语言.


发表评论

电子邮件地址不会被公开。

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>