2008-11-07 56 views
15

我早先詢問a question關於哪種語言用於AI原型。共識似乎是,如果我希望它速度很快,我需要使用像Java或C++這樣的語言,但是Python/Perl/Ruby對於接口位是很好的。鏈接語言

所以,這導致我到另一個問題。將這些語言連接起來有多容易?哪種組合最適合?所以,如果我想要一個調用C++或Java AI函數的Ruby CGI類型的程序,那很容易嗎?任何指針,我在哪裏尋找有關做這種事情的信息?或者不同的組合會更好?

我與編寫Web應用程序的主要經驗開始與C++ CGI,然後(大約10年前)轉移到Java servlet和再經過漫長的差距從編程遠我做了一些PHP。但是我還沒有用腳本語言編寫Web應用程序的經驗,後者隨即調用編譯語言編寫速度關鍵位。所以任何建議都會受到歡迎!

回答

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); 
} 

就是這樣。我們完成了。我們現在可以將其構建爲共享庫。 Python生成的DLL現在可見。這裏的一個示例的Python會話:

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

(例如,從boost.org截取)

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") 
2

可以在例如Python或Ruby的高級語言建立一個程序,然後調用了在較低的水平語言編寫的,你需要表現的部分模塊。您可以根據所需的低級語言選擇一個平臺。

例如,如果你想要做的C++,你可以只使用純Python或Ruby和調用C++編譯的DLL迅速的東西。如果您想使用Java,則可以使用Jython或Java平臺上的其他動態語言之一調用Java代碼,這比C++路由更簡單,因爲您擁有一個通用虛擬機,因此可以直接使用Java對象在Jython或JRuby中。使用Iron-languages和C#的.Net平臺也可以做到這一點,儘管你似乎對C++和Java有更多的經驗,所以這些將是更好的選擇。

9

首先,元評論:我會強烈建議編碼整個事情在一個高層次的語言,剖析像瘋了一樣,並在分析顯示它是隻需要優化。首先優化算法,然後編碼,然後考慮引入重鐵。如果需要用低級語言重新實現,那麼擁有最佳算法和乾淨的代碼會使事情變得更容易。

說到爲Python,IronPython/C#是可能是最優化路徑。

與CPython的C++是可行的,但我覺得下的很多容易處理(但不是那麼容易,爲C)。緩解這個問題的兩個工具是cython/pyrex(對於C)和shedskin(對於C++)。這些將Python編譯爲C/C++,並且從那裏你可以訪問C/C++庫而不需要太多。

我從來沒有使用jython,但我聽說jython/Java優化路徑並不是那麼糟糕。

6

我與第一編碼用高級語言例如Python,歸檔和然後執行需要的任何代碼的思想同意在C/C++中加速幷包裝它以用於高級語言。

作爲提升的替代方案,我想建議SWIG用於從C創建Python可調用代碼。它的使用合理無痛,並且將爲各種語言編譯可調用模塊。 (Python,Ruby,Java,Lua等等)。

包裝過程是半自動化的,因此不需要向基本C代碼添加新功能,從而使工作流程更流暢。

4

Perl有幾種使用其他語言的方法。查看CPAN上的Inline::模塊系列。遵循這個問題的其他人的建議,我會用一種動態語言(Perl,Python,Ruby等)編寫整個事件,然後優化需要它的位。使用Perl和Inline ::可以在C,C++或Java中進行優化。或者您可以查看AI::Prolog,它允許您將Prolog嵌入到AI/Logic編程中。

+0

幾年前,Ovid告訴我,AI :: PRolog對於生產用途來說太慢了。我本來想用它來做一個項目,他讓我氣餒:) – 2008-11-07 21:07:17

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'; 

這只是一個簡單的例子,你可以創建一個具有指針的表示一類,並且有一定的方法是將要使用的庫的C代碼。 (僅當C代碼的第一個參數是指針時才起作用,否則您將不得不將其包裝)

如果您需要Perl 6子例程/方法名稱不同,可以使用is symbol特性修改器。

也有用於Perl 6的內聯模塊。

1

我有一個不同的觀點,對於一些實時實時視頻圖像處理集成了C++和Python有很多好運。

我會說你應該匹配語言到每個模塊的任務。如果你對網絡做出反應,用Python來做,Python可以很好地跟上網絡流量。用戶界面:Python,人們很慢,Python對於在Mac上使用wxPython或PyObjC或PyGTK的用戶界面非常棒。如果您正在進行大量數據,信號處理或圖像處理的數學計算,請使用C或C++進行單元測試,然後使用SWIG創建與任何更高級語言的綁定。

我在我的C++中使用了wxWidgets中的圖像庫,它們已經通過wxPython暴露給Python,所以它非常強大和快速。 SCONS是一個構建工具(如make),它知道如何處理swig的.i文件。

最高級別可以是C或Python,如果頂級使用C或C++,您將擁有更多的控制權和更少的打包和部署問題......但是重複使用Py2EXE需要很長時間或Py2App在Windows或Mac上提供給您(或在Linux上凍結)。

享受混合編程的力量! (我使用多種語言以混合方式緊密耦合,但這只是我的一個怪癖。)

1

如果問題域很難(而且AI問題通常很難),那麼我會選擇一種語言它首先表現出來或者適合於領域,然後擔心第二次加速。例如,Ruby具有元編程原語(能夠輕鬆檢查和修改正在運行的程序),這可以使實現某些類型的算法變得非常容易/有趣。

如果以這種方式實現它,然後再加速,那麼您可以使用基準測試/分析來找出瓶頸併爲此編譯語言,或優化算法。根據我的經驗,最大的性能提升來自調整算法,而不是使用不同的實現語言。