【问题标题】:Access native code from my own language使用我自己的语言访问本机代码
【发布时间】:2018-02-22 18:05:09
【问题描述】:

我正在学习构建一种可以编译为字节码的 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));
}

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

对不起,我的英语不好。

【问题讨论】:

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

标签: c++ virtual-machine native-code


【解决方案1】:

假设问题是关于如何在您的 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语言需要调用一个native函数时,它可以在userAccessibleFunctions表中通过函数名查找该函数,如果存在就调用它。 (请注意,我没有在此处包含有关如何处理不同参数类型和返回类型的信息,因为我没有使用 std::function 足够自信地谈论它)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多