从具有相同数据的相同地址调用的函数是否总是无限递归?
Is a function called from the same address with the same data always infinitely recursive?
#include <stdint.h>
typedef void (*ptr)();
void X(ptr P, ptr I)
{
P(I);
}
void Y(ptr P)
{
X(P, P);
}
int main()
{
Y(Y);
}
我正在用 C 语言做计算机科学,因为计算机科学家不这样做,所以我来这里是为了获得更多实际帮助。我需要具体地研究计算机科学(使用 C 和 x86 机器语言),因为抽象会泄露关键细节。
其机器语言的执行轨迹证明,上述函数至少从相同的机器地址以相同的输入数据依次调用两次。
是否有非无限递归的从同一机器地址以相同输入顺序调用函数两次的反例?
** 中间可以有任何中间代码
(从被调用函数到同一调用者的函数 returns 除外)。
来自上面的讨论:
调用函数不访问静态或全局数据作为终止其函数调用序列的基础已被重新解释为 (3) 的第一部分,如下所示。 (3) 的第二部分基于对此答案的评论。
如果函数Y()调用函数X()的执行轨迹显示:
(1)函数X()从Y()的同一个机器地址依次被调用两次。
(2) 与X()相同的参数。
(3) Y()中没有条件分支或变址跳转指令。
(4) 从 X() 到 Y() 没有函数调用 returns。
那么从 Y() 到 X() 的函数调用是无限递归的。
如果有人不同意,请在评论中告诉我,我会更新这个答案。
扩展原始答案以涵盖模拟:
#define ptr uintptr_t
void X(ptr P, ptr I)
{
Simulate(P, I);
}
void Y(ptr P)
{
X(P, P);
}
int main()
{
Y((ptr)Y);
}
如果函数Y()调用函数X()的执行轨迹显示:
(1)函数X()从Y()的同一个机器地址依次调用两次。
(2) 与 X().
相同的参数
(3) Y()中没有条件分支和变址跳转指令。
(4) 没有从 X() 到 Y() 的函数调用 returns。
那么Y()到X()的函数调用就是无限嵌套模拟了。
在无限嵌套模拟的情况下,规则 (4) 始终得到满足,因为没有模拟器每隔 returns 到它正在模拟的输入。
当X()模拟Y()的机器语言并在模拟Y()的每条机器指令后检查结果执行轨迹时,X()可以应用上面提供的标准停止模拟Y()在此基础上Y() 指定无限嵌套模拟。
#include <stdint.h>
typedef void (*ptr)();
void X(ptr P, ptr I)
{
P(I);
}
void Y(ptr P)
{
X(P, P);
}
int main()
{
Y(Y);
}
我正在用 C 语言做计算机科学,因为计算机科学家不这样做,所以我来这里是为了获得更多实际帮助。我需要具体地研究计算机科学(使用 C 和 x86 机器语言),因为抽象会泄露关键细节。
其机器语言的执行轨迹证明,上述函数至少从相同的机器地址以相同的输入数据依次调用两次。
是否有非无限递归的从同一机器地址以相同输入顺序调用函数两次的反例?
** 中间可以有任何中间代码
(从被调用函数到同一调用者的函数 returns 除外)。
来自上面的讨论:
调用函数不访问静态或全局数据作为终止其函数调用序列的基础已被重新解释为 (3) 的第一部分,如下所示。 (3) 的第二部分基于对此答案的评论。
如果函数Y()调用函数X()的执行轨迹显示:
(1)函数X()从Y()的同一个机器地址依次被调用两次。
(2) 与X()相同的参数。
(3) Y()中没有条件分支或变址跳转指令。
(4) 从 X() 到 Y() 没有函数调用 returns。
那么从 Y() 到 X() 的函数调用是无限递归的。
如果有人不同意,请在评论中告诉我,我会更新这个答案。
扩展原始答案以涵盖模拟:
#define ptr uintptr_t
void X(ptr P, ptr I)
{
Simulate(P, I);
}
void Y(ptr P)
{
X(P, P);
}
int main()
{
Y((ptr)Y);
}
如果函数Y()调用函数X()的执行轨迹显示:
(1)函数X()从Y()的同一个机器地址依次调用两次。
(2) 与 X().
相同的参数
(3) Y()中没有条件分支和变址跳转指令。
(4) 没有从 X() 到 Y() 的函数调用 returns。
那么Y()到X()的函数调用就是无限嵌套模拟了。
在无限嵌套模拟的情况下,规则 (4) 始终得到满足,因为没有模拟器每隔 returns 到它正在模拟的输入。
当X()模拟Y()的机器语言并在模拟Y()的每条机器指令后检查结果执行轨迹时,X()可以应用上面提供的标准停止模拟Y()在此基础上Y() 指定无限嵌套模拟。