哪些高级语言很容易与C / C ++接口?

时间:2009-08-15 13:19:03

标签: c++ c programming-languages

我有OCaml的经验。你必须为你想用来转换类型的每个函数编写一个存根,即使是C int< - > OCaml int。 连接很痛苦。 我甚至不想要映射C ++对象。

其他流行语言怎么样?总是痛苦吗?

修改

请避免重复。并且分别表示状态C和C ++接口功能。

编辑2:

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

16 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:8)

主流语言及其C接口有不同程度的乐趣。很高兴,你可以使用SWIG来获取大部分内容。

答案 2 :(得分:7)

几乎所有脚本语言(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;))。

答案 3 :(得分:5)

这个问题已经存在了20多年。解决它的最先进技术是定义接口定义语言或IDL。然后,您有一个工具可以自动生成您手动编写的函数。 另一个常用术语是外部函数接口或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 和相关工具。

答案 4 :(得分:3)

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

答案 5 :(得分:3)

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

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

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

答案 6 :(得分:3)

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

答案 7 :(得分:3)

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

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

在这种情况下,

Falcon 是Python的一个很好的替代品(在C ++中嵌入高级语言):http://falconpl.org
它设计用于C ++,甚至标准库也用C ++实现。

当我想要包含标题并使用脚本语言时,我也想使用 ChaiScript http://chaiscript.org 它被设计为仅标题,并且可以轻松集成到C ++代码中。实际上它只能用于C ++。

两者都是高级语言。 Falcon看起来更像Python和Ruby,但有利于提出比这两种更多的编程范例。 Chaiscript看起来像一个简化的C ++,因此它可能不是那些不熟悉这种语法的人的最佳选择,但是它很容易绑定到你真正的C ++代码。猎鹰也是,但不是以同样的方式,语法对非程序员来说更容易。

答案 8 :(得分:2)

Java有一个很好的JNI原生接口,C#有一些非常相似的东西。

答案 9 :(得分:1)

D designed很容易与C接触。

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

答案 10 :(得分:1)

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

我连接了一次FORTRAN库。我会告诉你更多,但现在是我午睡的时候了。

答案 13 :(得分:0)

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

答案 14 :(得分:0)

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

link:http://www.lua.org/

答案 15 :(得分:0)

Common Lisp实现通常会有一个与C一起工作的FFI。好处是你不必编写任何C代码来使用C库;你需要做的就是编写C函数的声明是Lisp。

Factor已从Lisp复制此FFI系统。