【问题标题】:D and C++ currently interoperability statusD 和 C++ 目前的互操作性状态
【发布时间】:2019-04-29 16:09:02
【问题描述】:

我想学D,但是我没有很好地理解一个重要的东西。 目前 C++ 和 D 之间的互操作性状态如何?

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

不同的 C++ 版本(C++98、11、14、17 和未来版本)怎么样?

【问题讨论】:

  • 多年前我最后一次做一些 C++ 和 D 互操作时,我使用 C ABI 来连接两者。 Interfacing to C++ 文档似乎有一些(有限的?)改进。
  • Thwy 都可以与 C 互操作。这是你的(有限)桥。
  • 用例是什么?有一些部分用 D 编写的 C++ 程序?需要使用一些用 C++ 编写的代码的 D 程序?为了好玩而实验?将程序从 C++ 增量移植到 D(反之亦然)?如果用例是“我想学习 D”,我会说:只要学习 D,不要在混合中添加 C++,这只会让你学习 D 的经历变得痛苦。
  • 是的,C ABI 也适用于二进制文件。 @Eljay 目前只是一个实验,但如果实验有效,我可能想使用现有的 C++ 库,尤其是一些使用模板的库
  • 实际上,D 可以在某种程度上与 C++ 二进制文件互操作。它通过复制给定平台上最流行的编译器的约定来做到这一点。所以它本身并不是一个标准,但在很多情况下它确实有效。您可以直接访问一些 C++ 类。但细节在“一些”中 - 特别是,模板仅在它们已经在 C++ 二进制库中实例化时才有效(D 无法读取 C++ 源代码),并且 C++ 类可能需要用 C++ 编写的工厂函数。文档有点差,因为这改变了很多......

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


【解决方案1】:

D 与 C++ 的互操作性在过去几年中得到了显着改善。如果您想了解更多信息,“D 规范”的"Interfacing to C++" 部分是一个好的开始。您可能还想查看“神奇”dpp 项目 - https://code.dlang.org/packages/dpp

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

【讨论】:

  • 它看起来确实很神奇..即使“它目前只支持 C 功能,但计划使用 C++。”希望很快就可以了
【解决方案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++ 开发人员提供一个简单的过渡路径。事实上,所有 3D 编译器(DMD、GDC、LDC)都使用用 D 编写的通用前端,并将其后端(分别为 DMC、GCC、LLVM)暴露给 C++。

TL;DR:

  • 如果您想调用 C++ 并且可以抽出时间在 D 中为您的类/函数编写一些绑定,可以。
  • 如果您无法编写绑定,请继续关注。
  • 如果您想将 D 代码暴露给 C++,那么肯定是的!

【讨论】:

  • 非常感谢您的解释,现在真的很清楚了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多