2012-10-26 60 views
4

我想寫一個OCaml庫,它將被其他編程語言(如C或Python)使用。OCaml庫的綁定和反省

我不知道它甚至是可行的,我想我需要放棄一些類型安全,並添加運行時檢查到動態類型語言的接口。

它可行嗎?有沒有工具來實現這個目標來自動生成綁定?我認爲像Corba這樣的東西不適合ocaml ABI,但我可能是錯的。

編輯:通過刪除運行時要求,並使用只有語言有一個llvm前端,我可以使用llvm作爲一個普通的ABI我猜,但它似乎棘手。

回答

9

OCaml的FFI爲interact with C code。綁定的代碼必須用C語言編寫,而不是用OCaml(它沒有直接表示C值,而C用OCaml值表示)寫入。我的建議是:

  1. 在C面,決定什麼是最好的接口導出C程序員想(或Python程序員在編寫從C接口開始Python綁定)
  2. 定義一個「低-level層」上OCaml的一側,得到您的OCaml的價值儘可能接近從C表示
  3. 編寫C包裝從這種低級OCaml中表示轉換成您的最佳S表示

步驟(2)的理由是讓步驟(3)儘可能小。從C端操縱OCaml值有點痛苦,尤其是你有可能與垃圾收集器的交互錯誤,這意味着段錯誤 - 再加上你沒有得到任何類型的安全。所以你在C方面做的工作越少越好。

有一些項目可以爲你做一些包裝工作。例如CamlIDL,我認爲Swig對OCaml有一些支持。但我從來沒有使用過這些,所以我無法評論。

如果您知道您希望將接口轉換爲哪種高級語言,那麼可能會有專門的橋接器不需要C步驟。例如,有些庫可以直接與Python表示法(搜索Pycaml,不知道它們是如何進行戰鬥測試)或與Java運行時(OCamlJava項目)進行交互。一個C接口仍然是一個安全的選擇,可以讓其他人爲他們自己的語言搭建橋樑。