哪些语言将在没有显式桥接的情况下调用C++
Which languages will call C++ with no explicit bridging?
在开发新产品时,我们决定将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)之外,还有任何语言允许我执行以下操作吗:
-
使用C++构造函数创建一个类的实例,并使用C++析构函数对其进行调度。
-
使用C++类调用对象(
foo f; f.foo();
)上的成员函数。 -
使用stl中的
std::vector
、std::find_if
、std::string
和其他内容。不需要对stl进行全面覆盖。 -
使用过载功能(即
f()
、f(int)
、f(std::string)
) -
使用过载运算符(
foo operator + (foo, foo)
) -
使用C++11、C++14和/或C++17功能。
-
使用RAII(相当重要的IMHO)。
-
使用命名空间。
否。没有这样的语言。
除非你计算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
- 在不知道套接字的情况下关闭网络连接
- UDP 套接字 select() 在某些情况下无延迟(超时)返回 1
- 如何在不设置 ulimit -n 的情况下解决套接字程序打开太多文件的错误
- 在这种情况下,GCC 和 clang 是否显示与 Visual Studio 相同的结果,关于语言链接?
- 如何在没有套接字管理的情况下使用OpenSSL库?
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 在没有额外代码的情况下链接两个独立类的最通用方法是什么?
- 我可以在不包含 <sys/socket.h> 的情况下使用 C 套接字吗?
- 如何在不泄漏内存的情况下删除链接列表
- 哪些语言将在没有显式桥接的情况下调用C++
- 默认情况下,constexpr函数具有哪些链接
- 如何在没有CRT的情况下链接OBJ文件
- 如何在没有外部脚本的情况下链接CMake和SQLite
- 无法在不使用RTTI构建LLVM的情况下链接LLVM编译器教程程序
- Eclipse CDT:如何在没有项目清理>>项目重建的情况下重新链接静态库
- 套接字:在没有memcpy的情况下,使用recvfrom将UDP数据获取到字对齐的缓冲区
- 在没有 SO_LINGER > 0 的情况下强制关闭服务器端套接字可能会丢失数据,对吧?
- 如何在没有 sproof 的情况下分析动态链接的库
- 如何在没有递归的情况下删除链接列表
- 在没有CRT,Memcpy和Memset固有函数的情况下链接误差