![]() |
1
4
“没有调用堆栈的体系结构”通常在某种程度上“模拟”调用堆栈——例如,在IBM360时代,我们使用 S-Type Linkage Convention 因此,“尾部调用”仍然很重要:调用函数是否需要保留在调用点之后恢复执行所需的信息(一旦被调用函数完成),或者它是否知道在调用点之后将不会执行,因此只需重用 改为“恢复执行的信息”? 因此,例如,尾部调用优化可能意味着不在用于此目的的任何链表上追加恢复执行所需的延续。。。我喜欢将其视为一种“调用堆栈模拟”(在某种程度上,虽然这显然是一种更灵活的安排——不想让连续通过的粉丝们对我的答案一头雾水;-)。 |
![]() |
2
2
如果这个问题不可能引起我以外的人的兴趣,我有一个 expanded answer 另一个问题也回答了这个问题。这是一个简单的、非严格的版本。 当计算系统执行子计算时(即,由于第一次计算取决于第二次计算的结果,因此在执行另一次计算时,计算开始并必须暂停),执行点之间的依赖关系自然产生。在基于调用堆栈的体系结构中,这种关系在拓扑上是 path graph 将尾调用转换为异步事件处理更为复杂,因此应考虑更一般的版本。如果A订阅了通道1上的事件,B订阅了通道2上的同一事件,B的处理程序只在通道1上触发事件(它跨通道转换事件),那么A可以订阅通道2上的事件,而不是订阅B。这是更一般的,因为尾部调用的等效要求
SICP section 1.2 )。使用RPN来使用数据堆栈和操作堆栈(与操作流相反;操作是尚未处理的操作),以及将符号映射到操作序列的环境。尾部调用可能对应于具有O(1)堆栈增长的进程。 |
![]() |
John Smith · 在ASM中实现递归,无需过程 8 年前 |
![]() |
Sweeper · 为什么这个调用堆栈如此奇怪? 9 年前 |
![]() |
Gerald Chu · AIX:_snw中的malloc(无符号长)? 10 年前 |
![]() |
user3374131 · NodeJS POST保持挂起状态 11 年前 |
![]() |
Jacob Krieg · 直接访问函数堆栈 11 年前 |
![]() |
Milad Khajavi · 如何创建会引发堆栈溢出异常的无限递归? 12 年前 |
![]() |
Jonas Byström · 删除Eclipse/JUnit调用堆栈截断 12 年前 |