有没有工具来测试c程序的简洁性?

例如,我想检查以下代码是否更简洁:

for(i = 0; i size; i++){ if(0 bucket[i].n){ p = map->bucket[i].list; while(p){ h = hash(p->key) % n; if(bucket[h].list){ new_p = bucket[h].list; while(new_p->next)new_p = new_p->next; new_p->next = p; next = p->next; p->next = NULL; p = p->next; } else{ bucket[h].list = p; bucket[h].n++; next = p->next; p->next = NULL; p = p->next; } } } } 

有这样的任务工具吗?

这对我很有帮助。

你可能会在这里要求几件事。 对您的问题的一种可能的解释是,您正在寻找一个切片器 ,一个接受程序并生成由原始程序中的指令选择组成的程序,并计算原始程序的部分或全部结果的工具。 换句话说,切片器会删除对您感兴趣的至少一个结果不必要的指令。

这里有一个用于C程序的开源切片器。

为了使程序更简洁,也许只保留原始程序中的指令的限制太强烈。 您可能还希望允许除“保持”或“删除”之外的某些转换。 上面链接的切片器的框架也是提供这种转换的一部分。 例如:

 int main(int c, char **v) { int x = 2; int y = x + c; return y; } 

在上面的程序中,指示保留退出代码的切片器不能删除任何指令:它们都对结果有贡献。 但是,如果您首先应用常量传播,则在其值中转换每个常量表达式:

 int main(int c, char **v) { int x = 2; int y = 2 + c; return y; } 

然后切片器可以在第二遍中删除无用的变量x

 int main(int c, char **v) { int y = 2 + c; return y; } 

答案是合格的“不”,

  • 不,因为编写一个总能回答代码是否可以更简洁的程序是不可能的。 如果这样的程序可以存在,你可以用它来创建一个逻辑悖论(这就是为什么我们知道它不存在)。

  • 通常不存在这种性质的程序,因为以机械方式使源代码更小使得代码更不易读。 大多数程序员都没有看到使C代码尽可能小的任何好处。

  • 是的,因为您可以使用静态分析来查找死代码。

人们使用静态分析将大量研究自动化为更小,更快,但几乎所有这些研究都应用于为编译器制作更好的优化器。 优化器可以产生几乎不可读的输出,这就是我们不使用它们来生成源代码而仅使用目标代码的原因。

保持源代码清晰可读。 编译器将在99%的时间内处理其余的事情。

您可以尝试使用优化进行编译并查看优化的汇编代码。 但是你真的没有在速度方面获得任何东西,因为编译器无论如何都优化了所有额外的东西。 所有你获得的是可读性的提高。