【问题标题】:What high level languages are easily interfaced with C / C++?哪些高级语言易于与 C/C++ 交互?
【发布时间】:2012-02-03 01:34:05
【问题描述】:

我有使用 OCaml 的经验。您必须为要用于转换类型甚至 C int OCaml int 的每个函数编写一个存根。 连接是痛苦的。 我什至不想考虑映射 C++ 对象。

其他流行语言呢?总是很痛苦吗?

编辑:

请避免重复。并分别说明 C 和 C++ 接口功能。

编辑 2:

请具体说明。 “X 可以调用 C”并没有提供太多信息。

【问题讨论】:

  • 它不是高级语言,但 ASM 接口非常适合 C 和 C++! :-)。我可以给您的另一个建议是,当您在将 C/C++ 代码与 Python 代码链接时遇到太多麻烦时,您总是可以为您的 C/C++ 代码创建一个不错的 DLL。有些人也喜欢 COM dll。
  • C++ 高级语言,万一它不是简单一个

标签: c++ c programming-languages


【解决方案1】:

Python 有一个非常好的 C API。使用 Python C API 的 boost::python C++ 绑定,它也可以非常轻松方便地集成到 C++。

【讨论】:

【解决方案2】:

在主流语言及其 C 接口中有不同程度的乐趣。很高兴,您可以为大多数人使用SWIG

【讨论】:

    【解决方案3】:

    几乎所有的脚本语言(Perl、Python、Lua、PHP、Ruby、Tcl)都旨在嵌入到 C 和 C++ 中。

    一份关于 API 相对优点的优秀调查报告:

    H. Muhammad and R. Ierusalimschy. C APIs in extension
    and extensible languages. Journal of Universal Computer
    Science, 13(6):839–853, 2007.
    

    另见very similar question(和my answer in particular ;))。

    【讨论】:

    • 我喜欢语法高亮:)
    • Skilldrick:我也是。我想知道为什么会这样:meta.stackexchange.com/questions/14664/…
    • -1 : "设计为嵌入到 C 和 C++ 中。"除了 Lua 之外,所有引用的语言都是错误的(例如,这不是事实)。只有 Lua 是为此而设计的,其他的都可以进行调整。嵌入一​​种旨在嵌入的语言和嵌入一种并非主要设计目标的语言的过程存在很大差异。
    • 克莱姆:我同意。我无意说这是所有这些语言的初衷。对许多人来说,这成为后来生活的明确目标。然而,将所有这些语言嵌入到 C 中是一个目标。我认为添加了更好的措辞。
    • 抱歉 Klaim,Tcl 从一开始也被设计为可嵌入 C 语言 - 请参阅 tcl.tk/about/history.html
    【解决方案4】:

    20 多年来,这个问题一直很重要。解决这个问题的最先进技术是定义一个接口定义语言或IDL。然后,您将拥有一个工具,该工具可以自动生成您过去手动编写的那些函数。 另一个常用的术语是 foreign-function interface 或 FFI。

    不幸的是,它们中的大多数都不是很好。个人经验:

    • tolua 和 SWIG 不值得用于 Lua 和 C;手动编写绑定函数更容易。特别是 tolua 的 IDL 几乎是但不完全是 C 头文件,因此您最终需要维护每个声明的两个版本。

    • tolua++ 可能值得用于​​绑定 Lua 和 C++ - 手动模拟 C++ 对象的麻烦值是相当大的。

    • SWIG 涵盖了很多语言,但我一直觉得它很难用。

    从阅读其他人的经验:

    • Glasgow Haskell Compiler 似乎有最好的外部函数接口,如果我没记错的话,IDL 非常简单:你只需提供你试图导入的 C 函数的 Haskell 类型。

    • Standard ML of New Jersey 似乎也有一个相当不错的外部函数接口; BABEL-01 上有一篇关于它的论文。

    对于任何想要与 C 互操作的给定语言,您应该询问外部函数接口询问是否有 IDL 和相关工具。 p>

    【讨论】:

    • SWIG 可能会很痛苦,但它的好处是只需学习一次。
    【解决方案5】:

    Python 有一个很棒的 C 接口,使用内置的 ctypes 模块。 为了连接 C++ 模块,可以使用 SWIG。

    【讨论】:

      【解决方案6】:

      您可能会喜欢这个recent comp.compilers thread 关于各种外来函数接口的内容。有人建议 Haskell 拥有最好的之一。

      【讨论】:

        【解决方案7】:

        Python 是一种功能强大且易于学习的高级语言,并且具有使用 C 和 C++ 扩展它的良好文档:

        http://docs.python.org/extending/extending.html

        使用这种方法很简单,但您需要为 Python 显式编写扩展。使用 SWIG(请参阅 Extending Python with C++ 以获得一个不错的小教程),您可以创建 C/C++ 代码,就好像它要自己运行一样,加上一个 SWIG 用来为您创建一些可以在 Python 中使用的包装代码的接口文件(或其他语言,就此而言)。

        【讨论】:

        • 现在 Boost.Python 不是被更多人考虑了吗?
        • pybind11 如今让创建 python 绑定变得轻而易举。它是对 boost::python 的重写。
        【解决方案8】:

        在这种情况下我不会使用 Python,即使有 Boost.Python 来帮助嵌入它。甚至 Python 人也说,将 C 嵌入 Python 比其他方式更有意义,这仅仅是因为 Python 不是为嵌入而设计的。

        我喜欢使用专门用于嵌入 C++ 或 C 的语言,例如 LuaFalconChaiScript。但是,我也喜欢提供完整的语言。如果我想在严格的限制下编写应用程序(例如控制台上的游戏),我更喜欢使用专为此设计的 Lua。否则,我更喜欢使用 FalconChaiScript

        Falcon 在这种情况下是 Python 的一个很好的替代品(在 C++ 中嵌入高级语言):http://falconpl.org
        它旨在与 C++ 一起使用,甚至标准库也是用 C++ 实现的。

        当我只想包含标题并使用脚本语言时,我也喜欢使用 ChaiScripthttp://chaiscript.org 它被设计为仅作为头文件,并且很容易集成到 C++ 代码中。事实上,它只适用于 C++。

        两者都是高级语言。 Falcon 看起来更像 Python 和 Ruby,但其优势在于提出比这两者更多的编程范式。 Chaiscript 看起来像一个简化的 C++,因此对于不习惯这种语法的人来说,它可能不是最佳选择,但它很容易绑定到你真正的 C++ 代码。 Falcon 也是,但方式不同,而且语法对非程序员来说更容易。

        【讨论】:

          【解决方案9】:

          Java 与 JNI 有一个很好的本机接口,C# 有一个非常相似的东西。

          【讨论】:

          • JNI 非常好...试试 JNA
          • 哦,如果 JNI 不再是“流行”的东西,我们深表歉意;自从我上次使用 Java 已经 8 年了:P
          • @lukasz 在什么意义上?在 JNI(可能还有 JNA)和 C# 中,您只需将函数的标头编写为“extern ...”,然后适当地调用它。您还在寻找什么?
          • @Lukasz:我认为@dfa 暗示了 JNI 难以使用的事实。如果您在使用 JNI 时出错,则可能会导致 JVM 崩溃。
          • 好吧,我从来没有使用过 JNI。标准问题是: - 基本参数类型兼容性 - 更复杂的类型,如结构 - 重载 - 对象传递 - 变量参数函数等 链接至少是可用的。
          【解决方案10】:

          Ddesigned 以便于与 C 接口。

          D 2.0 确实有一个 limited interface 到 C++ 代码。

          【讨论】:

            【解决方案11】:

            R 可以通过 C、C++ 和 Fortran 进行扩展,这在 R Extensions Manual 中进行了描述,而贡献的 Rcpp 包使调用 C++ 函数变得更加容易。

            【讨论】:

              【解决方案12】:

              与 C++ 对象交互总是很痛苦,因为没有标准的 ABI(二进制接口)。

              【讨论】:

              • 好吧。我猜你说的是虚函数。没有它们你可以做很多事情。
              • 只要您使用的接口处理调用约定、布局等,而不是强迫您(程序员)这样做,应该没问题。
              • 如果你可以与 ELF 交互,你应该能够相对容易地与 C++ 对象交互。
              【解决方案13】:

              我一次链接了 FORTRAN 库。我会告诉你更多,但我该睡午觉了。

              【讨论】:

                【解决方案14】:

                Tcl可以调用C/C++代码

                【讨论】:

                  【解决方案15】:

                  Lua 与 C(以及扩展为 C++)的集成能力绝对是一流的。它也是一种美妙的小语言。我认为它几乎得到了应有的爱。

                  链接:http://www.lua.org/

                  【讨论】:

                    【解决方案16】:

                    Common Lisp 实现通常会有一个与 C 配合得很好的 FFI。好处是您不必编写任何 C 代码即可使用 C 库;你需要做的就是把C函数的声明写成Lisp。

                    Factor 从 Lisp 复制了这个 FFI 系统。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2014-12-05
                      • 2011-02-07
                      • 2013-01-30
                      • 2011-11-11
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多