Retrie:哈斯克尔重构变得容易

2020-07-10 00:46:35

我们已经开源了Retrie,这是一个针对Haskell的代码重构工具,可以使编码解调更快、更容易、更安全。使用Retrie,开发人员可以高效地重写大型代码库(超过100万行),用Haskell语法(而不是正则表达式)将重写表示为公式,并避免大类编码解调错误。

Retrie的特性包括重写表达式、类型和模式的能力;编写重写脚本和添加辅助条件的能力;以及用于编写更高级重写脚本的库。Retrie还尊重和维护本地作用域,保留空白,并且不重写代码注释。

重构改进了代码库的整体设计,但它可能是一项细致、耗时的任务。为了避免错误,重构通常以很小的增量手工完成。随着代码库大小的增长,此方法变得不可行,而工具支持至关重要。

在各种重构工具中,有两个极端。在一端,有查找和替换字符串操作工具,如sed。这些工具速度很快,但是很难表达复杂的重写。另一端是用于解析和操作抽象语法树(AST)的工具。AST操作工具非常强大,但需要丰富的领域知识,而且与字符串替换相比通常速度较慢。

雷特里占据了一个舒适的中间地带。用目标语言(在本例中为Haskell)的语法将重写表示为等式比定义复杂的正则表达式或AST遍历更容易。由于公式比正则表达式更强大,并且可以编写脚本进行重写,因此Retrie比单独替换字符串更强大。Retrie还利用几种技术在解析和高效查找匹配项之前缩小搜索空间,这使得它比典型的AST操作工具更快。

作为使用Retrie的示例,假设您有一些代码,包括像foo这样的函数:

模块MyModule,其中foo::[int]->;[Int]foo ints=映射栏(Map Baz Int)。

您意识到两次遍历列表int比只遍历一次要慢。您可以将转换表示为等式,并将其应用于当前目录中的任何位置,而不是手动修复代码:

检索--特别适用于所有的f g X。map f(Map G Xs)=map(f.。g)xs";

模块MyModule,其中foo::[int]->;[Int]-foo ints=map bar(Map Baz Int)+foo ints=map(bar.。BAZ)INTS。

哈斯克尔为我们的反滥用规则引擎Sigma提供动力。为了管理不断增长的规则规模和复杂性,我们在2015年将Sigma迁移到Haskell。Sigma在垃圾邮件、网络钓鱼攻击和恶意软件影响Facebook用户之前阻止它们。Retrie使我们能够快速、安全地将Sigma规则迁移到新的API和库。我们将它发布给更广泛的社区,这样其他开发人员就可以利用它的速度、易用性和强大功能来完成他们自己的编码任务。