我之前问了一个问题,关于用于AI原型的语言.共识似乎是,如果我想要它快,我需要使用像Java或C++这样的语言,但Python/Perl/Ruby对接口位有好处.
所以,这引出了另一个问题.将这些语言链接在一起有多容易?哪种组合效果最好?那么,如果我想要一个调用C++或Java AI函数的Ruby CGI类型程序,那么这很容易吗?我在哪里寻找有关做这类事情的信息的指针?或者不同的组合会更好吗?
我编写Web应用程序的主要经验是从C++ CGI开始,然后转移到Java servlet(大约10年前),然后经过长时间的编程后,我做了一些PHP.但是我没有使用脚本语言编写Web应用程序的经验,然后编写了一个编译语言来获取速度关键位.所以欢迎任何建议!
Boost.Python提供了一种将C++代码转换为Python模块的简便方法.它相当成熟,在我的经验中运作良好.
例如,不可避免的Hello World ......
char const* greet() { return "hello, world"; }
可以通过编写Boost.Python包装器来暴露给Python:
#includeBOOST_PYTHON_MODULE(hello_ext) { using namespace boost::python; def("greet", greet); }
而已.我们完成了.我们现在可以将其构建为共享库.现在可以看到生成的DLL.这是一个Python会话示例:
>>> import hello_ext >>> print hello.greet() hello, world
(来自boost.org的例子)
首先,一个元评论:我强烈建议用高级语言对整个事物进行编码,像疯了一样进行分析,并仅在分析显示必要时进行优化.首先优化算法,然后是代码,然后考虑引入重铁.如果您需要在较低级别的语言中重新实现,拥有最佳算法和干净的代码将使事情变得更加容易.
对于Python来说,IronPython/C#可能是最简单的优化路径.
使用C++的CPython是可行的,但我发现C更容易处理(但并非一切都那么简单,是C).两个缓解这个的工具是cython/pyrex(用于C)和shedskin(用于C++).这些将Python编译成C/C++,从那里你可以访问C/C++库而不需要太多麻烦.
我从未使用过jython,但我听说jython/Java优化路径并不是那么糟糕.
我同意首先使用Python,Profiling等高级语言进行编码,然后实现任何需要在C/C++中加速并将其包装在高级语言中的代码.
作为boost的替代方案,我想建议SWIG从C创建Python可调用代码.它使用起来相当轻松,并且将为各种语言编译可调用模块.(Python,Ruby,Java,Lua.仅举几例)来自C代码.
包装过程是半自动化的,因此无需向基本C代码添加新功能,从而使工作流程更加顺畅.
如果选择Perl,则有足够的资源来连接其他语言.
Inline :: C
Inline :: CPP
Inline :: Java
来自Inline :: C-Cookbook:
use Inline C => <<'END_C'; void greet() { printf("Hello, world\n"); } END_C greet;
使用Perl 6,使用NativeCall从本机库代码导入子例程变得更加容易.
use v6.c;
sub c-print ( Str() $s ){
use NativeCall;
# restrict the function to inside of this subroutine because printf is
# vararg based, and we only handle '%s' based inputs here
# it should be possible to handle more but it requires generating
# a Signature object based on the format string and then do a
# nativecast with that Signature, and a pointer to printf
sub printf ( str, str --> int32 ) is native('libc:6') {}
printf '%s', $s
}
c-print 'Hello World';
这只是一个简单的例子,您可以创建一个具有Pointer表示的类,并且某些方法是您正在使用的库中的C代码.(仅当C代码的第一个参数是指针时才有效,否则你必须将它包装起来)
如果您需要Perl 6子例程/方法名称不同,则可以使用is symbol
特征修饰符.
Perl 6也有Inline模块.