我從1982年開始在CP/M-80和後來的數字研究操作系統上調試PL/M程序。在微軟推出的symdeb是一個命令行調試器,其源代碼和程序集同時顯示之前,它在MS-DOS的早期是一樣的。 Symdeb是一個飛躍,但並不是那麼好,因爲先前的調試器迫使我學會識別哪些彙編代碼屬於哪個源代碼行。在CodeView之前,最好的調試器是Phoenix Technologies的pfix86。 NuMegas SoftIce是我見過的最好的調試器(除了純硬件ICE),它不僅調試了我的應用程序,而且還毫不費力地引導我完成了Windows的內部工作。但我離題了。
1990年晚些時候,我在一個項目的顧問找到我,說他有這個(很早)的C++ bug,他一直在努力好幾天,但不明白是什麼問題。在我全無耐心的時候,他單步通過源代碼(在窗口化的非圖形DOS調試器上)。最後,我打斷了他,並查看了調試器選項,並確定存在與寄存器和所有內容混合的源/彙編模式。這使得應用程序試圖釋放一個包含NULL的內部指針(用於局部變量)變得容易。對於這個問題,源代碼模式根本沒有任何幫助。今天的C++編譯器可能不再包含像這樣的錯誤,但會有其他錯誤。
瞭解彙編級別的調試功能可以讓您瞭解源編譯器彙編關係,以便能夠預測編譯器將生成的代碼。很多人在這裏在stackoverflow上說「profile-profile-profile」,但是這更進一步,因爲你學習了什麼源代碼結構(我用C編寫)來使用什麼時候以及如何避免。我懷疑這對C++來說更重要,它可以在開發人員不懷疑任何事情的情況下生成大量代碼。例如,有一個處理對象列表的標準類,它看起來沒有缺點 - 只需幾行代碼和這個奇妙的功能! - 直到你看到它產生的奇怪過程調用的分數。我並不是說使用它們是錯誤的,我只是說開發者應該意識到使用它們的優點和缺點。重載操作符可能是很好的功能(對於像我這樣的所見即所得程序員來說有些奇怪),但執行速度的價格是多少?如果你說「沒有」,我會說「證明它」。
在調試時使用混合或純粹的彙編模式絕不是錯誤。通常更容易找到困難的錯誤,開發人員將學習編寫更高效的代碼。來自解釋陣營(C#和Java)的開發人員會說他們的代碼和編譯語言一樣高效,但如果你知道程序集,你也會知道他們爲什麼錯了,爲什麼他們錯了。你可以微笑並思考「是的,請告訴我吧!」
在與不同的編譯器一起工作之後,您會遇到一個具有最驚人代碼生成能力的代碼。一個PowerPC編譯器只需通過其優化器的高級代碼解釋就可以將三個嵌套循環壓縮成一個循環。在寫這篇文章的那個人旁邊......好吧,讓我們來談談另一個聯盟。
直到大約十年前,我寫了相當多的純彙編,但是使用多級流水線,多個執行單元,現在有多個與C編譯器競爭的內核,這些都讓我倍感壓力。另一方面,我知道編譯器可以做些什麼以及不應該使用哪些東西:垃圾回收仍然等於垃圾回收。任何生成彙編輸出的編譯器都是如此。
對於它的價值,我從來沒有聽說過它叫做「反彙編」語言,但我知道你的意思。 – 2009-10-15 05:19:50