D和C ++当前互操作性状态

时间:2018-11-27 20:41:09

标签: c++ programming-languages d abi language-interoperability

我想学习D,但是我不太了解重要的事情。 C ++和D之间的当前互操作性状态如何?

我确定不可能链接到C ++编译的二进制文件,因为它甚至不适用于C ++编译器。但是,如果我有C ++库的源代码和一些D源代码,该怎么办?可以让他们说话吗? (希望以一种有效的方式)。

不同的C ++版本(C ++ 98、11、14、17和将来的版本)如何?

2 个答案:

答案 0 :(得分:3)

在最近几年中,与C ++的

D互操作性得到了很大的改善。如果您想了解更多信息,那么“ D规范”的"Interfacing to C++"部分是一个好的开始。您可能还想看看“魔术” dpp 项目-https://code.dlang.org/packages/dpp

我不理解您关于链接的问题...无论您使用Assembly,C,C ++,D或它们的任何组合,链接器都是相同的...您可以链接C ++库,但是您可能无法使用其中的所有内容(取决于库中的内容)。我已经看到一个与Boost库链接的D应用程序。

答案 1 :(得分:2)

我是编译器团队的一员,今年夏天一直在进行C ++互操作,以便与用现代C ++ 14编写的一段C ++代码进行交互。

D很好地支持了C ++,实际上,对于这种大小的语言,它可能是其中最好的支持之一。例如,您可以在C ++中引发从std::exception派生的任何异常,并将其捕获到D端。您可以在D中编写一个类,然后从D中使用它(是否使用虚拟方法),反之亦然。您可以从C ++继承D类,也可以从D继承C ++类。您可以调用实例化的模板化函数!

现在有一些收获:

  • 如果您在C ++中做的不是很惯用,例如抛出int,将是一个问题。
  • C ++代码不应破坏D的类型系统。例如。您不能代表char* const*(指向可变字符的常量指针的指针),因为D的const是可传递的,因此它必须是const char* const*
  • 跨版本支持仍然不是最佳的。当前有C ++ 98和C ++ 11的混合使用,无法控制使用方法。在95%的情况下,这无关紧要,因为D在二进制级别进行接口,并且只关心调用约定和符号修饰。

对于平台,Windows受到了很好的支持(我们有一些游戏开发人员正在使用它)。 POSIX对调用模板函数的支持较新,但对我有用。

仅此而已获得语言支持。围绕它的工具(例如Dejan提到的东西)仍在构建中,业界对它们的兴趣很大,因为D被认为更易于使用,并且可以为C ++开发人员提供便捷的过渡途径。实际上,所有3种D编译器(DMD,GDC,LDC)都使用用D编写的通用前端,并将其后端暴露给C ++(分别为DMC,GCC,LLVM)。

TL; DR:

  • 如果您想调用C ++并且可以节省时间为类/函数在D中编写一些绑定,是的。
  • 如果您无法编写绑定,请继续关注。
  • 如果要将D代码公开给C ++,肯定会的!