2009-07-22 19 views
3

今、私はまだFFIを持たないスクリプト言語に取り組んでいます。私はそれを入手する最も便利な方法が何であるかを知りたいのですが、クールなオタクのように書いてみたいと思っています。スクリプト言語自体にFFIを書いてみたいです。外国関数インターフェイスを実装するためのガイド

インターフェイスに必要なプログラミング言語はCです。基本については、libdl.soは私の親友です。明らかに、私が必要とするのは唯一のものではなく、それらの中で最も重要なことです。

他に何が必要なのかについて少しだけ考えています。私はPythonのctypesと同じような動作をFFIから得たいと思っています。

これまでに何を知る必要がありますか?私は対処する必要があるデータ構造を持つ深刻な魔法があることを知っています。スクリプト言語自体でその真剣な魔法の大部分をやることができるように、どうすればそれを管理できますか?私はそのような魔法から、外国の関数のインターフェースだけでなく、それ以上のものを使っています。例えば、私はCのようなバイナリデータをファイルに渡すことができます。

答えて

3

適切な回答にはdetailed essayが必要です。

基本的には、ホストOSによって提供されるライブラリのロードとシンボル検索機能のためのラッパーが必要です。言語のコアデータ型が内部的に単一の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

+0

この質問に投稿されたリンクは今すぐ破損しているようです - なぜですか? –

1

http://sourceware.org/libffi/

をチェック呼び出し規約は、異なるアーキテクチャー上で異なる、つまり関数変数がスタックにポップされる順番が異なることを忘れないでください。あなた自身のスクリプト言語で書いているのかどうかわかりませんが、Java JNIがlibffiを使っていることはわかります。

関連する問題