2017-07-21 54 views
2

我最近玩過不同的LLVM前端像Clang(C Familiy),LDC2(D),Terra,...LLVM互操作性(如JVM或.Net) - 是否可以這樣做?

所有這些語言都可以編譯到LLVM IR(有點可讀)和LLVM IR位碼。那麼在這個階段,他們都處於同一個「層面」上嗎?

我的問題是:在「語言級別」上有沒有像.NET語言或JVM語言那樣的語言互操作性的方式,還是隻能通過在IR中編輯來實現?

我已經在谷歌搜索了這個問題,但沒有找到想找的東西。

如果是我該怎麼做,我可以做所有的前端或只有一些具體的?

回答

1

對於語言X能夠調用語言Y,它必須具備的能力,以

  • 呼叫Ÿ功能(知道Ÿ的呼喚convetions)
  • 轉換傳遞給Y考慮形式的數據,預計(稱爲編組)

這主要應該在前端級別(而不是中端,LLVM是)完成。 C語言可以作爲interop的共同基礎,所以如果兩種語言可以調用C並將它們自己的函數導出到C,它們可以相互交談。

Haskell和C++可以作爲例子。 C++可使用

extern "C" { 
} 

塊導出的代碼如C,和Haskell也可以導出其功能與foreign export ccall關鍵字。它還具有將Haskell字符串轉換爲C字符串並返回的編組函數。你可以看到,LLVM在這裏扮演着一個小角色,但你正確地提到,使用LLVM你可以在理論上通過手動編輯結果IR來互操作任何編譯爲LLVM的語言。