我正在学习构建一种可以编译为字节码的 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));
}
如果我创建一条新指令,我必须重新构建整个解释器。
对不起,我的英语不好。
假设问题是关于如何将函数调用添加到您的 OOP 语言,而不必在每次添加另一个本机函数时向解释器编写一堆特定于用例的支持代码……一种方法是编写具有按名称注册的本机函数的通用函数调用接口。例如,您的 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 来自信地谈论它)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句