怎么会去测试的口译员或以一个编译器吗?
-
22-08-2019 - |
题
我一直在尝试建立一个翻译>,[.>,]通过移动指针,并同时相当简单的做并得到建立和运行,第一部分的我想要能够运行测试。我似乎无法理解如何测试一个可能必须编写以测试所有可能的组合的指令,以确保执行是适当的。
显然,与>,[.>,]通过移动指针,该指令设置很小,但我不能不认为,作为多指令都加入,你的测试码会呈指数增长。比典型的测试。
现在,我作为新手你可以得到在编写汇编者和翻译,所以我假设很有可能的方式关闭基地。
基本上,你在哪里,甚至开始测试这样的事情?
解决方案
测试一个编译是一个小小的不同的测试某些其他种类的应用程序,因为这是确定的用于编译程序产生不同的会代码版本的程序,只要他们的所做正确的事情。但是,如果你只是测试的口译员,这是很多相同的任何其他基于文本的应用程序。这里是一个Unix为中心的观点:
- 你会想建立一个 回归测试套.每个试验应该有
- 源代码,你会解释,说
test001.bf
- 标准输入的程序,你将解释,说
test001.0
- 什么你期待的解释,产生标准输出,说
test001.1
- 什么你期待的解释,产生标准的错误,说
test001.2
(你的关心标准的错误,因为你想要测试你的翻译的错误信息)
- 源代码,你会解释,说
你会需要一个"运行测试"的剧本,不喜欢的东西下
function fail { echo "Unexpected differences on $1:" diff $2 $3 exit 1 } for testname do tmp1=$(tempfile) tmp2=$(tempfile) brainfuck $testname.bf < $testname.0 > $tmp1 2> $tmp2 [ cmp -s $testname.1 $tmp1 ] || fail "stdout" $testname.1 $tmp1 [ cmp -s $testname.2 $tmp2 ] || fail "stderr" $testname.2 $tmp2 done
你会发现它有助于有一个"创建测试"的剧本,不喜欢的东西
brainfuck $testname.bf < $testname.0 > $testname.1 2> $testname.2
你跑这只有当你完全相信,解释工作,这种情况。
你保持你的测试下源的控制。
它的方便来美化你的测试脚本,所以你可以离开了文件,预计将空。
任何时间任何改变、重新运行的所有测试。你可能也重新运行它们所有的夜间通过一个定时的工作。
最后,要添加足够的测试得到很好的 测试的复盖范围 你的编译器的源码。复盖质量的工具的广泛变化,但是 GNU Gcov 足够复盖率的工具。
好运与你解释!如果你想看到一个精心制作的但不是很好的记录测试的基础设施,去看看 test2
目录 快C编译器.
其他提示
我不认为有什么“特别”有关测试编译器;在某种意义上,它几乎比测试一些程序更容易,因为编译器有这样一个基本的高度概括 - 你在源一方面,它给你回(可能)编译代码和(可能)一组诊断消息
像任何复杂的软件实体,会有很多的代码路径,但因为它是所有非常注重数据(在文本的文本和字节了)它的直接的笔者测试。
我已经写了一篇关于编译器测试,原来的结论的(稍稍缓和了对出版物)是: 它在道德上是错误的重新发明轮子。 除非你已经知道所有关于先前存在的解决方案,并有一个很好的理由忽视了他们,你应该看看的工具已经存在。最简单的地方开始 Gnu C酷刑, 但铭记,这是基于似曾相识Gnu,其中有,我们应该说,问题。(我花了六个尝试甚至得到维护者允许 关键的错误报告 关于你好世界的例子到的邮件列表。)
我会毫不谦虚地建议你看看下面作为一个起点,为工具进行调查:
软件:实践和经验 2007年四月.(付费软件,不向一般公众提供免费预印本在 http://pobox.com/~闪/Practical_Testing_of_C99.pdf.
http://en.wikipedia.org/wiki/Compiler_correctness#Testing (主要是我写的。)
编译器测试的参考书目 (请让我知道的任何更新我已经错过了。)
在brainfuck的情况下,我想测试它应该brainfuck脚本来完成。我将测试以下,虽然:
1:被初始化为0的所有细胞
2:当你递减时,它目前指向第一个单元格中的数据指针会发生什么?是否包?它是否指向无效的存储器?
3:当你增加时,它的指向最后一个单元格中的数据指针会发生什么?是否包?它是否指向无效存储器
4:正确是否输出功能
5:是否正确输入功能
6:是否[]东西正常工作
7:当您递增字节超过255倍,会发生什么,它换到0正确,或者是它错误地当作整数或其它值
。更多的测试也是可能的,但是这可能是在那里我会开始。我几年前写了一高炉编译器,并有一些额外的测试。尤其我测试的[]东西重,由已经问题那里(在x86使用JXX我有问题时,块产生多于128个字节左右的具有大量的块内的代码,由于我的代码发生器的早期版本码,从而导致无效的x86 ASM)。
您可以与一些已经编写的应用程序进行测试。
秘密的是:
- 单独的关切问题
- 遵守法律的Demeter
- 注入你的依赖
好吧,软件,难以测试是一个迹象,表明开发写的像这是1985年。抱歉这么说,但利用三项原则,我在这里提出的,即使行编号为基础,将可测试单元(这是可能的注入的依赖关系为基础,因为你可以做"转变".