编程语言如何调用用另一种语言编写的库?

时间:2013-07-08 00:13:00

标签: c language-agnostic language-design

我想编写一个“简单”的编程语言,它可以调用用C编写的函数。例如,我想将该语言与套接字库集成。

从自定义编程语言调用C函数的最简单方法是什么?


注意:这与How do multiple-languages interact in one project?类似,但我希望此问题更多地关注设计语言的最简单方法,以实现互操作性。

2 个答案:

答案 0 :(得分:3)

<强> 1。艰难,普遍和“一次编写,随处运行”的方法:

您的编程语言强制用户以某种方式提供要使用的C函数的声明(以及它们的实现,很可能是动态可链接/可加载的库)。您的编程语言解析器/编译器/解释器解释函数签名,并可能使用外部函数接口库(例如libFFI)来进行遵循平台的ABI和C调用约定的调用。这样就可以在你的语言中调用任何C函数,而无需编写绑定。

此方法用于一些编程语言,例如PyObjC是一个库,使Python程序员可以直接从Python调用Objective-C API。

<强> 2。简单,不均匀接近通用和“尽可能多地写你想要使用它”的方式:

您需要使用您的编程语言的用户编写C扩展函数,并在之前指定签名,即。即所有编程语言扩展应该看起来像

GenericValueType *extension_function(int argc, GenericValueType **argv);

然后,想要将其他代码连接到编程语言的人必须使用函数和编程语言的专用API编写绑定。例如,如果您想使用C标准库中的strlen()函数,您可以编写此(伪码)代码:

GenericValueType *my_ext_strlen(int argc, GenericValueType **argv)
{
    GenericValueType *arg1 = argv[0];
    const char *input = ValueToCString(arg1);
    size_t len = strlen(input);
    return NewValueFromInteger(len);
}

这对于语言的创建者来说更容易实现,但正如我之前提到的那样,它并不是通用的 - 每个函数都必须绑定/移植才能兼容。这是大多数脚本语言采用的方法,例如Python,PHP和Lua需要以这种方式编写外部库的绑定。

答案 1 :(得分:1)

这个答案可能看起来太明显了,但这是事实:语言可以通过生成(某种方式)并执行C程序用来调用相同函数的相同机器指令来调用C中的函数。如果你的新语言有一个发出机器代码的编译器,它实际上可以被设计为使用相同的调用约定作为所有内容的C,这样它不仅可以轻松调用C函数,而且C代码可以轻松调用以您的语言编写的函数。

Here是一个Wiki页面,其中包含有关用于在x86处理器上调用C(和其他语言)函数的标准机制的信息;一些研究将为您感兴趣的其他处理器和架构提出类似的约定。