1

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

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


注意:这类似于多语言如何在一个项目中交互?,但我希望这个问题更多地关注设计互操作性语言的最简单方法。

4

2 回答 2

3

1. 硬性、通用性和“一次编写,到处运行”的方法:

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

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

2. 简单的,甚至不是接近通用的和“写多少次就写多少次”的方式:

您要求您的编程语言的用户使用预先指定的签名编写 C 扩展函数,即所有编程语言扩展应该看起来像

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

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

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 需要以这种方式编写外部库的绑定。

于 2013-07-08T00:22:33.293 回答
1

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

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

于 2013-07-08T00:18:03.210 回答