传世私服论坛专区http://www.chdsc.org

当前位置:主页 > 中变传世私服发布网 >

意见 - 它必须是编译器

发布时间:2019-07-15 12:43
[经常被错误地归咎于代问题,有时编译器确实是罪魁祸首 - Q-Games的Kalin Houston在这个#altdevblogaday重印的意见文章中分享了一些关于注意事项的建议。]

通常,编译器错误被声明为代中看似不可能的结果的原因。通常在几分钟后通过实现真正的问题,然后修复它。这可能更多地发生在新手程序员身上,也许不会发现内存问题和(至少对C ++而言)可能无意中发生的微妙语言欺骗。

有时候,有时候,它确实是编译器。如果您在某些环境中工作,您可能会幸运地处理各种破坏和未经测试的编译器,虚拟机和/或语言。这种环境中的问题需要采用不同的方法进行常规调试。

在一个你不能信任编译器的环境中,正常的逻辑调试思想并没有完全应用同样的方式。你需要考虑给定代片段的可信度来做你认为的那样。

如果你有一个中等大的代库运行没有问题,那么你可以假设最多?核心?作正在生成正确的代,但仅仅因为昨天的某些工作你就不能认为其他地方的改变不会改变月球的对齐/大小/相位并打破它。

那么我们应该警惕什么样的事情?

未使用的变量虽然逻辑上这些没有影响,但编译器可能会在代的一个部分中删除它们,并将其留在偏移计算中,从而导致变量访问不正确。如果你真的需要保留它们,尝试为它们分配虚拟值以保持它们?使用?在着色器代中要特别小心,尤其是将值绑定到输入/输出语义。

没有副作用的代这包括自我分配或之后被覆盖的计算。再次,逻辑上这应该是无关紧要的,通常的逻辑不适用于破碎编译器的土地。改变周围的事物,观察效果。寄存器分配逻辑中可能存在错误,或者在逻辑中决定重新计算值或将其保留在堆栈中。

优化级别编译器将在不同的优化级别上以非常不同的方式(或简单地断开)运行。更改优化级别并再次检查您的问题。如果它只是消失了,这可能是编译器问题的一个很好的指标(但并非总是如此!)。虽然典型的假设是非优化构建工作,但情况可能并非总是如此。用-O1或-O2编译再试一次!

不频繁的作频繁的作或类型转换应该引起怀疑。像(int%float),复杂表达式中过多的类型转换等等。

这些问题可以跨越本机代,着色器代,虚拟机和脚本语言。每个环境都有一组不同的可能问题区域。考虑每个特定编译器的稳定以及您希望它运行的正确。打印一切,检查一切,并假设很少。通常应用纯程序逻辑不适用?更多地关注经验测试并评估什么/实际发生/何时发生代更改而不是什么/应该/发生。请注意,日志记录可能会轻易改变附近生成的代。

这些是Ben Carter在阅读本文初稿后提出的一些很好的建议。我真的无法改进这些,所以我会在这里逐字发布。
检查汇编程序?只要你不进入这个领域?这是一个硬件错误吗?那么调查编译器输出可以告诉你很多关于它的想法。确保变量是你认为的那样?很多人气?编译器错误围绕寄存器分配或内存布局出错,最终结果是一个或两个变量的结构成员?共享?寄存器并不常见。请注意控制流程?类似地,编译器提升控制流量并不罕见,特别是?优化?进出循环或条件的东西,使它们不再正常工作。在$ PLATFORM我们曾经有一个错误,这是由编译器采取的吗?if(blah)a = * blah;?并优化* blah dereference在if()之前发生?链接器也只是人类?大量的地址计算等都发生在链接时,如果出现问题,那么你可能会陷入一个受伤的世界。全局变量的多个副本,全局变量共享相同的内存,对齐错误,或者简单? [经常被错误地归咎于代问题,有时编译器确实是罪魁祸首 - Q-Games的Kalin Houston在这个#altdevblogaday重印的意见文章中分享了一些关于注意事项的建议。]

通常,编译器错误被声明为代中看似不可能的结果的原因。通常在几分钟后通过实现真正的问题,然后修复它。这可能更多地发生在新手程序员身上,也许不会发现内存问题和(至少对C ++而言)可能无意中发生的微妙语言欺骗。

有时候,有时候,它确实是编译器。如果您在某些环境中工作,您可能会幸运地处理各种破坏和未经测试的编译器,虚拟机和/或语言。这种环境中的问题需要采用不同的方法进行常规调试。

在一个你不能信任编译器的环境中,正常的逻辑调试思想并没有完全应用同样的方式。你需要考虑给定代片段的可信度来做你认为的那样。

如果你有一个中等大的代库运行没有问题,那么你可以假设最多?核心?作正在生成正确的代,但仅仅因为昨天的某些工作你就不能认为其他地方的改变不会改变月球的对齐/大小/相位并打破它。

那么我们应该警惕什么样的事情?

未使用的变量虽然逻辑上这些没有影响,但编译器可能会在代的一个部分中删除它们,并将其留在偏移计算中,从而导致变量访问不正确。如果你真的需要保留它们,尝试为它们分配虚拟值以保持它们?使用?在着色器代中要特别小心,尤其是将值绑定到输入/输出语义。

没有副作用的代这包括自我分配或之后被覆盖的计算。再次,逻辑上这应该是无关紧要的,通常的逻辑不适用于破碎编译器的土地。改变周围的事物,观察效果。寄存器分配逻辑中可能存在错误,或者在逻辑中决定重新计算值或将其保留在堆栈中。

优化级别编译器将在不同的优化级别上以非常不同的方式(或简单地断开)运行。更改优化级别并再次检查您的问题。如果它只是消失了,这可能是编译器问题的一个很好的指标(但并非总是如此!)。虽然典型的假设是非优化构建工作,但情况可能并非总是如此。用-O1或-O2编译再试一次!

不频繁的作频繁的作或类型转换应该引起怀疑。像(int%float),复杂表达式中过多的类型转换等等。

这些问题可以跨越本机代,着色器代,虚拟机和脚本语言。每个环境都有一组不同的可能问题区域。考虑每个特定编译器的稳定以及您希望它运行的正确。打印一切,检查一切,并假设很少。通常应用纯程序逻辑不适用?更多地关注经验测试并评估什么/实际发生/何时发生代更改而不是什么/应该/发生。请注意,日志记录可能会轻易改变附近生成的代。

这些是Ben Carter在阅读本文初稿后提出的一些很好的建议。我真的无法改进这些,所以我会在这里逐字发布。
检查汇编程序?只要你不进入这个领域?这是一个硬件错误吗?那么调查编译器输出可以告诉你很多关于它的想法。确保变量是你认为的那样?很多人气?编译器错误围绕寄存器分配或内存布局出错,最终结果是一个或两个变量的结构成员?共享?寄存器并不常见。请注意控制流程?类似地,编译器提升控制流量并不罕见,特别是?优化?进出循环或条件的东西,使它们不再正常工作。在$ PLATFORM我们曾经有一个错误,这是由编译器采取的吗?if(blah)a = * blah;?并优化* blah dereference在if()之前发生?链接器也只是人类?大量的地址计算等都发生在链接时,如果出现问题,那么你可能会陷入一个受伤的世界。全局变量的多个副本,全局变量共享相同的内存,对齐错误,或者简单?

上一篇:中国iPad争议即将来临美国
下一篇:NBA Courtside 2002

意见 - 它必须是编译器相关推荐