2011-08-20 140 views
9

我最近很驚訝地看到Java代碼被自動重新編譯並注入正在運行的程序中。由於現代C++編譯器(例如基於LLVM)開始調查JIT編譯,所以我想知道是否有任何關於此主題的工作。通過「熱重新編譯」,我的意思是編輯代碼,重新編譯可執行文件的特定部分並在不重新啓動程序的情況下運行它。常見的用例是一個帶有無限循環的遊戲引擎,您可以在渲染步驟中編輯一些代碼,並查看下一幀的更改。C++的熱重新編譯

C++熱重新編譯的研究狀態是什麼?有沒有工作實施?

+0

究竟是什麼問題? – Hogan

+0

@Hogan我已經更新了這個問題。 –

+0

定義「熱重新編譯」。 –

回答

10

這是可能通過「熱重新編譯」你的意思是在Visual C++中的"Edit and continue"

也許該鏈接構成了你的問題的答案。

但它會更容易,如果你需要定義你問,「熱重新編譯」一詞,更清楚(因爲我在寫這它沒有很好地界定)。

添加: 「編輯並繼續」 爲C++顯然introduced with Visual C++ 6.0,在20世紀90年代。所以現在一些Java實現可以做到這一點,這只是有點令人吃驚。 <克>然而,/Zi開關,使編輯和 - 繼續確實也,我記得,更改的__LINE__行爲,以便例如原來的ScopeGuard實現不起作用(然後必須使用特定於Microsoft的__COUNTER__)。

乾杯&心連心,

+1

+1提及編輯並繼續。我發現它對調試某些東西無窮無盡。 –

+0

哇。我不知道VS中的這個特性。其他編譯器/ IDE是否實現它? –

2

automatically recompiled and injected into a running program.我假設你在談論的JVM實際觀看該節目的執行,並例如在運行時改變預測分支值,以儘量減少跳躍和非流水線。

這可以在Java中進行,因爲在源代碼和實際機器指令之間的單獨的良好限定的中間階段。這將使它能夠在運行時替換中間代碼,可能會提高性能。

在C++程序直接內置到一個特定的架構的機器語言,並在大多數硬件上,代碼頁僅出於各種原因,防止意外和惡意代碼的變化讀取。

現在,你在C可做++是使用像他Clang的圖書館重建的代碼段到一個共享對象,然後使用dlopen等打開重新編譯共享對象去接機的新版本碼。這當然要求你的程序比Java程序必須要更好地利用JVM。我認爲 g ++/gprof有一個模式,其中分析數據可以用來影響g ++的優化,但是,也許這就是你想要的?

+0

你提到的是JIT編譯器必須具備的共同特性。我沒有提到優化。我的問題更多地涉及@Alf的建議。 –