编译器testing用例或如何testing编译器

编译器像所有的软件一样,也容易出现错误,逻辑错误。

如何validation编译器生成的输出。 通常,我的问题是(是)

  • 如何validation生成的机器码是否正确?

  • 如何确保生成的机器码符合语言规范。

  • 仅仅select一个开源项目(在C语言中,如果一个人正在用C编写一个编译器)只是通过“编译器”编译它是否有意义。 在这种情况下,如何判断编译器是否按预期运行。

  • 是否有语言标准委员会提供的正式testing用例(文献)是“符合语言的”编译器必须满足的?

  • 什么是肯定的“放弃”,编译器编译的程序中的问题是编译器错误,而不是程序错误。

    – 主stream编译器混淆并编译错误的例子?

链接到任何文学将不胜感激。

有几个编译器testing套件在那里。 对于C编译器,我们使用Plum Halltesting套件取得了一些运气。 它由一组专门为了testing语言标准而编写的大量C代码组成。 它validation编译器可以处理语言语法和语义。

良好的真实语言testing套件的创build和维护成本很高。 有一个原因,就是ANSI C的行业标准Plum Halltesting套件是非常昂贵的。

乔治·纽库拉(George Necula)的翻译validation是一个很好的主意,但是实施起来也相当昂贵

一件简单便宜的事情就是:维护一套回归testing,并且每次在编译器中修复一个bug时都要在回归套件中添加一个合适的testing 。 有了编译器,难以置信的是,不断重复引入相同的错误是多么容易。 对你的回归套件规定的附加条件可以防止这种情况发生,而且它们的成本也不高。

一般的做法是创build一大批小程序,每个小程序演示编译器的一个方面。 这些将包括编译的程序和不应该的程序。 一般来说,后端的ASM不会被检查,而是运行程序并检查输出。 至于如何确保testing用例中没有错误:使它们变小,如每行5-10行。

这些testing套件在数百到数千个testing中可能非常大(例如: 用于D编程语言的过时testing套件 ),并且通常包括针对所报告的每个错误的一个或多个testing案例。

为了编译一个大的开源项目的想法:

你可以参加一个自己有testing套件的项目。 然后你编译项目和它的testing套件,看看testing是否通过。 要validation这些结果,可以使用其他编译器编译项目和testing套件,然后再次运行testing。

有一个早期的C相关的问题 ,但是它归结为一个精心编写的编译器testing套件。

至于编译器在编译错误的时候,我在职业生涯中经常遇到这种情况,谢谢。 随着时间的推移,这种情况越来越less,但是我发现本周针对CLI的MS C ++编译器中存在一个错误 。

埃菲尔编译器是开源的,并有一个广泛的testing用例和内部devise合同库。

http://dev.eiffel.com

GCC有一个相当大的testing套件( https://gcc.gnu.org/onlinedocs/gccint/Testsuites.html#Testsuites )。 它在SCM上可用: https : //github.com/gcc-mirror/gcc/tree/master/gcc/testsuite