我正在学习构建一种可以编译为字节码的OOP语言,然后使用在c ++中实现的基于栈的vm来解释它。我的问题是如何用我自己的语言调用本机函数(在我的例子中是C ++函数)。
例如,我有一个c ++文件:native.cpp
float div2(int x) {
return float(x) / 2;
}
和func用我的语言调用:
import native
void main() {
int foo = 1234;
print(native.div2(foo));
}
如果我创建一个新指令,我必须重新构建整个解释器。
抱歉,我的英语不好。
答案 0 :(得分:1)
假设问题是关于如何向OOP语言添加函数调用,而不必每次添加另一个本机函数时都要向解释器写一堆特定于用例的支持代码......一种方法可以是编写一个通用的函数调用接口,其中包含由name注册的本机函数。例如,您的C ++文件可能包含一个std :: map(在初始化时),其中填充了允许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语言需要调用本机函数时,它可以在userAccessibleFunctions表中按名称查找函数,如果存在,则可以调用它。 (请注意,我不包括有关如何处理不同参数类型和返回类型的信息,因为我还没有使用std :: function来充满信心地谈论它)
答案 1 :(得分:0)
我建议你看看libffi(https://sourceware.org/libffi/)以及如上所述的功能注册方案。注册处理调用的内容,而libffi部分处理如何调用。