连接语言
我之前在StackOverflow上问过一个问题,想知道用什么语言来做AI原型。大家的意见是,如果我想要速度快,就应该用像Java或C++这样的语言,但如果是做界面部分,Python、Perl或Ruby会比较合适。
这让我又有了一个新问题:把这些语言连接在一起有多简单?哪种组合效果最好?比如说,如果我想用Ruby写一个CGI程序,然后调用C++或Java的AI功能,这样做容易吗?有没有什么地方可以找到相关的信息?或者说,换一种组合会更好?
我之前写网页应用的经验是从C++的CGI开始的,后来转到Java的servlet(大约10年前),然后在离开编程一段时间后又接触了一些PHP。不过,我没有用脚本语言写网页应用,然后再调用编译语言来处理速度关键部分的经验。所以任何建议都非常欢迎!
9 个回答
我同意先用高级语言,比如Python,来编写代码,然后再找出需要加速的部分,用C或C++来实现,并把这些部分封装起来,以便在高级语言中使用。
作为Boost的替代方案,我想推荐SWIG,它可以让你从C代码创建可以在Python中调用的代码。使用起来相对简单,而且它能为多种语言编译可调用的模块,比如Python、Ruby、Java、Lua等等。
这个封装过程是半自动的,所以你不需要在基础的C代码中添加新函数,这样工作流程会更加顺畅。
首先,有个小建议:我强烈推荐你用高级语言来编写整个程序,疯狂地进行性能分析,然后只在分析结果显示有必要的地方进行优化。首先优化算法,然后优化代码,最后再考虑使用更底层的语言。拥有一个最佳的算法和干净的代码,会让你在需要用低级语言重新实现时轻松很多。
如果说到Python,IronPython和C#可能是最简单的优化路径。
用C++来优化CPython也是可行的,但我觉得用C会更容易一些(虽然C也不是特别简单)。有两个工具可以帮助你:cython和pyrex(用于C),还有shedskin(用于C++)。这些工具可以把Python代码编译成C或C++,这样你就可以比较方便地使用C/C++的库了。
我自己没用过jython,但听说jython和Java的优化路径也还不错。
Boost.Python 是一个很方便的工具,可以把C++代码变成Python模块。这个工具已经很成熟了,我用过之后觉得效果不错。
比如说,大家都知道的“你好,世界”...
char const* greet()
{
return "hello, world";
}
可以通过写一个Boost.Python的包装器来让它在Python中使用:
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(hello_ext)
{
using namespace boost::python;
def("greet", greet);
}
就这样,我们完成了。现在我们可以把它构建成一个共享库。生成的DLL文件现在可以被Python识别。下面是一个Python的示例会话:
>>> import hello_ext
>>> print hello.greet()
hello, world
(这个例子来自boost.org)