84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
小伙看你根骨奇佳,潜力无限,来学PHP伐。
這實際上分為兩種, 一種是庫調用, 一種是跨語種的調用.庫調用的話, 只需要規範好的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
x86_64有一套參數傳遞規範,各個語言都遵守這個規範。
Java和python並不是產生機器碼,他們產生供各自虛擬機器使用的字節碼。 然後java虛擬機(常用的Sun JVM)是用c++寫的,常用的python(CPython)的解釋器是用c寫的,它們也都提供接口供調用cc++程序,jvm提供JNI,python可以了解ctypes
有很多種方式,主要的我列一下。粗體的是宿主,啟動的時候從宿主的入口開始,後面的是用各種方式執行:
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)無論是什麼語言它的底層(虛擬機/運行時/庫)肯定是二進位代碼不可能是懸空的。然後大家就可以發揮想像力創造各種混合程式的方式了。
dlopen/dlsym/LoadLibrary
我的認識比較短淺,我只會個c和彙編混合編程,可以知道c在編譯過程中有一步是先編譯成彙編語言,而嵌在c中的彙編語言是不需要這一步的。 說到底cpu能夠辨識就是機器碼0和1,不管什麼語言最終都是使用機器碼運行在cpu上,所以混合程式設計重要的是編譯器對該語言的解釋和編譯。
這實際上分為兩種, 一種是庫調用, 一種是跨語種的調用.
庫調用的話, 只需要規範好的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
x86_64有一套參數傳遞規範,各個語言都遵守這個規範。
Java和python並不是產生機器碼,他們產生供各自虛擬機器使用的字節碼。
然後java虛擬機(常用的Sun JVM)是用c++寫的,常用的python(CPython)的解釋器是用c寫的,它們也都提供接口供調用cc++程序,jvm提供JNI,python可以了解ctypes
有很多種方式,主要的我列一下。粗體的是宿主,啟動的時候從宿主的入口開始,後面的是用各種方式執行:
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)無論是什麼語言它的底層(虛擬機/運行時/庫)肯定是二進位代碼不可能是懸空的。然後大家就可以發揮想像力創造各種混合程式的方式了。我的認識比較短淺,我只會個c和彙編混合編程,可以知道c在編譯過程中有一步是先編譯成彙編語言,而嵌在c中的彙編語言是不需要這一步的。
說到底cpu能夠辨識就是機器碼0和1,不管什麼語言最終都是使用機器碼運行在cpu上,所以混合程式設計重要的是編譯器對該語言的解釋和編譯。