将任何程序转换为语义上等效的程序

时间:2012-04-25 20:43:32

标签: c performance optimization compiler-construction

我最近发现了这个定理here,(在底部):

Any program can be transformed into a semantically equivalent program of one procedure containing one switch statement inside a while loop.

文章继续说:

A corollary to this theorem is that any program can be rewritten into a program consisting of a single recursive function containing only conditional statements

我的问题是,这些定理今天都适用吗?同样改变计划是否会获得任何好处?我的意思是说,这样的代码是否经过优化? (虽然递归调用较慢,但我知道)

我从here读到,在编译器优化后,开关案例几乎总是 。这有什么区别吗。 ?

PS:我试图从here

了解编译器优化

我添加了c标记,因为这是我见过的唯一优化语言。

3 个答案:

答案 0 :(得分:7)

这是真的。图灵机本质上是一个关于符号的switch语句,它永远重复,因此它直接基于图灵机 - 计算一切。 switch语句只是一堆条件,所以你可以清楚地把这样的程序写成一个只有条件的循环。一旦你有了这个,从递归开始循环很容易,尽管如果你的语言没有真正的词法范围,你可能不得不将很多状态变量作为参数传递。

在实践中没有理由这样做。这些程序通常比原件运行得慢,并且可能占用更多空间。那么为什么你可能会减慢程序速度,和/或使其负载图像更大?

唯一有意义的地方是你打算混淆代码。这种技术通常用作“控制流混淆”。

答案 1 :(得分:3)

这基本上是编译器将程序转换为机器代码时发生的情况。机器代码在处理器上运行,处理器在循环中逐个执行指令。程序的复杂结构已成为内存中数据的一部分。

答案 2 :(得分:2)

通过switch语句的递归循环可用于创建基本虚拟机。如果您的虚拟机是图灵完成的,那么理论上,任何程序都可以重写以在此计算机上运行。

int opcode[] {
   PUSH,
   ADD
   ....
};

while (true) {
    switch (*opcode++) {
    case PUSH:
        *stack++ = <var>;
        break;
    case ADD:
        stack[-1] += stack[0];
        --stack;
        break;
     ....
    }
}

当然,为这个虚拟机编写编译器将是另一回事。 : - )