问题摘要:
在CPython中,我发现a line试图通过重新分配变量来避免寄存器溢出。该行的更改可以追溯到2015年创建的the commit。我对该行的原理感到好奇。
当用户运行Python时,有许多数据和代码正在加载到内存或寄存器中。如果更改了CPython代码的其他部分,为什么那行代码可以防止寄存器溢出呢? CPython不断建立在各种CPU架构和不同的操作系统上。为什么提交的注释中只提到了编译器的类型?
答案 0 :(得分:0)
当代码生成器用尽了用于保存中间值和常用值的寄存器时,它会通过写入内存(通常是从堆栈分配的区域)来溢出寄存器。通常,这是一种低成本操作,并且高度依赖于CPU中的寄存器数量,提供给编译器的选项以及编译器本身的版本。
您应该努力编写清晰的代码,而不是对代码生成器进行反向工程。通常,代码生成器会通过生成非常好的代码来为此奖励您。当您遇到性能问题时,探查器应指导您找到需要重新访问的代码。通常在结构上或算法上进行改进。改进所生成代码的代码技巧通常围绕向编译器揭示信息。例如它认为动态的值实际上是静态的,或者安排数据结构以更好地利用缓存资源。
如果您必须对代码生成器进行反向工程,那么您还不妨用机器语言重写该序列-至少有一本关于机器语言的手册,其中编译器黑客始终都是部落知识。您如何知道要用机器语言重写的位,请再次查看分析器。