Ben*_*Ben 15 c++ ruby python java perl
我之前问了一个问题,关于用于AI原型的语言.共识似乎是,如果我想要它快,我需要使用像Java或C++这样的语言,但Python/Perl/Ruby对接口位有好处.
所以,这引出了另一个问题.将这些语言链接在一起有多容易?哪种组合效果最好?那么,如果我想要一个调用C++或Java AI函数的Ruby CGI类型程序,那么这很容易吗?我在哪里寻找有关做这类事情的信息的指针?或者不同的组合会更好吗?
我编写Web应用程序的主要经验是从C++ CGI开始,然后转移到Java servlet(大约10年前),然后经过长时间的编程后,我做了一些PHP.但是我没有使用脚本语言编写Web应用程序的经验,然后编写了一个编译语言来获取速度关键位.所以欢迎任何建议!
Pie*_*ter 14
Boost.Python提供了一种将C++代码转换为Python模块的简便方法.它相当成熟,在我的经验中运作良好.
例如,不可避免的Hello World ......
char const* greet()
{
return "hello, world";
}
Run Code Online (Sandbox Code Playgroud)
可以通过编写Boost.Python包装器来暴露给Python:
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(hello_ext)
{
using namespace boost::python;
def("greet", greet);
}
Run Code Online (Sandbox Code Playgroud)
而已.我们完成了.我们现在可以将其构建为共享库.现在可以看到生成的DLL.这是一个Python会话示例:
>>> import hello_ext
>>> print hello.greet()
hello, world
Run Code Online (Sandbox Code Playgroud)
(来自boost.org的例子)
首先,一个元评论:我强烈建议用高级语言对整个事物进行编码,像疯了一样进行分析,并仅在分析显示必要时进行优化.首先优化算法,然后是代码,然后考虑引入重铁.如果您需要在较低级别的语言中重新实现,拥有最佳算法和干净的代码将使事情变得更加容易.
对于Python来说,IronPython/C#可能是最简单的优化路径.
使用C++的CPython是可行的,但我发现C更容易处理(但并非一切都那么简单,是C).两个缓解这个的工具是cython/pyrex(用于C)和shedskin(用于C++).这些将Python编译成C/C++,从那里你可以访问C/C++库而不需要太多麻烦.
我从未使用过jython,但我听说jython/Java优化路径并不是那么糟糕.
如果选择Perl,则有足够的资源来连接其他语言.
Inline :: C
Inline :: CPP
Inline :: Java
use Inline C => <<'END_C';
void greet() {
printf("Hello, world\n");
}
END_C
greet;
Run Code Online (Sandbox Code Playgroud)
使用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';
Run Code Online (Sandbox Code Playgroud)
这只是一个简单的例子,您可以创建一个具有Pointer表示的类,并且某些方法是您正在使用的库中的C代码.(仅当C代码的第一个参数是指针时才有效,否则你必须将它包装起来)
如果您需要Perl 6子例程/方法名称不同,则可以使用is symbol特征修饰符.
Perl 6也有Inline模块.