一句话:结合函数式编程与 Esterel 式命令式并发,展示用可变状态和多线程也能写出如纯函数式般易理解的数独求解器。
传统观点认为,只要加入少量命令式代码,函数式编程的优势就会消失。本文指出,函数式编程与特殊命令式语言 Esterel 结合能产生倍增收益。二者共享关键限制:函数输出仅由输入决定;Esterel 计算状态仅由程序和上一时间步状态决定,即便程序包含并发线程、可变状态以及线程创建、挂起和中止。作者以 JavaScript 与 Esterel 的混合语言 HipHop 实现数独求解器,深入展示即使使用多线程、可变状态、抢占和线程中止,代码仍可像纯函数式风格一样易于理解;并发组合与任务取消还带来显著的程序结构化收益,支持清晰的分解与任务分离。
Conventional wisdom suggests that the benefits of functional programming no longer apply in the presence of even a small amount of imperative code, as if the addition of imperative code effectively subtracts. And yet, as we show in this paper, combining functional programming with the special imperative language Esterel provides a multiplicative improvement to the benefits of functional programming. The key to the benefit of both Esterel and functional programming stems from a restriction that both share. As in functional programming, where only the inputs to a function determine its outputs, the state of an Esterel computation is fully determined by the program’s input and the state that the computation had in the previous time step, where the notion of a time step is explicit in the language. Esterel’s guarantee holds even though Esterel programs feature concurrent threads, mutable state, and the ability to create, suspend, and even terminate threads as the computation proceeds. This similarity is the root of the benefits that programmers accrue as they informally reason about their program’s behavior. To illustrate these benefits, the bulk of this paper consists of an in-depth exploration of HipHop code (a mashup of JavaScript and Esterel) that implements a Sudoku solver, showing how it is possible to write code that is as easy to understand as if it were written in a pure functional programming style, even though it uses multiple threads, mutable state, thread preemption, and even thread abortion. Even better, concurrent composition and task canceling provide significant program structuring benefits that allow a clean decomposition and task separation in the solver.
@article{SerranoF24,
title = {The Functional, the Imperative, and the Sudoku: Getting Good, Bad, and Ugly to Get Along (Functional Pearl)},
author = {Manuel Serrano and Robert Bruce Findler},
journal = {Proceedings of the ACM on Programming Languages},
volume = {8},
number = {ICFP},
year = {2024},
doi = {10.1145/3674631}
}