2011-08-31 73 views
0

比如我要檢查下面的代碼是否可以更簡潔與否:有沒有一種工具來測試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

您是否認爲這是您的工作?對不起,你確定簡潔是件好事嗎? –

回答

1

答案是堅決的「不」,

  • 沒有,因爲這是不可能寫一個程序,將永遠回答代碼是否可以更加簡潔與否。如果這樣的程序可以存在,你可以用它來創建一個邏輯悖論(這就是爲什麼我們知道它不能存在)。

  • 這種性質的程序通常並不存在,因爲用機械方式縮小源代碼會使代碼變得不可讀。大多數程序員都沒有看到讓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程序員都應該關心很多。 –

3

你可能會在這裏要求幾件事情。您的問題的一種可能的解釋是您正在尋找切片機,這是一種工具,它接收程序並生成程序,該程序由原始程序中的指令選擇組成,並計算部分或全部結果原版的。換句話說,切片機會刪除那些對於您感興趣的結果中至少有一個不是必需的指令。

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,很好認識這樣的工具〜 –

1

你可以嘗試編譯它優化並查看優化的彙編代碼。但是,由於編譯器優化了所有額外的東西,所以在速度方面你確實沒有獲得任何東西。你獲得的只是可讀性的增加。

相關問題