我有OCaml的经验。你必须为你想用来转换类型的每个函数编写一个存根,即使是C int< - > OCaml int。 连接很痛苦。 我甚至不想要映射C ++对象。
其他流行语言怎么样?总是痛苦吗?
修改
请避免重复。并且分别表示状态C和C ++接口功能。
编辑2:
请具体说明。 “X可以调用C”并不会提供太多信息。
答案 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 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系统。