2016-11-17 143 views
0

我想知道從Java代碼到字節碼的詳細編譯過程,比如一行Java代碼如何轉換爲字節碼,所以我想在Java編譯器源代碼中設置斷點,但我不知道如何做到這一點,有沒有任何參考或步驟?如何調試Java編譯器源代碼(Javac)本身?

順便說一句, 我不問如何使用Java debuger(顯然我知道如何使用它),我的意思是如何調試Java編譯器源代碼而不是Java源代碼。

+0

[編譯器構建](https://en.wikipedia.org/wiki/Compiler)是一個通常在大學等學習的高級主題。如果您不知道從哪裏開始,那麼您可能缺少大部分所需的基礎知識在這個項目上取得成功。由於編譯器是用C++編寫的,所以不能只是「放置一個斷點」,看看會發生什麼。 – Kayaman

+1

@Kayaman:我不知道寫了什麼JavaC,但是無論寫什麼語言都有一個調試器,並且你可以設置一個斷點。我已經在自己的編譯器中完成了無數次。這不是調試它們的唯一技術。 –

+0

@IraBaxter呃,我錯了。 Javac確實是用Java編寫的,而不是C++(如JVM)。所以這個問題是編譯器的一半構造,以及如何使用調試器。我知道其他語言有調試器。如果起點太低,我不相信這很重要。 – Kayaman

回答

2

有關編譯器如何工作的問題太寬泛,無法在此處回答。去閱讀一個標準的編譯器教科書。

關於調試編譯:

我傾向於在編譯器(自診斷)和專注於不同語言的小目標語言的測試程序的大套房大量使用斷言功能,自我驗證其正確運行。 (我的最後一個編譯器有大約10年的這些測試程序的大約一千個,以及編譯和運行它們的腳本)。通常,斷言或測試失敗會在編譯器出錯的地方向我提示,僅僅是檢查發現錯誤。

我經常添加特殊代碼來轉儲有關編譯器狀態和可以使用特殊未公開的命令行開關啓用的活動跟蹤的關鍵信息。這些特殊轉儲指示編譯器誤入歧途的位置,並且再次經常啓用代碼檢查來識別錯誤的位置。

如果沒有,我使用調試器來編寫我編寫的語言。

我不認爲這些技術特別特別。當嘗試處理任何大型複雜的應用程序時,它們非常有用。

+0

我沒有問過編譯器是如何工作的,我問過如何在Java編譯器本身設置斷點(假設我們在編譯Java源代碼時有Java編譯器的源代碼) –

+0

@Hermas:很有趣,你*我想知道從Java代碼到字節碼*的編譯過程。大多數人會將其解釋爲「你想知道編譯器是如何工作的」。如果那不是你的問題,你沒有很好地表達。如果你想知道如何在JavaC中「設置斷點」,我建議你得到一個Java開發工具,並瞭解它的調試器如何設置斷點。爲什麼這不明顯? –

+0

我明顯知道如何設置IDE中的Java代碼的斷點,如eclipse或idea,但是如何設置JavaC的斷點?這意味着您首先需要將帶有源代碼的JavaC導入IDE,然後將源代碼設置爲默認調試器的JavaC,但是如何執行這兩個步驟? –