高洛峰2017-04-17 13:13:40
這實際上分為兩種, 一種是庫調用, 一種是跨語種的調用.
庫調用的話, 只需要規範好的ABI, 就行了. Linux/Windows有自己的ABI規範, 只要符合這個規範, 那麼編譯出來的庫, 就可以被其他語言所調用. 一個很簡單的例子, 一個C/Fortran語言編寫的庫, 可以被其他C++程序調用.
還有一種是跨語種的, 通常在Native語言和Managed語言見到. 比一個C++程式和Python程式交互, 那麼必須在Python層規範好FFI, 然後C++才可以給Python編寫插件之類的, 讓Python調用C++. Java/ Python之類的都是這種. 本質上還是託管語言的ABI和Native語言的不一樣, 需要在託管語言這邊規範一下.
關於ABI看https://zh.wikipedia.org/wiki/X86%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A
天蓬老师2017-04-17 13:13:40
Java和python並不是產生機器碼,他們產生供各自虛擬機器使用的字節碼。
然後java虛擬機(常用的Sun JVM)是用c++寫的,常用的python(CPython)的解釋器是用c寫的,它們也都提供接口供調用cc++程序,jvm提供JNI,python可以了解ctypes
巴扎黑2017-04-17 13:13:40
有很多種方式,主要的我列一下。粗體的是宿主,啟動的時候從宿主的入口開始,後面的是用各種方式執行:
C/C++ + C/C++:各個平台都有各自的動態函式庫。編譯器依照作業系統定下來的規範來建構這個函式庫,暴露出庫中各函數的入口。作業系統有系統呼叫用於載入動態庫。
Java + C/C++:有人已經說到JNI。你先用C/C++依照JNI的規定寫好一個外部函式庫,然後啟動Java字節碼控制虛擬機器去載入外部函式庫。虛擬機器是C++寫的,於是就回到方式1.
Python + C/C++:ctype。跟Java是類似的,Python運行時去載入好外部函式庫然後給python程式碼用。回到了方式1.
C/C++ + Python:libpython。 python提供了一個外部函式庫libpython幫C/C++加入執行python腳本的功能。 libpython即時解析腳本程式碼然後執行。
C/C++ + Lua:嵌入。跟方式4很類似,腳本程式碼即時解析並且運行。不過Lua可以靜態連結進執行檔裡因為它比較小。
C/C++ + GLSL:嵌入。跟方式5類似,即時解析編譯完程式碼之後交給GPU運行 :-)
還有就是用子程序和管道的方式來進行通訊的方式…例如CGI :-)
總的來說,就是(1)系統呼叫(dlopen/dlsym/LoadLibrary
)充當一個中介為各種二進位程式碼提供交通的管道,(2)無論是什麼語言它的底層(虛擬機/運行時/庫)肯定是二進位代碼不可能是懸空的。然後大家就可以發揮想像力創造各種混合程式的方式了。
高洛峰2017-04-17 13:13:40
我的認識比較短淺,我只會個c和彙編混合編程,可以知道c在編譯過程中有一步是先編譯成彙編語言,而嵌在c中的彙編語言是不需要這一步的。
說到底cpu能夠辨識就是機器碼0和1,不管什麼語言最終都是使用機器碼運行在cpu上,所以混合程式設計重要的是編譯器對該語言的解釋和編譯。