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

问题描述:

比如我要检查下面的代码是否可以更简洁与否:有没有一种工具来测试c程序的简洁性?

for(i = 0; i < map->size; i++){ 
    if(0 < map->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; 
      } 
     } 
    } 
} 

是否有这类任务的任何工具?

这对我很有帮助。

+0

如果您选择较短的变量名称,它会更简洁? – sth

+0

以下是您的工具:http://codereview.stackexchange.com/ –

+4

您是否认为这是您的工作?对不起,你确定简洁是件好事吗? –

答案是坚决的“不”,

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

  • 这种性质的程序通常并不存在,因为用机械方式缩小源代码会使代码变得不可读。大多数程序员都没有看到让C代码尽可能小的好处。

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

人们把研究的巨额进入制作程序更小,更快的自动,使用静态分析,但几乎所有此类研究都被应用到更好地优化了编译器。优化器可能会产生几乎不可读的输出,这就是为什么我们不使用它们来生成源代码但仅使用目标代码的原因。

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

+0

**逻辑**更简洁只会使代码更易读IMO。 –

+0

@Je Rog:#!/ usr/local/bin/perl -s do'bigint.pl';($ _,$ n)= @ ARGV; s /^.(..)*$/ 0 $& /;($ k = unpack('B *',pack('H *',$ _)))=〜 s/^ 0 * //; $ x = 0; $ z = $ n =〜s/./$x=&badd(&bmul($x)),hex$ &)/ge; while(read(STDIN,$ _,$ w =((2 * $ d-1 + $ z)&〜1)/ 2) ){$ r = 1; $ _ = substr($ _。“\ 0”x $ w,$ c = 0,$ w); s /。| \ n/$ c =&badd(&bmul ($ c, 256),ord $ &)/ge; $ _ = $ k; s /./$ r =&bmod(&bmul($ r,$ r),$ x),$&?$ r =&bmod(&bmul($ r,$ c ),$ x):0,“”/ ge;($ r,$ t)=&bdiv($ r,256),$ _ = pack(C,$ t)。$ _ while $ w - 2 * $ d; print} –

+0

请把它以优秀的格式发布在第一位。我的问题不是格式,或者漂亮的代码,而是逻辑的简洁,所有c程序员都应该关心很多。 –

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

C程序有一个开源切片器here

为了使程序更加简洁,或许只保留来自原始程序的指令的约束过于强大。您可能还想要允许“保留”或“删除”以外的其他转换。以上连接的切片机的部分也是提供这种转换的一部分。例如:

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; 
} 
+0

+1,很好认识这样的工具〜 –

你可以尝试编译它优化并查看优化的汇编代码。但是,由于编译器优化了所有额外的东西,所以在速度方面你确实没有获得任何东西。你获得的只是可读性的增加。