编程语言之PureScript
2024-01-05 09:38:02 阿炯

PureScript是一种强类型、纯函数式、最终编译为JavaScript的编程语言。其可以开发网络应用程序、服务端应用程序,也可以借助Electron开发桌面应用程序。它主要是由 Haskell 编写,其语法大多与Haskell相当。此外,它还引入了行多态性和可扩展记录。不过与Haskell相反的是,PureScript坚持严格求值策略。采用MIT协议授权。


PureScript是个小巧而强大的静态类型语言,可以编译成 JavaScript。最初由费尔·弗里曼(Phil Freeman)在2013年设计,他曾屡次尝试在保留语义的情况下,将Haskell编译成JavaScript(如使用Fay、Haste或GHCJS),但结果并不满意,于是他开始着手在PureScript上工作;从此以后它由社区接手并在GitHub继续开发。社区开发的额外核心工具包括专门的构建工具Pulp、文档目录Pursuit和包管理器Spago。

PureScript特征主要为严格求值、持久性数据结构和类型推论。其类型系统同类似的函数式语言如Haskell共享了很特征:代数数据类型及模式匹配、高种类类型、类型类及函数依赖和高秩多态。PureScript的类型系统增加了对行多态和可扩展记录的支持。但PureScript缺乏对Haskell的某些更高级特征如GADT和类型家族的支持。

PureScript编译器尝试产生尽可能可读的JavaScript代码。通过一个简单的FFI接口,它还允许重用现存的JavaScript代码。它支持增量编译,而且编译器发行包括了支持为迭代开发建造源代码编辑器插件。存在编辑器插件针对很多流行的编辑器,包括Vim、Emacs、Sublime Text、Atom和Visual Studio Code。它通过它的“类型孔洞”特征支持“类型驱动开发”,在其中可以构造具有缺失子表达式的程序。编译器随后将尝试推论出缺失子表达式的类型,并将这些类型报告给用户。这个特征已经启发了GHC的类似工作。


示例代码:
module Main where
import Debug.Trace
main = trace "Hello, World!"

编译成 JavaScript 代码:
var PS = PS || {};
PS.Main = (function () {
    "use strict";
    var Debug_Trace = PS.Debug_Trace;
    var main = Debug_Trace.trace("Hello, World!");
    return {
        main: main
    };
})();


最新版本:0.15
v0.15.14 于2024年1月上旬发布了,相关的更新如下:
修复超大文件的编译内存回归
编译超大文件(>12K 行)时,CSE pass 可能会导致内存膨胀并导致编译时间增加。
此修复使用了 strict Map 而非 lazy Map 来避免在优化过程中构建不必要的 thunk。
修复编译多个模块时的两个 space leaks 问题
第一个会同时交错编译太多模块,这会增加内存使用量,特别是对于使用 +RTS -N1 -RTS 的单线程编译。现在,并发模块的数量受限于 GHC 运行时系统可用的线程数量。
第二个将保留编译有警告的模块的内存,直到构建结束,打印警告并释放内存。现在已通过额外的 NFData 实例修复了此问题。

更多信息请参考发行说明

官方主页:https://www.purescript.org/