哪些语言将在没有显式桥接的情况下调用C++

Which languages will call C++ with no explicit bridging?

本文关键字:桥接 情况下 C++ 调用 语言      更新时间:2023-10-16

在开发新产品时,我们决定将C++和C#混合使用,并被告知桥接它们以允许C#代码调用C++代码会很容易(剧透,事实并非如此)。

我们是经验丰富的C++程序员,而不是C#程序员,所以我们几乎只能相信我们所读到的。尝试调用C和Objective-C是有希望的,我们甚至发现了一些文章,展示了如何在C#中提供非托管C++类——或者至少我们认为是这样。文章中的C++代码不是C++,而是微软认为是C++的可怕怪物C++/CLI。由于我们在macOS和Windows中做C#的事情是为了"免费"获得一些比特,C++/CLI也不是一个选项:-(.

不管怎样,很多人都声称从某种特定的编程语言调用C++代码很容易,但到目前为止,我还没有看到一个允许我这样做的代码(我没有太多关注这一点,所以请给我一个明显的例子)。C++总是指完全没有C++内容的C;没有名称空间、类、stl、lambdas或任何东西。只是愚蠢的C.

那么,除了C++(/CLI)之外,还有任何语言允许我执行以下操作吗:

  1. 使用C++构造函数创建一个类的实例,并使用C++析构函数对其进行调度。

  2. 使用C++类调用对象(foo f; f.foo();)上的成员函数。

  3. 使用stl中的std::vectorstd::find_ifstd::string和其他内容。不需要对stl进行全面覆盖。

  4. 使用过载功能(即f()f(int)f(std::string))

  5. 使用过载运算符(foo operator + (foo, foo))

  6. 使用C++11、C++14和/或C++17功能。

  7. 使用RAII(相当重要的IMHO)。

  8. 使用命名空间。

否。没有这样的语言。

除非你计算Objective-C++。但这与C++/CLI几乎是同一个桶,因为它是带有一些扩展的C++。而C++/CX就是另一个这样的野兽。

有一些互操作工具可以与C++类(例如SWIG)一起使用,但我从未听说过能够根据需要实例化C++模板(如vector或find_if)的工具。

哪些语言将在没有显式桥接的情况下调用C++?

这个问题的简短答案是:

请记住,编程语言是在一些技术报告中编写的规范,通常是用英语编写的。例如,读取n1570(C11的规范)或R5RS(Scheme的规范)。有关C++,请参见n3337。

实际上,您对实现很感兴趣,例如您的编程语言的编译器和解释器。这些实现实际上是软件。然后答案可能会变成:这取决于(特别是编译器和系统使用的ABI和目标)。

有关Linux ABI列表的示例,请参阅。

许多人声称,从某种特定的编程语言调用C++代码很容易

C调用约定非常常见,将每个可从外部调用的C++函数声明为extern "C"可能会有所帮助。但有没有银弹,细节很重要。

那么,除了C++(/CLI)之外,还有什么语言可以让我做以下事情吗:

跳过的C++功能列表

可能不会。

您可能至少需要更多地了解内存管理方法。我建议更多地了解垃圾收集,例如阅读GC手册(至少了解基本概念和术语)。了解更多关于外部函数接口(在某些情况下,libffi可能会有所帮助)和语言绑定的信息。

您还可以考虑生成一些C++或C胶代码,可能使用SWIG(或者编写自己的C++胶代码生成器)。

在提供能够在运行时加载插件的动态链接的操作系统上(例如,具有dlopen(3)/dlsym(3)的Linux;但其他操作系统通常具有类似的功能),您甚至可以考虑在运行时的某个临时文件中生成一些C或C++粘合代码,将其编译为临时插件,并动态加载该插件。您还可以考虑JIT编译库,如GCCJIT或LLVM(或libjit)。

我建议你读SICP,龙之书,也许还有《小里斯本》。当然,学习一些操作系统的知识,例如操作系统:三个简单的部分。阅读链接器和加载程序也会有所帮助。

作为一个巧妙地粘合C++的优秀例子,看看CLASP,看看这个视频。

但无论你采取什么方法,你都需要大量的工作(几年,而不是几周)。

C++作为一种语言没有定义的ABI(应用程序二进制接口),这基本上意味着在任何给定的平台上或跨平台上,都没有通用的标准来说明C++类/函数调用/模板的二进制形式。

这意味着,在不同的平台上,甚至在同一平台上的编译器之间,不存在从其他语言调用C++代码的通用方法。这也意味着,那些告诉你"从XYZ语言调用C++代码很容易"的人大多是不正确的(或者至少是令人难以置信的不完整)。

有接口的地方要么是因为接口的提供者控制ABI(带有.NET的C++/CLI),要么是因为有一个从C++到类似C调用约定(Boost::python)的转换层。

已经做了一些工作来尝试定义每个平台的ABI(http://open-std.org/JTC1/SC22/WG21/docs/papers/2014/n4028.pdf),但据我所知,它还没有被C++17所接受。

您可以研究使用C++解释器,它允许您要求的细粒度控制。但我不知道有什么"只是有效的",另请参阅:您使用过任何C++解释器(而不是编译器)吗?

D编程语言非常close:https://dlang.org/spec/cpp_interface.html