met*_*man 2 compiler-construction register-allocation cpu-registers vm-implementation
假设你有一个只有 4 个寄存器 A、B、C 和 D 的虚拟机。编译器如何用有限的空间存储如此多的变量?
是否有多种方法可以做到这一点,或者是否有一种可靠的方法可以实现这一点?这个奇特的科学术语是什么?它被认为是一个复杂的问题吗?
我建议你阅读《Programming Language Pragmatics》或《Dragon Books》 ,特别是有关寄存器分配的章节。
简而言之,处理这种情况的方法有很多。通常,编译器会构建一个中间表示,它可以是具有无限数量寄存器的抽象机或SSA形式。当为特定目标硬件/操作系统生成代码时,这些抽象寄存器将根据抽象寄存器(即原始变量)的使用频率或寿命等标准分配给实际寄存器或堆栈位置。
根据所选的中间表示,有不同的方法(例如参见此处或此处)。如果您正在努力寻求最佳解决方案(即在实际寄存器中尽可能长时间地保留尽可能多的变量而不将它们溢出到堆栈上),那么问题可能会很困难,但是有更简单的方法,例如当时间为“线性扫描寄存器分配”时例如在即时编译中至关重要。
如果您想深入研究代码,也许可以看看 LLVM 基础设施及其寄存器分配和本演示文稿。