Haskell 中的编译器集成测试

Compiler Integration Tests in Haskell

我打算用 Haskell 为一种非常简单的语言编写一个小玩具编译器,以加强我的 Haskell 技能并享受设计新语言的乐趣。我仍在考虑一些一般性的决定,最大的开放点之一是我将如何进行集成测试。我有以下要求:

我还有以下可选要求:

我试图找到满足我需求的东西,但到目前为止我没有成功。我考虑的备选方案如下:

我还不确定我应该选择哪个选项,我仍然希望我错过了一个好的解决方案。您是否知道如何创建满足我所有要求的集成测试?

我认为 unsafePerformIO 在这里应该很安全,因为程序永远不会与测试 environment/logic 所依赖的任何东西交互,或者换句话说,编译和执行应该是可见的作为在受控、隔离环境中进行测试的纯函数。我认为在这种情况下测试您的编译器确实很有用。 QuickCheck 应该成为黑盒测试的一个选项。但一些更清晰的头脑可能会证明我错了。

所以假设你的编译器是这样的:

type Source = String

compile :: Source -> Program

你的程序执行是

data Report = Report Output TimeTaken OtherStats ...

execute :: Program -> IO Report

您可以非常安全地使用 unsafePerformIO 将其转换为

execute' :: Program -> Report -- or perhaps 'executeUnsafe'
execute' = unsafePerformIO . execute

然后

compileAndExec :: Source -> Report
compileAndExec = compile . execute'

并将其与 QuickCheck 一起使用。


是否 execute 调用子进程、获取实际的二进制文件、执行它等等,或者在内存中解释二进制文件(或字节码),由您决定。

但我建议将字节代码和二进制生成分开:这样您就可以将编译器与 linker/whatnot 分开测试,这更容易,并且在此过程中还可以得到一个解释器。