2014-01-16 35 views
0

一個似乎與衆不同的簡單問題。 (反向)用於Java/Python以訪問C/C++的動態鏈接庫?

而不是從解釋型語言調用本地代碼;有沒有辦法將Java或Python代碼編譯爲.dll/.so並從C/C++調用代碼?

我願意接受甚至答案,例如手動產生解釋器或JVM,並強制它讀取.class/.py文件。 (這是一個很好的解決方案嗎?)

謝謝。

+0

你爲什麼要特意做這個?有很多選擇,但很難知道哪一個對你來說合理,而不知道你想要做什麼。 – abarnert

+0

我的C++網絡系統有一些部分對性能不那麼重要,但它們需要大量的高級抽象。所以我決定以更快的速度(按照開發語言)分別編寫它們。 –

+0

通常,性能至關重要的網絡系統的_only_部分是核心網絡環路。而像'gevent','asyncio','twisted'等Python庫通常比你自己在C++中編寫的任何東西(以及跨平臺,更少的錯誤,更易於使用等等)更快,所以根本沒有理由使用C++。當然,如果你在socket複用之外還有其他一些事情是CPU限制的,或者需要核心並行性,或者與第三方C庫沒有綁定的話,你可以用C++編寫_them_,但通常很容易組織這些零件進入擴展模塊。 – abarnert

回答

0

gcj可以編譯而不是到JVM字節碼最Java源爲本地代碼(具有libgcj共享庫鏈接)。

有很多類似的Python項目,如shedskin,但沒有一個是成熟或活躍的。

Cython是類似的,但不完全相同 - 它將用Python語言編寫的模塊編譯爲CPython的本地C擴展模塊。但是,如果將它與embedding Python in a C app一起使用,它可以爲您提供所需的大部分功能。但是你仍然在運行一個Python解釋器循環來將所有編譯爲C的功能綁定在一起。

你也可以做Java的嵌入JVM同樣的事情到您的應用程序,使用gcj編譯要本地代碼的任何部分,而編譯其他部分的字節碼,並使用JNI它們之間的通信。

當然,你可以用Jython嵌入Python代碼到JVM中,你可以嵌入到你的C程序,因爲你可以直接從Jython中使用JNI在任意一對三種語言的能有效相互交談沒有通過第三。

將JVM或CPython解釋器產生爲子流程的想法,我認爲您在您的問題中提出的建議也可以正常工作。但是,在這種情況下,您唯一需要的界面將是子進程的stdin/stdout/stderr(或手動創建的任何管道或套接字),這不像在對象上直接調用方法那樣靈活,等等(有時候,這種額外的間接方式可能是件好事,迫使你在組件之間定義一個乾淨分離的API。)

+0

肯定會考慮您的答案並查看這些鏈接 - 謝謝。 –

0

你也可以看看Lua,雖然沒有像很多其他腳本語言,它的意思是很容易嵌入到可執行文件中。它相對較小且很快。只是另一種選擇。如果你想從你的c/C++調用其他語言來看看SWIG。