现在我的工作是还没有一个FFI的脚本语言。我想知道什么是最方便的方式来得到它,假设我想写像酷爱好者做 - 我想写的FFI脚本语言本身

在编程语言我需要的接口是C.因此,对于基础知识我知道libdl.so是我最好的朋友。显然,这不是我要唯一需要的,但其中最重要的。

我只有大约还有什么,我需要为它轻微的想法。我想从FFI得到类似的行为,什么蟒蛇ctypes的了。

我应该需要才能远远得到这个知道吗?我知道有一个与数据结构的一些严重的魔法我需要去处理。如何管理它,这样我可以做最严重魔术脚本语言本身?我必须从这样的魔术使用的不仅仅是外国功能接口等等。例如我可能想类似C的二进制数据传送到文件。

有帮助吗?

解决方案

我想一个适当的回答需要详细的文章

基本上,应该有库加载和由主机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/

其他提示

查核 http://sourceware.org/libffi/

记住的调用约定将要在不同的体系结构不同,被弹出到堆栈即什么顺序函数变量。我不知道在你自己的脚本语言编写的,我知道Java的JNI使用libffi。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top