Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从我自己的语言访问本机代码 我正在学习构建一个可以编译到字节码的OOP语言,然后用C++实现的基于堆栈的VM来解释它。我的问题是如何用自己的语言调用本机函数(在我的例子中是C++函数)。 例如,我有一个C++文件:NET.CPP float div2(int x) { return float(x) / 2; }_C++_Virtual Machine_Native Code - Fatal编程技术网

从我自己的语言访问本机代码 我正在学习构建一个可以编译到字节码的OOP语言,然后用C++实现的基于堆栈的VM来解释它。我的问题是如何用自己的语言调用本机函数(在我的例子中是C++函数)。 例如,我有一个C++文件:NET.CPP float div2(int x) { return float(x) / 2; }

从我自己的语言访问本机代码 我正在学习构建一个可以编译到字节码的OOP语言,然后用C++实现的基于堆栈的VM来解释它。我的问题是如何用自己的语言调用本机函数(在我的例子中是C++函数)。 例如,我有一个C++文件:NET.CPP float div2(int x) { return float(x) / 2; },c++,virtual-machine,native-code,C++,Virtual Machine,Native Code,和func调用(以我的语言): import native void main() { int foo = 1234; print(native.div2(foo)); } 如果我创建一条新指令,我必须重新构建整个解释器 抱歉,我的英语不好。假设问题是关于如何向OOP语言添加函数调用,而不必在每次添加另一个本机函数时向解释器编写大量特定于用例的支持代码。。。一种方法是编写一个通用函数调用接口,使用按名称注册的本机函数。例如,C++文件可以包括一个STD::MAP(在初始化时)

和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
}
std::map useraccessibleffunctions;
int main(int argc,字符**argv)
{
userAccessibleFunctions[“div2”]=div2;
[…在此处添加其他函数…]
//程序的其余启动和运行代码都在这里
}

。。。然后,当OOP语言需要调用本机函数时,它可以在userAccessibleFunctions表中按其名称查找该函数,如果该函数存在,它可以调用该函数。(请注意,我没有在这里介绍如何处理不同的参数类型和返回类型,因为我还没有充分使用std::function来自信地谈论这一点)

我建议您查看libffi()以及如上所述的函数注册方案。注册处理的是什么通话,而libffi部分处理的是如何通话。

你的英语很好。不清楚的是你的问题。如果您想从您的语言中调用本机代码,则需要有一些已定义的机制,这些机制用字节码表示(例如适当的指令),您的vm可以理解。您可能想使用,但您的问题不清楚(您的英语很好)。您还可以使用从函数名中查找函数