不同編程語言之間是如何溝通的?

比如android上的應用多是由java寫的,但是其操作系統核心用的是c和c++,那麼不同編程語言之間是如何交流的呢?


Java 編譯成 byte code,byte code 在運行中又會被 JVM 翻譯成機器指令。byte code 中有一種指令就是告訴 JVM 直接去調用一個 C 函數。這樣就完成了控制流的跨語言。同時 byte code 中有指令來構造 C 能識別的參數棧。

所有語言都能和 C 交互,它們之間也就可以交互。為什麼以 C 為媒介?因為 C 其實有兩個層面的意思,一是 C 的語言,二是 C 的 binary interface。基本上 C 的 binary interface 就是機器語言的 design pattern,大家都預定俗成就用這個 pattern。所以,本質上是所有語言都以機器語言為媒介,但是可以認為是以 C 為媒介。

另一種更高層次的互操作,是每個語言都實現和 C 的 socket 或者 pipe 介面,然後通過 socket 和 pipe 實現互操作。和上面的方法比的優點是這樣的語言不必提供通用的 byte code 指令負責調用 C 和構建參數棧。


語言之間互相通訊的機制太多了,大概可以分為兩大類:

  1. 基於統一標準

    程序間通訊的統一規範標準有很多,比如 Socket,RPC,管道,Web Services 等。

    任何一種語言都可以把自己的調用請求(invocation)轉化為標準所指定的協議或編碼格式,然後發送給另外一個語言的程序,然後它再按照這種標準去解析處理。
  2. 基於語言特定標準

    這種主要是局限於特定的語言間交互,比如 Java 和 C/C++ 的交互介面叫 JNI,Flash 和 JavaScript 的交互介面叫 ExternalInterface,.NET 和 C++ 的交互介面叫 P/Invoke。

但是,這兩類也不是絕對的。

所有的代碼在本質上都是一樣的,最終被轉化為機器碼(最底層),由 CPU 解釋執行。

所謂的 「通訊標準」,只是在一定層面上的。

有的轉化在比較底層,比如 .NET 的 P/Invoke,甚至和 Windows 操作系統的底層 API 都息息相關。

有的轉化在比較高層,比如 Web Services,它基於 HTTP,HTTP 基於 TCP,TCP 基於 Socket,Socket 基於 OS …

嗯,不同語言間互相通訊的原理大概就是這樣。

當然,具體平台、具體語言都有自己的 Specification,比如 Android 系統上 C 和 Java 的交互原理,可以參考 @馮東 的答案。


可以通過文件交換信息,比如xml,或者通過網路套接字socket來通信,android還是不能說用java寫的吧,只是application framework和application是java寫的


1. Foreign Function Interface

2. Wikibooks, open books for an open world

3. Chapter 17. Interfacing with C: the FFI

4. Haskell FFI 小敘 - 知乎專欄


推薦閱讀:

Windows自帶的微軟拼音輸入法為什麼會佔用巨大的內存?
學習 Linux 有哪些好處?
一個已經裝好系統的硬碟能否移到其他未裝系統的電腦上直接使用?
win10不能直接關機強制(更新並關機)做法是不是太流氓?
Windows、OS X 、Debian 等操作系統是用什麼開發環境開發的?

TAG:操作系統 | 編程語言 | 計算機 |