Haskell 雖然強大,Haskell platform 也帶有許多相當好用的程式庫,然而有時候你會發現它少了些我們想用,但目前只在 C 語言程式庫找得到的功能,(例如 podofo 的 PDF 讀寫功能, clutter 的動畫功能。)或者是不滿意某個 Haskell 程式庫的設計(freetype2 package 沒有 high level binding),這時就會需要利用到 Haskell 的「外語功能界面」(Foreign Function Interface)來讓 Haskell 取用 C 語言程式庫所提供的獨家功能。
為了目前規劃中的需要,我試著使用了 FFI 來讓我的 Haskell 程式呼叫我的 C 程式碼:HERE!
Haskell 的 FFI 簡單來說,由 Foreign 底下的許多模組(module)組成,是 base package 的一部分。它提供了安全記憶體分配、管理、準備了許多 C 語言對應的型別,讓 Haskell 的使用者可以輕鬆的取用 C 語言的功能。
關於 FFI,可以參考 Real World Haskell 的 17章,或是 haskell.org Wiki 上的 FFI cookbook。想看真正複雜的 FFI 應用實例,可以參考glib package,cairo package 等存放在 hackage 裡的 c library haskell binding。
要使用 FFI binding 時,我們通常要寫 hsc 原始檔,而 hsc 原始檔需要經過 hsc2hs 來處理成 haskell 原始碼以及 C 程式(有時會產生出來)。在我的例子裡,我把這個繁複的手續交給 cabal 。如果希望可以看這個繁複手續的內容,可以使用:
cabal configure cabal build -v來檢視。
沒有留言:
張貼留言