2013-12-13 49 views
1

我想使用GCC類型作爲JIT編譯器,我只需編譯短片段的代碼。雖然我當然可以爲我想編譯的每個函數分配一個GCC進程,但是我發現GCC的啓動開銷太大了(我的計算機似乎大約需要50毫秒,這會花費50秒來編譯1000功能)。因此,我想知道是否可以將GCC作爲守護進程運行,或者將它用作庫或類似的東西,這樣我就可以提交一個編譯函數而不需要啓動開銷。我可以運行GCC作爲守護進程(或將它用作庫)嗎?

如果你想知道,我不考慮使用實際的JIT庫的原因是因爲我沒有找到一個支持所有我想要的功能,其中至少包括ABI的良好知識,以便它可以處理結構參數(缺少GNU Lightning),嵌套函數(包含缺少libjit)和C語言接口(缺少LLVM;我也認爲LLVM缺少嵌套函數)。

不,我不認爲我可以將函數一起批量編譯;一半的觀點是,我想只在第一次實際調用它們時才編譯它們。

我注意到libgccjit,但從我所知道的看來,它似乎很實驗性。

+0

你確定C首先是一種很好的語言嗎?有像lua這樣的語言更適合這種操作,至少這是我想到的。 – user2485710

+0

我很確定。 :)更準確地說,我想在一個以C編寫的系統中使用它。 – Dolda2000

+0

不是迂腐,但Lua運行在C運行的地方,考慮到所需的系統規範和C編譯器的必要性,兩種選擇。 lua解釋器是ANSI C代碼,並且有使用lua的低端ARM芯片組,它們運行非常流暢。 – user2485710

回答

1

我的答案是「否(您不能將GCC作爲守護進程運行,或將其用作庫)」,假設您嘗試使用標準GCC編譯器代碼。我看到至少有兩個問題:

  1. C編譯器優惠完整的翻譯單位,一旦讀完源,編譯它並退出。讀取每個文件後,必須重新調整代碼(編譯器驅動程序)。由於它運行多個子流程,無論如何,我不確定您會爲此節省多少時間。

  2. 您將無法將您創建的函數調用爲正常靜態編譯和鏈接函數。至少您必須加載它們(使用dlopen()及其親屬,或編寫自己的代碼來執行映射),然後通過函數指針調用它們。

第一個異議涉及直接問題;第二個解決了評論中提出的問題。

+0

無論如何,我打算做這兩件事,所以我不認爲這會是一個問題。特別是,我不明白這是如何回答的,但是。 :) – Dolda2000

+0

這是一個答案,「不,你不能作爲一個守護進程運行標準的GCC編譯器驅動程序」,有理由說明爲什麼你不能這樣做。 –

相關問題