2008-11-07 9 views
15

AI 프로토 타입에 사용할 언어에 대해 이전에 a question에게 물었습니다. 필자는 그것이 빨리되기를 원한다면 Java 나 C++과 같은 언어를 사용해야하지만, Python/Perl/Ruby는 인터페이스 비트에 좋을 것이라고 생각했다.언어 연결

그래서, 이것은 또 다른 질문으로 이어집니다. 이 언어들을 서로 연결하는 것이 얼마나 쉬운가요? 어떤 조합이 가장 효과적입니까? 그래서 C++ 또는 Java AI 함수를 호출하는 Ruby CGI 유형 프로그램을 원한다면 그렇게 할 수 있을까요? 내가 그런 종류의 일을하는 데 필요한 정보를 찾는 곳이 어디 있겠습니까? 아니면 다른 조합이 더 좋을까요? 쓰기 웹 응용 프로그램과

내 주요 경험은 C++ CGI 시작 후 (10 년 전) 자바 서블릿에 이동하고 멀리 프로그램에서 긴 간격 후에 나는 약간의 PHP를했다. 그러나 스크립트 언어로 웹 응용 프로그램을 작성한 경험이 없으므로 속도가 중요한 비트를 컴파일 된 언어로 호출합니다. 그래서 어떤 조언을 환영합니다!

답변

14

Boost.Python은 C++ 코드를 Python 모듈로 변환하는 쉬운 방법을 제공합니다. 오히려 성숙하고 내 경험에서 잘 작동합니다.

예를 들어, 필연적 인 Hello World ...

char const* greet() 
{ 
    return "hello, world"; 
} 

은 Boost.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에서 촬영) 내가 파이썬, 프로파일과 같은 높은 수준의 언어로 처음 코딩 한 후 필요 코드를 구현의 아이디어에 동의

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

당신은 예를 들어 파이썬이나 루비에 대한 높은 수준의 언어 중 하나를 사용하여 프로그램을 구축하고 성능을 필요로하는 부분에 대한 낮은 수준의 언어로 컴파일 된 모듈을 호출 할 수 있습니다. 원하는 하위 언어에 따라 플랫폼을 선택할 수 있습니다. 예를 들어

당신은 당신이 그냥 일반 파이썬이나 루비를 사용하여 C++로 컴파일 된 DLL을 호출 할 수있는 빠른 물건 ++ C를 수행하려는 경우. 자바를 사용하고 싶다면 자이 썬이나 Java 플랫폼에서 다른 동적 언어 중 하나를 사용하여 자바 코드를 호출 할 수있다. 일반적인 가상 머신을 가지고있어서 자바 객체를 직접 사용할 수 있기 때문에 C++ 경로보다 쉽다. Jython 또는 JRuby에서. C + +와 Java에 대한 더 많은 경험을 갖고있는 것처럼 보이지만 Iron 언어와 C#을 사용하는 .Net 플랫폼에서도 동일한 작업을 수행 할 수 있으므로 더 나은 옵션이 될 것입니다.

9

첫째, 메타 코멘트 : 나는 매우 높은 수준의 언어로 전체 일을 코딩 화처럼 프로파일 및 프로파일 링이 필요한입니다 보여줍니다 경우에만 최적화 추천 할 것입니다. 먼저 알고리즘을 최적화 한 다음 코드를 작성한 다음 무거운 철분을 가져 오는 것에 대해 생각해보십시오. 최적의 알고리즘과 깨끗한 코드를 사용하면 하위 언어로 다시 구현해야하는 경우/작업을 훨씬 쉽게 할 수 있습니다. 파이썬, IronPython에 대해 말하기

는/C#을 아마 가장 쉬운 최적화 경로입니다.

CPython의 C++와 함께 해 드리겠습니다,하지만 난 (C되고, 전부는 아니지만 쉬운) 처리하기 위해 훨씬 더 쉽게 C를 찾을 수 있습니다. 이것을 쉽게하는 두 가지 도구는 cython/pyrex (C의 경우) 및 shedskin (C++의 경우)입니다. 이것들은 파이썬을 C/C++로 컴파일합니다. 거기에서 너무 많은 부담없이 C/C++ 라이브러리에 액세스 할 수 있습니다.

저는 자이 썬을 사용한 적이 없지만 jython/Java 최적화 경로가 그렇게 나쁘지는 않습니다.

6

: 다음은 샘플 파이썬 세션입니다 C/C++로 속도를 높이고 고급 언어로 사용하기 위해 래핑합니다.

부스트 대신에 C에서 파이썬 호출 가능 코드를 작성하기 위해 SWIG을 제안하고 싶습니다. 사용하기에 무리가 없으며 다양한 언어에 대해 호출 가능 모듈을 컴파일합니다. (Python, Ruby, Java, Lua 등) C 코드에서.

랩핑 프로세스는 반자동이므로 기본 C 코드에 새 기능을 추가 할 필요가 없으므로보다 원활한 작업 흐름을 만들 수 있습니다.

4

Perl에는 다른 언어를 사용하는 여러 가지 방법이 있습니다. CPAN의 Inline:: 모듈 제품군을 살펴보십시오. 이 질문에서 다른 사람들의 조언에 따라 필자는 모든 것을 단일 동적 언어 (Perl, Python, Ruby 등)로 작성한 다음 필요로하는 비트를 최적화합니다. Perl과 Inline ::을 사용하면 C, C++ 또는 Java로 최적화 할 수 있습니다. 또는 AI::Prolog에서 AI/논리 프로그래밍을 위해 Prolog를 임베드 할 수 있습니다.

+0

Ovid는 몇 년 전에 AI :: PRolog가 프로덕션 용도로 사용하기에는 너무 느리다 고 말했습니다. 나는 그것을 프로젝트에 사용하고 싶었고 그는 나를 실망시켰다. :) –

5

Perl을 선택하면 다른 언어와 인터페이스 할 수있는 많은 리소스가 있습니다.

Inline::C-Cookbook에서 Inline::CPP
Inline::Java

Inline::C
: 그것은 NativeCall를 사용하여 원시 라이브러리 코드에서 서브 루틴을 가져올 더욱 쉽게 얻을 펄 6

use Inline C => <<'END_C'; 

    void greet() { 
    printf("Hello, world\n"); 
    } 
END_C 

greet; 

.

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을 통합하는 데 많은 행운이있었습니다.

각 모듈의 언어와 일치해야한다고 말합니다.네트워크에 응답하는 경우 파이썬에서 수행하십시오. 파이썬은 네트워크 트래픽을 잘 처리 할 수 ​​있습니다. UI : Python, People은 느리고 Python은 Mac에서 wxPython 또는 PyObjC 또는 PyGTK를 사용하는 UI에 적합합니다. 많은 양의 데이터 나 신호 처리 또는 이미지 처리에 수학을한다면 단위 테스트를 통해 C 또는 C++로 코드화 한 다음 SWIG을 사용하여 상위 언어에 대한 바인딩을 생성하십시오.

wxWidgets에서 이미 wxPython을 통해 Python에 노출 된 내 C++의 이미지 라이브러리를 사용하여 매우 강력하고 빠릅니다. SCONS는 swig의 .i 파일로 무엇을해야 하는지를 알고있는 빌드 툴 (make와 같은)입니다.

최상위 레벨은 C 또는 Python에있을 수 있습니다. 최상위 레벨이 C 또는 C++ 인 경우 제어 및 패키징 및 배포 문제가 더 적어 지지만 Py2EXE를 복제하는 데 오랜 시간이 걸립니다 또는 Py2App는 Windows 또는 Mac에서 (또는 Linux에서 멈춤)

하이브리드 프로그래밍의 파워를 즐기십시오! (나는 단단히 결합 된 방식으로 '하이브리드'라는 언어로 여러 언어를 사용한다. 그러나 단지 광산의 버크이다.)

1

문제 도메인이 어렵고 AI 문제가 종종 어려울 수 있다면 언어를 선택한다. 표현력이 뛰어나거나 도메인에 가장 적합한 도메인인지 확인한 다음 두 번째 도메인의 속도를 높이는 것에 대해 걱정하십시오. 예를 들어, Ruby는 메타 프로그래밍 프리미티브 (실행중인 프로그램을 쉽게 검사하고 수정할 수있는 기능)를 갖추고있어 특정 유형의 알고리즘을 구현하는 것이 매우 쉽고 재미있을 수 있습니다.

그런 식으로 구현 한 다음 나중에 속도를 높여야하는 경우 벤치마킹/프로파일 링을 사용하여 병목 현상을 찾아 컴파일 된 언어에 연결하거나 알고리즘을 최적화 할 수 있습니다. 내 경험상 최대의 성능 향상은 다른 구현 언어를 사용하는 것이 아니라 알고리즘을 조정하는 것입니다.