B S*_*ven 6 compiler-construction algorithm assembly
在SO上阅读这个引人入胜的(和最高投票的问题),为什么处理排序数组比处理未排序数组更快?让我想知道编译器代码的正确性.
例如,答案指出:
英特尔编译器11做了一些奇迹.它交换了两个循环 ......
编译器程序员如何知道何时可以交换循环?
而且,一般来说,他们是否使用数学证明来证明结论?
编译器程序员如何知道他们的编译器会生成正确的代码?他们如何测试他们的结论?他们是否必须编写运行编译器的测试套件,并检查生成的代码是否正确?
编译器程序员如何知道何时可以互换循环?
编译器对代码运行一系列检查,以确定交换循环是否安全。例如,如果代码没有完全内联,它可能无法交换循环。如果代码修改易失性变量,它不会交换循环。如果代码存储在先前循环迭代中计算的值,则编译器将不会交换循环。如果他们可以确定它是安全的,因为没有触发这些条件,则编译可以互换循环。
一般来说,他们是否使用数学证明来证明结论?
不。他们只是制定了一个优化方案和一组保守的测试来确保优化是安全的。随着时间的推移,他们开发了更多的优化和更复杂的算法来检测优化何时是安全的,即使在不太明显的情况下也是如此。
编译器程序员如何知道他们的编译器将生成正确的代码?
他们尽力而为。有时他们也会犯错误。人们提交错误报告,然后他们修复它。
他们如何检验他们的结论?他们是否必须编写一个运行编译器并检查生成的代码是否正确的测试套件?
他们绝对使用测试套件。当 GCC 中检测到错误时,测试套件中会专门添加一个测试,以确保该错误得到修复并且不会再次引入。