不同編程語言的程序可不可以通過接口相互調用?
作為一個寫了多年代碼的程序員來嘗試回答這個問題,在真正搞明白這個事情之前首先要想明白一件事情,目前所有的編程語言都要遵守馮諾依曼的架構,也就是所有編程語言都要轉化成二進制的文件機器語言,這樣子計算機才能真正識別認識,全球存有的編程語言數量已經達到500多種,真正主流的編程語言差不多有十幾種,而且在前幾名的編程語言隨著時代的發展也是一直在發生變化,因為科技在進步任何一種編程語言不可能永遠處于一個高點。
不同編程語言調用原理要講清楚這件事,就要對計算機的原理有所了解,按照馮諾依曼的計算機架構內存,硬盤,cpu這三者需要需要協調工作起來才能正常工作,把所有的編程代碼轉化成二進制文件,這個機器才能識別執行,所以至于上面有多少層的調用,從計算機的角度來講都是一視同仁,計算機本身不知道編程用的什么語言。
現在就以C語言C++之間的互相調用作為例子來講述,由于各個語言都有自己的編譯結構,很難直接全方面混合調用,一般采用中間蠕道的方式打通一個通道然后進行數據融合,C語言和C++數據互相調用主要通過一個extern關鍵字通道來完成的,而且通過這種關鍵字還能完成互相調用的過程,因為本質上C語言屬于面向過程的語言,C++是面向對象的操作,所以在內存結構擺列方式就不太一樣,C語言融入到C++里面主要是通過設置C語言的函數成為全局變量的方式納入到C++體系的,而C語言調用C++的類接口,其實也是講自己轉化成全局方式來調用,如果真的調用C++中的類變量這種其實在語法上存在問題。
安卓內核框架主要是C++和C語言,Java三種編程語言融合在一起的,C++和C語言之間的互相調用其實上面已經講述過了java和C語言的之間互相調用,也是類似于蠕洞方式,所以我們在看到很多安卓的app內部包含著一個動態so庫,就是通過動態dlopen的方式動態把庫加載進去,然后通過在java打通的底層蠕洞完成java調用底層語言的過程,因為這種蠕洞的存在直接能夠提升編程的靈活性,幾乎所有主流的編程語言之間都可以通過這種方式來完成真正意義上的互相調用。
不同編程語言調用產生多少開銷前段時間吵得非常熱的方舟編譯器,在本質上講和不同的編程語言之間的調用有一定關聯,其實不同編程語言之間融合對于編譯器的設計是一種極大的挑戰,華為方舟編譯器最大的挑戰是把java虛擬機給拿掉了,然后通過算法或者推斷的方式把動態運行過程中的行為都歸納出來,因為java運行的原理是把java語言翻譯成中間文件,中間文件在虛擬機中轉化成計算機能夠識別的二進制文件,java也是通過虛擬機的方式完成跨平臺使用。
一般來講不同編程語言之間互相調用在編譯器里面如果設計不是很妥當很可能造成性能的損失,原則上在設計的時候盡量不要交叉調用,但在實際開發過程中也很難避免掉,方舟編譯同時也對java直接調用C++的進行重點的優化,這塊頁數損失性能很重要的一塊,對于這塊的優化一般的企業很難有這種精力去做,因為這種基礎性的研究很難短時間內有突破還需要持續性的支出,所以在平時設計模塊代碼的時候盡量減少不同編程語言之間的混合使用。
作為一個程序員需要多拿出一些時間來研究編譯過程以及實際運行過程,有助于在寫代碼過程中少走彎路,有時候一個有效的想法能給項目的推進帶來極大的推進作用,程序員平時要注意對基礎的提升,這是一個長期的過程,短時間內未必有真實的效果,只要踏入編程這個領域就不要想著短時間內能掌握多少東西,知識體系的建立需要基礎和項目的磨練,隨著時間推移一點點積累,積累多了什么技術級別自然而然就來了,希望能幫到你。