D 和 C++ 目前的互操作状态

D and C++ currently interoperability status

我想学D,但是有一个重要的东西没弄明白。 C++ 和 D 之间的当前互操作性状态如何?

我确信 link 到 C++ 编译的二进制文件是不可能的,因为它甚至不能与 C++ 编译器一起工作。但是,如果我有 C++ 库的源代码和一些 D 源代码怎么办?有没有可能让他们说话? (希望以一种有效的方式)。

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

D 与 C++ 的互操作性在过去几年中得到了显着改进。 "Interfacing to C++" section of the "D Specification" is a good start if you want to learn more.You may also want to look at the "magical" dpp project - https://code.dlang.org/packages/dpp .

我不明白你关于 linking 的问题...无论你使用汇编、C、C++、D 还是它们的任意组合,linker 都是一样的。 .. 您 能够 link C++ 库,但您可能无法使用其中的所有内容(取决于库中的内容)。例如,我见过 D 应用程序 link 针对 Boost 库进行编辑。

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

C++ 得到了 D 的很好支持,事实上,对于这种规模的语言,它可能拥有最好的支持之一。例如,您可以在 C++ 中抛出从 std::exception 派生的任何异常并在 D 端捕获它。您可以在 D 中编写一个 class 并从 D 中使用它(无论是否为虚方法),反之亦然。您可以从 C++ subclass a D class,也可以从 D subclass a C++ class。您可以调用实例化的模板函数!

现在,有几个问题:

  • 如果你正在做一些 C++ 中不太惯用的事情,例如throwing 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 编写的通用前端,并将其后端(分别为 DMC、GCC、LLVM)暴露给 C++。

长话短说:

  • 如果您想调用 C++ 并且可以腾出时间在 D 中为您的 classes/函数编写一些绑定,是的。
  • 如果您不会写绑定,敬请期待
  • 如果您想将 D 代码公开给 C++,那是肯定的!