2017-04-12 52 views
1

我的公司內部軟件項目主要用Java完成的主要原因是Java程序獨立於主機架構,因此具有很大的靈活性將申請分發給國際部門。用於獨立於系統的程序分發的動態C++編譯器

我們需要開始一個新的應用程序,它處理大量的數字,我想使用我們可用的C++庫和代碼(我也更喜歡C++)。

現在我不知道爲什麼沒有一些軟件,其作用類似於Java JIT編譯器在以下意義:

  1. 進行編譯,直至這樣intermediate representation LLVM IR
  2. 分發包裝中間表示到客戶端計算機
  3. 編譯在本地機器上一次
  4. 執行

這結合了Java和C++幾個好處:

  • 優化本地計算機的體系結構(如JIT一樣)
  • 分發操作系統軟件的獨立版本(Java)的
  • 執行的程序之間沒有虛擬機(C++)

是什麼原因這樣的事情沒有完成?

+0

表現主要。直接在目標平臺上編譯的C++通常比依賴中間語言(例如Java和.NET家族)的語言要快得多,因爲編譯更高效,並且在運行時沒有任何所需的解釋。對於課程來說,它是一匹馬 - 人們使用C++來處理O/S級別的東西和性能關鍵的事情,比如遊戲,並且他們使用Java/.NET來處理LOB應用程序等等,因爲內存管理更簡單,還有更多的語言功能,您可以瞄準多個平臺。換句話說,你使用正確的工具來完成這項工作。 – ADyson

+0

@ADyson的想法是在目標平臺上編譯。 – Beginner

+0

我不知道有關編譯器的大量數據,但我強烈懷疑中間編譯步驟仍然會以性能成本計算。編譯特定目標允許編譯器優化可利用目標平臺功能的源代碼。如果你編譯成一個通用的中介,那麼很可能會失去微妙的一面。 – ADyson

回答

4

高性能應用沒有做到這一點的主要原因是最後一點性能的價格相當高。現代JIT是編譯時間延遲和代碼質量之間的一種體面折衷。相反,現代C++編譯器(包括Intel和GCC)可以靜態編譯多種替代架構變體,並在程序加載時選擇正確的變體。事實證明,無論如何你都沒有多少變種。實際上,你在看AVX(無/ 1/2)。

如果您的編譯器不這樣做,便宜的手動替代方法是將替代變體放入一系列動態加載的庫中,並在加載時選擇合適的庫。使用MSVC的延遲加載庫,這可以是透明的。您只需勾選實際的庫負載即可選擇MathAVX.DLL而不是MathSSE.DLL

當然,對於真正的高性能應用程序,您可以說「64位,AVX2」或「CUDA,計算能力6+」。對於這樣的應用程序,軟件定義了硬件,反之亦然。