2009-12-12 37 views
7

我聽說了以下功能減少調試性(因爲他們是匿名的,並且調試器不能跟蹤它很好)做一些函數式編程結構減少可調試性?

  1. 匿名類
  2. 內部類
  3. 瓶蓋塊/λ功能

這是真的嗎?

+0

因爲何時是匿名類和內部類「函數式編程結構」? – 2009-12-12 22:06:09

+0

他們不是。標題並不完全指示性的,但我想人們明白這一點。 – user855 2009-12-12 22:16:42

回答

1

我會說這顯然是不真實的。是的,沒有額外的調試支持,這些構造可能會更難以調試。在許多語言中,它們不是真正的匿名,因爲調試器不理解語言語義。相反,它理解程序的最終形式(.exe和PDB組合)。大多數匿名結構最終在最終的程序中採用具體的形式(對於.Net實現來說也是如此)。

另外,實現這些功能的語言通常需要花時間爲它們實現更好的調試支持。以C#和VB爲例

  1. 這兩種語言都增加了DebuggerDisplay屬性並覆蓋了.ToString對匿名類型的generate來增加調試支持。這些實現有點不同,但結果幾乎相同。
  2. 內部類不在調試方面非常特殊的,不需要太多,如果任何額外的工作
  3. VB和C#在Visual Studio 2008中花費了大量的時間來「放鬆」 lambda表達式,並顯示所拍攝的自由變量作爲原始當地人名單的一部分。使得它更容易調試功能
2

很難說他們是否本質上減少調試性。如果匿名函數拋出異常,您仍然可以打印堆棧跟蹤。當發生什麼事情時,DrScheme設法在整個代碼中繪製紅色箭頭來表示堆棧跟蹤,並且處理匿名函數就好了。然而,儘管已經花費了大量的精力來調試諸如Scheme或Haskell之類的語言,就像已經用Java一樣加入到了Java中,所以當然調試工具可能更糟糕。

而且,正如JaredPar所說,Visual Studio似乎在這方面和C#上做得很好。

1

列出的功能不應導致設計用於處理它們的調試器出現問題。如果你的調試器假定你將調試的東西與C基本上沒有太大差別,那麼你可能會遇到問題。

現在,在功能語言中發現的一個功能確實是確實是令調試人員頭痛的是大量使用懶惰評估。 Haskell在這方面特別有問題。

0

從我的角度來看,我並不特別相信這種情況。我正在使用Scala的功能特性,它編譯運行在Java虛擬機上。像Intellij這樣的調試器正確地處理這個問題。

話雖如此,一些代碼結構以不同的方式呈現給您通常期望的方式。功能塊在某些情況下作爲內部類出現。列表顯示爲頭部實體和尾部列表(或者可能是其他方式 - 我剛剛開始使用它!)。

6

關於您所說的特定功能已經有一些很好的答案。一般來說,我會說一些FP功能以及更多FP風格的編程方面至少與調試體驗「互動」。例如,使用高階函數,可以用無點式編程。當你這樣做時,這會留下更少的標識符,這意味着例如在調試器的「本地」窗口中可以輕鬆檢查的東西更少。直到你進入他們的身體之前,閉合物通常是不透明的。 FP也使用了很多反轉控制結構(懶惰評估只是一個,'地圖'或'iter'而不是'foreach'是另一個),它改變了控制流程,並且可能影響'單步'作品。

隨着FP變得越來越普遍,我預計調試工具將繼續改進。我不清楚某些FP是否「固有地」難以調試,但即使這是真的,不要忘了,關於FP的更多內容使您的代碼不太可能首先需要調試。 :)