2009-07-22 40 views
3

現在我正在研究一種還沒有FFI的腳本語言。我想知道什麼是最方便的方法來實現它,假設我想寫它像酷極客 - 我想寫FFI在腳本語言本身。實現外部函數接口的指南

我需要接口的編程語言是C.所以基本知識我知道libdl.so是我最好的朋友。顯然,這不是我唯一需要的東西,而是最重要的東西。

我只有輕微的想法,我還需要什麼。我想從FFI中獲得與python ctypes類似的行爲。

爲了實現這一目標,我需要了解什麼?我知道我需要處理的數據結構有一些嚴重的魔法。我如何管理它,以便我可以在腳本語言本身中完成大部分嚴重的魔術?除了外部函數接口之外,我還會使用這種魔術。例如,我可能想要將類C二進制數據傳遞給文件。

回答

3

我認爲一個適當的答案需要detailed essay

基本上,應該有主機操作系統提供的庫加載和符號搜索工具的包裝。如果您的語言的核心數據類型在內部由單個C數據結構表示,那麼可以要求庫開發人員將導出的C函數的參數和返回類型作爲該數據結構的對象。這將使數據交換更容易實施。如果您的語言具有某種形式的模式表達式和第一類函數,那麼C函數的簽名可能會以模式寫入,並且庫會搜索與等效簽名匹配的函數。下面是C函數的一些僞代碼及其在腳本中的用法:

/* arith.dll */ 
/* A sample C function callable from the scripting language. */ 

#include "my_script.h" // Data structures used by the script interpreter. 

My_Script_Object* add(My_Script_Object* num1, My_Script_Object* num2) 
{ 
    int a = My_Script_Object_To_Int(num1); 
    int b = My_Script_Object_To_Int(num2); 
    return Int_To_My_Script_Object(a + b); 
} 

/* End of arith.dll */ 

// Script using the dll 
clib = open_library("arith.dll"); 

// if it has first-class functions 
add_func = clib.find([add int int]); 
if (cfunc != null) 
{ 
    sum = add_func(10, 20); 
    print(sum); 
} 

// otherwise 
print(clib.call("add", 10 20)); 

這裏不可能討論更多的實現細節。需要注意的是 我們還沒談到垃圾收集什麼,等

可在下列鏈接的來源可以幫助你進一步移動:

http://common-lisp.net/project/cffi/ http://www.nongnu.org/cinvoke/

+0

謝謝。即使所描述的事情最簡單,它也會迫使我將C部分寫入綁定。我認爲這是不能接受的我的需要。 – Cheery 2009-07-23 06:57:05

1

退房http://sourceware.org/libffi/

請記住,調用約定在不同的體系結構上會有所不同,即,哪些順序函數變量會彈出到堆棧中。我不知道用自己的腳本語言編寫它,我知道Java JNI使用libffi。