首頁  >  問答  >  主體

c++ - 混合编程是怎么实现的?它的原理是什么?

伊谢尔伦伊谢尔伦2765 天前636

全部回覆(5)我來回復

  • 高洛峰

    高洛峰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

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 13:13:40

    x86_64有一套參數傳遞規範,各個語言都遵守這個規範。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:13:40

    Java和python並不是產生機器碼,他們產生供各自虛擬機器使用的字節碼。
    然後java虛擬機(常用的Sun JVM)是用c++寫的,常用的python(CPython)的解釋器是用c寫的,它們也都提供接口供調用cc++程序,jvm提供JNI,python可以了解ctypes

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 13:13:40

    有很多種方式,主要的我列一下。粗體的是宿主,啟動的時候從宿主的入口開始,後面的是用各種方式執行:

    1. C/C++ + C/C++:各個平台都有各自的動態函式庫。編譯器依照作業系統定下來的規範來建構這個函式庫,暴露出庫中各函數的入口。作業系統有系統呼叫用於載入動態庫。

    2. Java + C/C++:有人已經說到JNI。你先用C/C++依照JNI的規定寫好一個外部函式庫,然後啟動Java字節碼控制虛擬機器去載入外部函式庫。虛擬機器是C++寫的,於是就回到方式1.

    3. Python + C/C++:ctype。跟Java是類似的,Python運行時去載入好外部函式庫然後給python程式碼用。回到了方式1.

    4. C/C++ + Python:libpython。 python提供了一個外部函式庫libpython幫C/C++加入執行python腳本的功能。 libpython即時解析腳本程式碼然後執行。

    5. C/C++ + Lua:嵌入。跟方式4很類似,腳本程式碼即時解析並且運行。不過Lua可以靜態連結進執行檔裡因為它比較小。

    6. C/C++ + GLSL:嵌入。跟方式5類似,即時解析編譯完程式碼之後交給GPU運行 :-)

    7. 還有就是用子程序和管道的方式來進行通訊的方式…例如CGI :-)

    總的來說,就是(1)系統呼叫(dlopen/dlsym/LoadLibrary)充當一個中介為各種二進位程式碼提供交通的管道,(2)無論是什麼語言它的底層(虛擬機/運行時/庫)肯定是二進位代碼不可能是懸空的。然後大家就可以發揮想像力創造各種混合程式的方式了。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 13:13:40

    我的認識比較短淺,我只會個c和彙編混合編程,可以知道c在編譯過程中有一步是先編譯成彙編語言,而嵌在c中的彙編語言是不需要這一步的。
    說到底cpu能夠辨識就是機器碼0和1,不管什麼語言最終都是使用機器碼運行在cpu上,所以混合程式設計重要的是編譯器對該語言的解釋和編譯。

    回覆
    0
  • 取消回覆