2008-11-07 11 views
15

मैंने पहले एआई प्रोटोटाइप के लिए उपयोग करने वाली भाषा के बारे में a question से पूछा। सर्वसम्मति यह प्रतीत होती है कि अगर मैं इसे तेज करना चाहता हूं, तो मुझे जावा या सी ++ जैसी भाषा का उपयोग करने की आवश्यकता है, लेकिन पाइथन/पर्ल/रुबी इंटरफ़ेस बिट्स के लिए अच्छा होगा।भाषाओं को जोड़ने

तो, यह मुझे एक और प्रश्न पर ले जाता है। इन भाषाओं को एक साथ जोड़ने के लिए कितना आसान है? और कौन सा संयोजन सबसे अच्छा काम करता है? इसलिए, अगर मैं एक रूबी सीजीआई-प्रकार प्रोग्राम चाहता हूं जो सी ++ या जावा एआई फ़ंक्शंस को कॉल कर रहा है, तो क्या करना आसान है? कोई संकेतक जहां मैं उस तरह की चीज करने के बारे में जानकारी ढूंढता हूं? या एक अलग संयोजन बेहतर होगा?

वेब अनुप्रयोगों लेखन के साथ मेरा मुख्य अनुभव सी ++ सीजीआई साथ शुरू किया था और उसके बाद (लगभग 10 साल पहले) जावा सर्वलेट पर चले गए और फिर एक लंबे अंतराल के प्रोग्रामिंग से दूर होने के बाद मैं कुछ पीएचपी किया था। लेकिन मुझे एक स्क्रिप्टिंग भाषा में एक वेब अनुप्रयोग लिखने का अनुभव नहीं मिला है, जो गति-महत्वपूर्ण बिट्स के लिए संकलित भाषा में कॉल करता है। तो किसी भी सलाह का स्वागत किया जाएगा!

उत्तर

14

Boost.Python एक आसान तरीका अजगर मॉड्यूल में सी ++ कोड चालू करने के लिए प्रदान करता है। यह बल्कि परिपक्व है और मेरे अनुभव में अच्छी तरह से काम करता है।

उदाहरण के लिए, अपरिहार्य हैलो वर्ल्ड ...

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

एक Boost.Python आवरण लिख कर अजगर से अवगत कराया जा सकता है:

#include <boost/python.hpp> 

BOOST_PYTHON_MODULE(hello_ext) 
{ 
    using namespace boost::python; 
    def("greet", greet); 
} 

यह है कि। हो गया था। अब हम इसे एक साझा पुस्तकालय के रूप में बना सकते हैं। परिणामी डीएलएल अब पाइथन के लिए दृश्यमान है।

>>> 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++ संकलित DLLs कॉल कर सकते हैं के लिए C++ करना चाहते हैं। यदि आप जावा का उपयोग करना चाहते हैं तो आप जावा कोड को कॉल करने के लिए जावा प्लेटफ़ॉर्म पर ज्योथन या अन्य गतिशील भाषाओं में से एक का उपयोग कर सकते हैं, यह सी ++ रूट से आसान है क्योंकि आपके पास एक सामान्य आभासी मशीन है इसलिए जावा ऑब्जेक्ट का सीधे उपयोग किया जा सकता है ज्योथन या जेआरबी में। आयरन-भाषाओं और सी # के साथ नेट प्लेटफ़ॉर्म पर भी ऐसा किया जा सकता है, हालांकि आपको सी ++ और जावा के साथ अधिक अनुभव होता है, इसलिए वे बेहतर विकल्प होंगे।

9

सबसे पहले, एक मेटा टिप्पणी: मैं अत्यधिक एक उच्च स्तरीय भाषा में पूरे बात कोडिंग, पागल की तरह की रूपरेखा, और केवल के अनुकूलन जहां रूपरेखा से पता चलता है कि यह आवश्यक है की सिफारिश करेंगे। सबसे पहले एल्गोरिदम अनुकूलित करें, फिर कोड, फिर भारी लोहा लाने के बारे में सोचें। इष्टतम एल्गोरिदम और साफ कोड होने से चीजों को बहुत आसान बना दिया जाएगा जब आपको निम्न-स्तर की भाषा में पुन: कार्यान्वित करने की आवश्यकता होती है।

अजगर, IronPython के लिए बात हो रही है/सी # शायद सबसे आसान अनुकूलन मार्ग है।

सी ++ के साथ CPython संभव है, लेकिन मैं सी बहुत आसान संभाल करने के लिए (लेकिन सभी यह आसान नहीं, सी जा रहा है) लगता है। इसे कम करने वाले दो टूल cython/pyrex (सी के लिए) और shedskin (सी ++ के लिए) हैं। ये सी/सी ++ में पाइथन संकलित करते हैं, और वहां से आप बहुत अधिक एडीओ के बिना सी/सी ++ पुस्तकालयों तक पहुंच सकते हैं।

मैंने कभी भी ज्योथन का उपयोग नहीं किया है, लेकिन मैंने सुना है कि ज्योथन/जावा अनुकूलन पथ इतना बुरा नहीं है।

6

मैं ऐसे अजगर, रूपरेखा के रूप में एक उच्च स्तर की भाषा में पहली कोडिंग और उसके बाद किसी भी कोड की जरूरत है कि लागू करने के विचार के साथ सहमत हैं: यहां एक नमूना अजगर सत्र है सी/सी ++ में तेजी से बढ़ रहा है और इसे उच्च स्तर की भाषा में उपयोग के लिए लपेट रहा है।

बढ़ावा देने के विकल्प के रूप में मैं सी से पाइथन कॉल करने योग्य कोड बनाने के लिए SWIG का सुझाव देना चाहता हूं। इसका उपयोग करने के लिए उचित रूप से दर्द रहित है, और भाषाओं की विस्तृत श्रृंखला के लिए कॉल करने योग्य मॉड्यूल संकलित करेगा। (पायथन, रूबी, जावा, लुआ। कुछ नामों के लिए) सी कोड से।

रैपिंग प्रक्रिया अर्ध स्वचालित है, इसलिए आधार सी कोड में नए कार्यों को जोड़ने की कोई आवश्यकता नहीं है, जिससे एक आसान काम प्रवाह हो।

4

पर्ल के पास अन्य भाषाओं का उपयोग करने के कई तरीके हैं। सीपीएएन पर मॉड्यूल के Inline:: परिवार को देखें। इस प्रश्न में दूसरों से सलाह के बाद, मैं पूरी चीज को एक गतिशील भाषा (पर्ल, पायथन, रूबी, आदि) में लिखूंगा और फिर उन बिट्स को अनुकूलित करूँगा जिनकी आवश्यकता है। पर्ल और इनलाइन :: के साथ आप सी, सी ++, या जावा में अनुकूलित कर सकते हैं। या आप AI::Prolog देख सकते हैं जो आपको एआई/तर्क प्रोग्रामिंग के लिए प्रोलॉग एम्बेड करने की अनुमति देता है।

+0

ओविड ने मुझे कुछ साल पहले बताया था कि एआई :: PRolog उत्पादन के उपयोग के लिए बहुत धीमी है। मैं इसे एक परियोजना के लिए उपयोग करना चाहता था और उसने मुझे निराश किया :) –

5

यदि आप पर्ल चुनते हैं तो अन्य भाषाओं को इंटरफेस करने के लिए बहुत सारे संसाधन हैं।

Inline::C
Inline::CPP
Inline::Java

Inline::C-Cookbook से:

use Inline C => <<'END_C'; 

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

greet; 

पर्ल 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'; 

यह सिर्फ एक सरल उदाहरण है, तो आप एक वर्ग एक सूचक का प्रतिनिधित्व किया है कि बनाने के लिए, और तरीकों के कुछ पुस्तकालय आप उपयोग कर रहे से सी कोड होना हो सकता है। (केवल तभी काम करता है जब सी कोड का पहला तर्क सूचक होता है, अन्यथा आपको इसे लपेटना होगा)

यदि आपको पर्ल 6 सबराउटिन/विधि नाम अलग होने की आवश्यकता है तो आप is symbol विशेषता संशोधक का उपयोग कर सकते हैं।

पर्ल 6 के लिए इनलाइन मॉड्यूल भी हैं।

1

मेरे पास एक अलग परिप्रेक्ष्य है, जिसमें कुछ वास्तविक समय लाइव वीडियो छवि प्रसंस्करण के लिए सी ++ और पायथन को एकीकृत करने के साथ बहुत सारी किस्मत है।

मैं कहूंगा कि आपको प्रत्येक मॉड्यूल के लिए कार्य से भाषा से मेल खाना चाहिए।यदि आप किसी नेटवर्क का जवाब दे रहे हैं, तो इसे पायथन में करें, पायथन नेटवर्क यातायात को ठीक से रख सकता है। यूआई: पायथन, लोग धीमे हैं, और पाइथन मैक, या पीईजीटीके पर wxPython या PyObjC का उपयोग कर यूआई के लिए बहुत अच्छा है। यदि आप बहुत सारे डेटा, या सिग्नल प्रोसेसिंग, या इमेज प्रोसेसिंग पर गणित कर रहे हैं ... इसे यूनिट परीक्षणों के साथ सी या सी ++ में कोड करें, तो किसी भी उच्च स्तरीय भाषा के लिए बाध्यकारी बनाने के लिए SWIG का उपयोग करें।

मैंने अपने सी ++ में wxwidgets में छवि पुस्तकालयों का उपयोग किया, जो पहले से ही wxPython के माध्यम से पाइथन के संपर्क में हैं, इसलिए यह बेहद शक्तिशाली और त्वरित था। एससीओएनएस एक निर्माण उपकरण है (जैसे बनाना) जो जानता है कि स्विग की .i फाइलों के साथ क्या करना है।

शीर्षतम स्तर सी या पायथन में हो सकता है, यदि शीर्ष स्तर सी या सी ++ में है तो आपके पास अधिक नियंत्रण और कम पैकेजिंग और तैनाती के मुद्दे होंगे ... लेकिन यह Py2EXE को डुप्लिकेट करने में वास्तव में लंबा समय लगेगा या Py2App आपको विंडोज या मैक (या लिनक्स पर फ्रीज) देता है।

हाइब्रिड प्रोग्रामिंग की शक्ति का आनंद लें! (मैं कसकर युग्मित तरीके से 'हाइब्रिड' में कई भाषाओं का उपयोग कर कॉल करता हूं लेकिन यह सिर्फ मेरा क्विर्क है।)

1

यदि समस्या डोमेन कठिन है (और एआई समस्याएं अक्सर कठिन हो सकती हैं), तो मैं एक भाषा चुनूंगा जो पहले डोमेन के लिए अभिव्यक्तिपूर्ण या अनुकूल है, और उसके बाद इसे दूसरे स्थानांतरित करने की चिंता करें। उदाहरण के लिए, रूबी में मेटा-प्रोग्रामिंग प्राइमेटिव्स (चल रहे प्रोग्राम को आसानी से जांचने और संशोधित करने की क्षमता) है जो कुछ प्रकार के एल्गोरिदम को लागू करने में बहुत आसान/रोचक बना सकता है।

यदि आप इसे इस तरह कार्यान्वित करते हैं और बाद में इसे गति देने की आवश्यकता है, तो आप बाधा लगाने के लिए बेंचमार्किंग/प्रोफाइलिंग का उपयोग कर सकते हैं और उसके लिए संकलित भाषा से लिंक कर सकते हैं, या एल्गोरिदम अनुकूलित कर सकते हैं। मेरे अनुभव में, सबसे बड़ा प्रदर्शन लाभ एल्गोरिदम tweaking से है, एक अलग कार्यान्वयन भाषा का उपयोग करने से नहीं।

संबंधित मुद्दे