Lyk*_*kos 10 compiler-construction testing integration-testing haskell
我打算在Haskell中编写一个小玩具编译器,以获得一种非常简单的语言,以加强我的Haskell技能,并设计一种新语言.我仍然在考虑一些一般性的决定,其中一个最大的开放点是如何进行集成测试.我有以下要求:
我还有以下可选要求:
我试图找到满足我需求的东西,但到目前为止我还没有成功.我考虑的替代方案如下:
我不确定我应该选择哪个选项,我仍然希望我错过了一个很好的解决方案.您是否知道如何创建满足我所有要求的集成测试?
\n\n
我在想unsafePerformIO这里应该非常安全,考虑到程序不应该与测试环境/逻辑所依赖的任何东西交互,或者换句话说,在测试环境中,编译和执行应该被视为纯函数。受控、隔离的环境。我认为在这种情况下测试你的编译器确实很有用。即使对于黑盒测试,QuickCheck 也应该成为一种选择。但一些更清醒的头脑可能会证明我是错的。
所以假设你的编译器是这样的:
\n\ntype Source = String\n\ncompile :: Source -> Program\nRun Code Online (Sandbox Code Playgroud)\n\n你的程序执行是
\n\ndata Report = Report Output TimeTaken OtherStats ...\n\nexecute :: Program -> IO Report\nRun Code Online (Sandbox Code Playgroud)\n\n你可以很安全地使用unsafePerformIO其转换为
execute\' :: Program -> Report -- or perhaps \'executeUnsafe\'\nexecute\' = unsafePerformIO . execute\nRun Code Online (Sandbox Code Playgroud)\n\n进而
\n\ncompileAndExec :: Source -> Report\ncompileAndExec = compile . execute\'\nRun Code Online (Sandbox Code Playgroud)\n\n并将其与 QuickCheck 一起使用。
\n\n无论execute调用子进程、获取实际的二进制文件、执行该二进制文件等、\xe2\x80\x94 或解释内存中的二进制文件(或字节码),都取决于您。
但我建议将字节代码和二进制生成分开:这样您就可以将编译器与链接器/诸如此类的东西分开测试,这更容易,并且还可以在此过程中获得解释器。
\n