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

6
我想学习D语言,但是有一件重要的事情我还没有理解清楚。目前C++和D之间的互操作性状态如何?我确定不可能链接到C++编译后的二进制文件,因为它甚至无法与C++编译器一起使用。但如果我有一个C++库的源代码和一些D源代码,它们之间是否可以相互通信?(希望以高效的方式)。不同的C++版本(C++98、11、14、17和未来版本)呢?

2
很多年前我做C++和D语言的互操作时,使用了C ABI来桥接两者。根据与C++交互文档,似乎有一些(有限的?)改进。 - Eljay
2
它们都可以与C语言互操作。这就是你(有限的)桥梁。 - Jesper Juhl
1
有什么用例呢?是一个部分使用D语言编写的C++程序?还是需要使用某些用C++编写的代码的D程序?或者只是为了好玩的实验?还是从C++逐步移植到D(或反之)?如果用例是“我想学习D语言”,那么我会建议:只需学习D语言,不要加入C++,这只会让你学习D语言的体验变得痛苦。 - Eljay
没错,对于二进制文件来说,C ABI也可以。@Eljay目前只是一个实验,但如果实验成功,我可能会想使用现有的C++库,特别是一些使用模板的库。 - Duns
1
实际上,D语言可以在一定程度上与C++二进制文件进行互操作。它通过复制给定平台上最流行的编译器的约定来实现这一点。因此,它本身不是一个标准,但在许多情况下确实有效。您可以直接访问一些C++类。但是细节在于“某些” - 特别是,只有在C++二进制库中已经实例化的模板才能工作(D无法读取C++源代码),并且C++类可能需要在C++中编写工厂函数。文档有点差,因为这经常发生变化... - Adam D. Ruppe
非常感谢。我理解并且认为它的变化很正常。我希望未来对于D语言会非常美好,因为它看起来是一门很棒的语言。 - Duns
2个回答

8
近年来,D与C++的互操作性有了显著提升。如果您想了解更多信息,请参阅"D规范"中的"与C++接口", 这是一个很好的起点。您还可以查看"神奇的"dpp项目 - https://code.dlang.org/packages/dpp
关于链接方面的问题,我不明白...无论您使用汇编、C、C++、D或它们的任何组合,链接器都是相同的...您能够链接C++库,但您可能无法使用库中的所有内容(这取决于库中的内容)。例如,我见过使用D应用程序链接Boost库的情况。

1
看起来确实很神奇...即使“它目前仅支持C功能,但计划支持C ++。”希望很快会实现。 - Duns

7

我是编译器团队的一员,这个夏天一直在为与使用现代C++14编写的C++代码进行交互的D语言进行改进。

C++在D语言中得到了很好的支持,事实上,它可能是所有大型语言中支持最好的语言之一。例如,您可以在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)。

简而言之:

  • 如果您想调用C++并可以花时间为您的类/函数编写一些绑定,请使用D语言。
  • 如果您无法编写绑定,请等待。
  • 如果您想将D代码公开给C++,那么绝对可以!

1
非常感谢您的解释,现在非常清楚了。 - Duns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接