混合不同的編程語言一直以來我都不太明白。據this Wikipedia article,外國功能接口(或FFI)可以通過多種方式來完成:瞭解外部函數接口(FFI)和語言綁定
- 要求客人語言功能,這些功能是宿主語言調用指定或以一種特殊的方式來實現;經常使用某種兼容性庫。
- 使用工具自動「包裝」客人語言功能與適當的膠水代碼,執行任何必要的翻譯。
- 包裝庫的使用
- 限制可以跨語言使用的一組主機語言功能。例如,從C調用的C++函數可能(通常)不包括引用參數或拋出異常。
我的問題:
- 什麼 第1,第2和第3的方式之間的區別是什麼?看來 我都是把 的代碼編譯成 這個庫的目標文件和頭文件 ,然後調用語言爲 。
One source it links說, 實現一個FFI可以 幾種方式來完成:
- 需要在目標語言調用的函數實現 特定的協議。
- 實現一個包含給定的低語言函數的包裝庫,並用代碼「包裝」它以執行與高級語言約定的數據轉換或從 高級語言約定中進行數據轉換。
- 需要本地聲明使用高級功能子集(與低級語言兼容)的函數。
我在想,如果在 聯動源的第一種方式是相同維基百科 第一種方式?
這個 源代表的第三種方式是什麼意思?它對應於維基百科中的第四種方式嗎?
- 在 the same source,比較三種方式它列出的時候,似乎想說 填充 兩種語言之間的差距的工作是逐步 從所謂的語言 給調用語言轉向。我是 想知道如何理解?這種轉變在維基百科的四種方式中也是如此嗎?
是Language binding和FFI 等效概念?他們如何 相關和不同?
從一種編程語言 庫或OS服務綁定在 語言提供服務的API 。
我想知道在維基百科或源代碼的引用中哪個方法屬於哪個屬性?
- Common Object Request Broker Architecture (CORBA)
- 在調用C++ C,通過在C中的extern 「C」 聲明++到 禁用名字改編。
- 在Matlab調用C,由MATLAB Interface to Shared Libraries,即,首先通過通用C編譯C代碼共享庫 編譯器如gcc,然後 加載,調用從 的函數,並且通過MATLAB函數 的LoadLibrary卸載所述共享庫 (),calllib()和 unloadlibrary()。
- 調用在Matlab C,由Creating C/C++ Language MEX-Files
- 用C調用Matlab,通過mcc compiler
- 調用用Java C++,通過JNI,和中調用Java在C++中,也通過JNI
- 在其他語言調用C/C++ ,使用SWIG
- 在Python中調用C,由Ctypes module。
- Cython
- 調用在Python R,由RPy
- Programming Language Bindings to OpenGL from various languages,例如Python,Fortran和爪哇
- 綁定爲一個C庫,如Cairo,從各種語言, 如C++,Python的這樣, Java中,Common Lisp的
感謝您的啓示!最好的問候!
+1很好的答案。一個註釋:「通過創建MEX文件在MATLAB中調用C」更像是「選項1」,它相當於使用C API編寫Python擴展。您使用接收'mxArray *'參數的特殊網關例程創建常規共享庫。至於「使用mcc編譯器在C中調用MATLAB」,它並不是真正的FFI,因爲這只是調用其他C代碼(MCC編譯器生成常規共享庫)的C代碼。 – Amro 2013-06-25 09:21:40
未提及的另一個選擇是「使用MATLAB引擎在C中調用MATLAB」,它類似於[「Python嵌入」](http://docs.python.org/2/extending/embedding.html)繼續類比(和使用JNI接口在C中調用Java一樣) – Amro 2013-06-25 09:23:47