对编译器输出进行单元测试

Squ*_*dly 6 compiler-construction haskell unit-testing

作为大学项目的一部分,我们必须为玩具语言编写一个编译器.为了对此进行一些测试,我正在考虑如何最好地编写像单元测试这样的东西.由于编译器是用haskell编写的,因此Hunit和quickcheck都可用,但可能不太合适.

我们怎么做任何非手动测试?我唯一的想法是有效编译到haskell,看看输出是什么,并使用一些shell脚本将其与编译程序的输出进行比较 - 这是相当多的工作,并不是太优雅无论是.

单元测试是为了帮助我们,而不是评估工作本身的一部分.

Ant*_*ony 4

这实际上取决于您正在编写编译器的哪些部分。如果您可以保持不同的阶段以帮助隔离问题,那就太好了,但是,在任何阶段,甚至在集成级别,由成对的源代码和手工编译的代码组成的单元测试都是完全合理的。您可以从最简单的合法程序开始,并确保您的编译器输出与手动编译相同的内容。

随着复杂性的增加,手工编译变得笨拙,编译器保留某种其所做工作的日志是有帮助的。然后,您可以查阅此日志以确定是否针对给定源程序触发了特定转换或优化。

根据您的语言,您可能会考虑从程序片段集合中生成随机程序(以 QuickCheck 的方式)。该生成器可以测试编译器的稳定性以及处理潜在不可预见输入的能力。