链接语言

时间:2008-11-07 08:07:10

标签: java c++ python ruby perl

我之前问过a question有关用于AI原型的语言。共识似乎是,如果我想要它快,我需要使用像Java或C ++这样的语言,但Python / Perl / Ruby对接口位有好处。

所以,这引出了另一个问题。将这些语言链接在一起有多容易?哪种组合效果最好?那么,如果我想要一个调用C ++或Java AI函数的Ruby CGI类型程序,那么这很容易吗?我在哪里寻找有关做那种事情的信息的指针?或者不同的组合会更好吗?

我编写Web应用程序的主要经验是从C ++ CGI开始,然后转移到Java servlet(大约10年前),然后经过长时间的编程后,我做了一些PHP。但是我没有使用脚本语言编写Web应用程序的经验,然后编写了一个编译语言来获取速度关键位。所以欢迎任何建议!

9 个答案:

答案 0 :(得分:14)

Boost.Python提供了一种将C ++代码转换为Python模块的简便方法。它相当成熟,在我的经验中运作良好。

例如,不可避免的Hello World ......

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会话:

>>> import hello_ext
>>> print hello.greet()
hello, world

(来自boost.org的例子)

答案 1 :(得分:9)

首先,一个元评论:我强烈建议用高级语言对整个事物进行编码,像疯了一样进行分析,并仅在分析显示必要的情况下进行优化。首先优化算法,然后是代码,然后考虑引入重铁。如果您需要在较低级别的语言中重新实现,拥有最佳算法和干净的代码将使事情变得更加容易。

对于Python来说,IronPython / C#可能是最简单的优化路径。

使用C ++的CPython是可行的,但我发现C更容易处理(但不是那么容易,C)。缓解此问题的两个工具是cython / pyrex(对于C)和shedskin(对于C ++)。这些将Python编译成C / C ++,从那里你可以访问C / C ++库而不需要太多麻烦。

我从未使用过jython,但我听说jython / Java优化路径并不是那么糟糕。

答案 2 :(得分:6)

我同意首先使用Python,Profiling等高级语言进行编码,然后实现任何需要加速C / C ++并将其包装在高级语言中的代码。

作为boost的替代方案,我想建议SWIG用于从C创建Python可调用代码。它使用起来相当轻松,并且将为各种语言编译可调用模块。 (Python,Ruby,Java,Lua。仅举几例)来自C代码。

包装过程是半自动化的,因此无需向基本C代码添加新功能,从而使工作流程更加顺畅。

答案 3 :(得分:5)

如果您选择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模块。

答案 4 :(得分:4)

Perl有几种使用其他语言的方法。查看CPAN上的Inline:: 模块系列。根据这个问题中其他人的建议,我将用一种动态语言(Perl,Python,Ruby等)编写整个内容,然后优化需要它的位。使用Perl和Inline :: ,您可以使用C,C ++或Java进行优化。或者您可以查看AI::Prolog,它允许您嵌入Prolog进行AI /逻辑编程。

答案 5 :(得分:2)

这可能是一个很好的方法,从脚本开始,并从该脚本调用基于编译的语言只是为了更高级的需求。

例如,calling java from ruby script效果很好。

require "java"
# The next line exposes Java's String as JString
include_class("java.lang.String") { |pkg, name| "J" + name }
s = JString.new("f")

答案 6 :(得分:2)

您可以使用其中一种更高级别的语言(例如Python或Ruby)构建程序,然后调用以较低级语言编译的模块,以获取您需要执行的部分。您可以根据所需的低级语言选择平台。

例如,如果你想为快速的东西做C ++,你可以使用普通的Python或Ruby,并调用用C ++编译的DLL。如果你想使用Java,你可以使用Java平台上的Jython或其他动态语言来调用Java代码,这比C ++路由更容易,因为你有一个通用的虚拟机,所以可以直接使用Java对象在Jython或JRuby。使用Iron语言和C#在.Net平台上也可以这样做,尽管你似乎对C ++和Java有更多的经验,所以那些选择会更好。

答案 7 :(得分:1)

我有一个不同的观点,在将C ++和Python集成到一些实时实时视频图像处理方面有很多运气。

我会说你应该将语言与每个模块的任务相匹配。如果您正在响应网络,请使用Python,Python可以很好地跟上网络流量。 UI:Python,人很慢,而Python非常适合在Mac上使用wxPython或PyObjC或PyGTK的UI。如果您正在对大量数据,信号处理或图像处理进行数学处理...使用单元测试在C或C ++中编码,则使用 SWIG 创建与任何更高级语言的绑定

我在我的C ++中使用wxWidgets中的图像库,它们已经通过wxPython暴露给Python,所以它非常强大和快速。 SCONS是一个构建工具(如make),它知道如何处理swig的.i文件。

最高级别可以是C或Python,如果最高级别是C或C ++,你将拥有更多的控制权和更少的打包和部署问题......但复制Py2EXE或者需要很长时间Py2App可以在Windows或Mac上使用(或在Linux上冻结。)

享受混合编程的强大功能! (我用紧密耦合的方式使用多种语言'混合',但这只是我的一个怪癖。)

答案 8 :(得分:1)

如果问题域很难(并且AI问题通常很难),那么我会先选择一种富有表现力或适合该域的语言,然后再担心加速它。例如,Ruby具有元编程原语(能够轻松检查和修改正在运行的程序),这可以使实现某些类型的算法变得非常容易/有趣。

如果以这种方式实现它,然后需要加快速度,那么您可以使用基准测试/分析来找到瓶颈并链接到编译语言,或者优化算法。根据我的经验,最大的性能提升来自调整算法,而不是使用不同的实现语言。

相关问题