从我自己的语言访问本机代码

Access native code from my own language

我正在学习构建一种可以编译为字节码的 OOP 语言,然后使用以 C++ 实现的基于堆栈的 vm 对其进行解释。我的问题是如何用我自己的语言调用本机函数(在我的例子中是 C++ 函数)。

比如我有一个c++文件:native.cpp

float div2(int x) {
    return float(x) / 2;
}

用我的语言调用函数:

import native

void main() {
    int foo = 1234;
    print(native.div2(foo));
}

如果我创建一条新指令,我必须重新构建整个解释器。

对不起,我的英文不好

假设问题是关于如何向 OOP 语言添加函数调用,而不必在每次添加另一个本机函数时都向解释器编写一堆 use-case-specific 支持代码...一种方法这将是编写一个通用的 function-calling 接口,其中包含按名称注册的本机函数。例如,您的 C++ 文件可能包含一个 std::map,它(在 initialization-time 处)填充了允许 OOP 语言调用的各种函数的名称,例如:

std::map<std::string, std::function> userAccessibleFunctions;

int main(int argc, char ** argv)
{
   userAccessibleFunctions["div2"] = div2;
   [... add other functions here...]

   // the rest of your program's startup-and-run code here
}

...那么当你的OOP语言需要调用一个native函数的时候,它可以在userAccessibleFunctionstable中通过函数名查找这个函数,如果存在就调用它。 (请注意,我没有在此处包含有关如何处理不同参数类型和 return 类型的信息,因为我还没有充分使用 std::function 来自信地谈论它)

我建议您查看 libffi (https://sourceware.org/libffi/) 以及如上所述的函数注册方案。注册处理调用的内容,而 libffi 部分处理调用方式。