SObjectizer-5.7.0 में नया क्या है और आगे इस परियोजना का क्या इंतजार है?

SObjectizer एक अपेक्षाकृत छोटा C ++ 17 फ्रेमवर्क है जो आपको C ++ कार्यक्रमों में अभिनेता मॉडल, प्रकाशित-सदस्यता और संचार प्रक्रियात्मक प्रक्रिया (CSP) जैसे दृष्टिकोणों का उपयोग करने की अनुमति देता है। जो सी ++ में जटिल बहु-थ्रेडेड अनुप्रयोगों के विकास को बहुत सरल करता है। यदि पाठक पहली बार SObjectizer के बारे में सुनता है, तो आप उसे इस प्रस्तुति से या पहले से ही काफी पुराने लेख से उसका आभास करा सकते हैं।


सामान्यतया, C ++ के लिए इतने सारे खुले, अभी भी जीवित और अभी भी विकासशील उपकरण नहीं हैं। कोई केवल QP / C ++ , CAF: C ++ एक्टर फ्रेमवर्क , अभिनेता-जेटा और बहुत युवा रोटर प्रोजेक्ट को याद कर सकता है। एक विकल्प है, लेकिन इतना बड़ा नहीं है।


हाल ही में, SObjectizer का एक और "प्रमुख" संस्करण उपलब्ध हो गया है, जहाँ आखिरकार एक ऐसी बात सामने आई है, जिसके बारे में लंबे समय से बात की जा रही है, और जिसके लिए मैंने कई बार असफल रूप से संपर्क किया है। हम कह सकते हैं कि एक मील का पत्थर पहुँच गया है। यह संस्करण 5.7.0 के जारी होने के बाद SObjectizer से क्या उम्मीद करेगा, इस बारे में बात करने का एक अवसर है।


चयन में Send_case सहायता ()


इसलिए, सबसे महत्वपूर्ण नवाचार जो v.5.7.0 में दिखाई दिया और जिसके लिए v.5.6 के साथ संगतता पिछले साल जारी की गई (और हम सिर्फ संगतता को नहीं तोड़ेंगे) चयन () फ़ंक्शन में सेंड_केस समर्थन टूट गया था। SObjectizer के चयन ने क्या बनाया () गो चयन के समान और भी बहुत कुछ। अब, चयन () का उपयोग करके, आप न केवल कई सीएसपी चैनलों के संदेश पढ़ सकते हैं, बल्कि उन चैनलों को भी आउटगोइंग संदेश भेज सकते हैं जो लिखने के लिए तैयार थे।


लेकिन इस विषय को प्रकट करने के लिए, आपको दूर से शुरू करने की आवश्यकता है।


SObjectizer-5 में CSP तत्वों का उद्भव


CSP के तत्व, अर्थात् CSP चैनलों के एनालॉग्स, SObjectizer -5 में दिखाई दिए, बॉक्स "CSP सपोर्ट" की जाँच नहीं, बल्कि एक व्यावहारिक समस्या को हल करने के लिए।


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


लेकिन जब अनुप्रयोग में कार्यक्षमता का केवल एक भाग SObjectizer पर लागू होता है ...


उदाहरण के लिए, Qt या wxWidgets पर एक GUI एप्लिकेशन, जिसमें कोड का मुख्य भाग एक GUI है, और कुछ पृष्ठभूमि कार्यों को करने के लिए SObjectizer की आवश्यकता होती है। या अनुप्रयोग का एक हिस्सा नंगे धागे और Asio का उपयोग करके लिखा गया है, और नेटवर्क से Asio द्वारा पढ़ा गया डेटा प्रसंस्करण के लिए SObjectizer एजेंटों को भेजा जाता है।


जब किसी एप्लिकेशन में एक SObjectizer भाग होता है और एक गैर-SObjectizer भाग होता है, तो यह सवाल उठता है: आवेदन के SObjectizer भाग से गैर-SObjectizer भाग में जानकारी कैसे स्थानांतरित की जाए?


समाधान तथाकथित रूप में पाया गया था संदेश श्रृंखला (mchains), अर्थात् बातचीत। जो, यह बस इतना हुआ, सीएसपी चैनलों का सार निकला। एप्लिकेशन के SObjectizer भाग नियमित रूप से भेजे गए () फ़ंक्शन का उपयोग करके, सामान्य तरीके से मैचिन को संदेश भेजता है।


नॉन-सोबिजाइज़र भाग के संदेशों को पढ़ने के लिए, आप नए रिसीव () फ़ंक्शन का उपयोग कर सकते हैं, जिसका उपयोग करने के लिए आपको एसओबीजेनाइज़र के किसी भी अन्य विल्ड में एजेंट बनाने या गोता लगाने की आवश्यकता नहीं थी।


यह काफी समझ और काम करने वाली योजना थी।


माचिस का दुरुपयोग


इसके अलावा, यह योजना इतनी समझ में आने वाली थी और काम कर रही थी कि एसबिजाइजर पर कुछ अनुप्रयोगों ने बिना किसी एजेंट के केवल माचिन-आह पर लिखना शुरू कर दिया। यानी CSP दृष्टिकोण का उपयोग करते हुए, अभिनेता मॉडल नहीं। यहाँ के बारे में पहले से ही Habré पर लेख थे: एक और दो


इससे दो दिलचस्प परिणाम सामने आए।


सबसे पहले, प्राप्त () फ़ंक्शन उन्नत सुविधाओं के साथ उग आया है। यह आवश्यक था ताकि प्राप्त करने के लिए केवल एक कॉल करना संभव हो (), वह रिटर्न जिसमें से तब होगा जब सभी आवश्यक कार्य पहले ही हो चुके हों। यहाँ उदाहरण हैं कि SObjectizer को क्या प्राप्त होता है () क्या कर सकता है:


using namespace so_5; //    3 . //  3    mchain ,   . //   receive    3 , //      . receive( from(chain).handle_n( 3 ), handlers... ); //    3 . //       mchain ,    //     200ms. // ..     200ms,    receive,   //      . receive( from(chain).handle_n( 3 ).empty_timeout( milliseconds(200) ), handlers... ); //       . //     ,    //  500ms. receive( from(chain).handle_all().empty_timeout( milliseconds(500) ), handlers... ); //       . //       2s. receive( from(chain).handle_all().total_time( seconds(2) ), handlers... ); 

दूसरे, यह जल्द ही स्पष्ट हो गया कि भले ही विभिन्न प्रकार के संदेश SObjectizer के माचिन में रखे जा सकते हैं, और यहां तक ​​कि एक उन्नत प्राप्त () फ़ंक्शन की उपस्थिति के बावजूद, कभी-कभी आपको एक साथ कई चैनलों के साथ काम करने में सक्षम होने की आवश्यकता होती है ...


चुनें () लेकिन केवल पढ़ें


कई mchains से संदेशों को पढ़ने और संसाधित करने के लिए चयन () फ़ंक्शन को SObjectizer में जोड़ा गया है। स्पष्ट व्यावसायिक चयन () न केवल उस तरह से प्रकट हुआ, बल्कि गो भाषा के प्रभाव में आया। लेकिन SObjectizer के चयन () में दो विशेषताएं थीं।


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


 using namespace so_5; mchain_t ch1 = env.create_mchain(...); mchain_t ch2 = env.create_mchain(...); //    3 . //    3    ch1. //  2  ch1    ch2. //    ch1  2  ch2... // //   ,       . // select()      3 , //     . select( from_all().handle_n( 3 ), receive_case( ch1, []( const first_message_type & msg ) { ... }, []( const second_message_type & msg ) { ... } ), receive_case( ch2, []( const third_message_type & msg ) { ... }, []( so_5::mhood_t< some_signal_type > ) { ... } ), ... ) ); //    3 . //    ,     200ms. select( from_all().handle_n( 3 ).empty_timeout( milliseconds(200) ), receive_case( ch1, []( const first_message_type & msg ) { ... }, []( const second_message_type & msg ) { ... } ), receive_case( ch2, []( const third_message_type & msg ) { ... }, []( so_5::mhood_t< some_signal_type > ) { ... } ), ... ) ); //       . //    ,     500ms. select( from_all().handle_all().empty_timeout( milliseconds(500) ), receive_case( ch1, []( const first_message_type & msg ) { ... }, []( const second_message_type & msg ) { ... } ), receive_case( ch2, []( const third_message_type & msg ) { ... }, []( so_5::mhood_t< some_signal_type > ) { ... } ), ... ) ); 

दूसरे, चयन () ने चैनल को संदेश भेजने का समर्थन नहीं किया। यानी चैनलों से संदेश पढ़ना संभव था। लेकिन चुनिंदा () का उपयोग करके चैनल को संदेश भेजने के लिए - नहीं।


अब यह याद रखना भी मुश्किल है कि ऐसा क्यों हुआ? शायद इसलिए कि send_case समर्थन के साथ चयन () मुश्किल काम हो गया और इसे हल करने के लिए कोई संसाधन नहीं मिले।


मचिन के सोबिजाइज़र गो में चैनलों की तुलना में पेचीदा हैं


प्रारंभ में, send_case समर्थन के बिना चयन () को समस्या नहीं माना गया था। तथ्य यह है कि एसओबीजेनाइजर में mchains की अपनी विशिष्टताएं हैं जो गो चैनलों के पास नहीं हैं।


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


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


  • क्या मुझे मचिन में खाली जगह की उपस्थिति की प्रतीक्षा करने की आवश्यकता है। और यदि आवश्यक हो, तो कब तक;
  • अगर कोई खाली जगह नहीं है, तो क्या करें: माचिन से सबसे पुराने संदेश को हटा दें, नए संदेश को अनदेखा करें, एक अपवाद फेंकें या यहां तक ​​कि std :: abort () (यह हार्ड स्क्रिप्ट अभ्यास में मांग में काफी है)।

इस प्रकार, एक काफी अक्सर (जहां तक ​​मुझे पता है) एक संदेश भेजने के लिए गो में सेलेक्ट का उपयोग करने का परिदृश्य जो एक ऐसे संदेश को भेजने के लिए है, जो बिना किसी स्पार्क के बिना सॉर्बाइज़र में तुरंत उपलब्ध नहीं था।


अंत में, एक पूर्ण चयन ()


फिर भी, समय बीत गया, कभी-कभी ऐसे मामले सामने आए, जब सेंड_केस सपोर्ट की कमी के कारण अभी भी प्रभावित हुए। इसके अलावा, इन मामलों में, मचिन की अंतर्निहित क्षमताओं ने मदद नहीं की, बल्कि इसके विपरीत।


इसलिए, समय-समय पर मैंने send_case कार्यान्वयन के मुद्दे पर संपर्क करने का प्रयास किया। लेकिन हाल तक, कुछ भी काम नहीं किया। मुख्य रूप से क्योंकि इस सेंड_केस के डिजाइन के साथ आना संभव नहीं था। यानी send_case को select () के अंदर कैसा दिखना चाहिए? यदि भेजना संभव हो तो उसे क्या करना चाहिए? असंभावना के मामले में? आयामहीन और निश्चित माचिन में विभाजित करने के साथ क्या करना है?


दिसंबर 2019 में ही इन और अन्य सवालों के जवाब के लिए मेरे लिए बैठना संभव था। मोटे तौर पर उन लोगों से परामर्श के कारण जो गो से परिचित हैं और उन्होंने वास्तविक काम में गो चयन का उपयोग किया है। खैर, जैसे ही send_case तस्वीर ने आखिरकार आकार ले लिया, क्रियान्वयन वहीं आ गया।


तो अब आप इस तरह लिख सकते हैं:


 using namespace so_5; struct Greeting { std::string text_; }; select(from_all().handle_n(1), send_case(ch, message_holder_t<Greeting>::make("Hello!"), []{ std::cout << "Hello sent!" << std::endl; })); 

महत्वपूर्ण बात यह है कि send_case select () में ओवरलोड प्रतिक्रिया को अनदेखा करता है जो लक्ष्य माचिन के लिए निर्धारित किया गया था। इसलिए, ऊपर के उदाहरण में, ch को प्रतिक्रिया abort_app के साथ बनाया जा सकता है जब पूर्ण चैनल पर संदेश भेजने की कोशिश की जा रही हो। और यदि आप ch को लिखने के लिए simple send () को कॉल करने का प्रयास करते हैं, तो std :: abort () कहा जा सकता है। लेकिन चयन के मामले में () - और ऐसा नहीं होगा, चयन () तब तक इंतजार करेगा जब तक कि मुक्त स्थान ch में प्रकट न हो जाए। या जब तक ch बंद है।


यहाँ कुछ और उदाहरण हैं जो भेजें_केस SObjectizer के चयन में क्या कर सकते हैं ():


 using namespace so_5; //     ,   //    . //    . select(from_all().handle_n(1), send_case(ch1, message_holder_t<FirstMessage>::make(...), []{...}), send_case(ch2, message_holder_t<SecondMessage>::make(...), []{...}), send_case(ch3, message_holder_t<ThirdMessage>::make(...), []{...})); //     . //     ( ) //   ( ). select(from_all().handle_n(3), send_case(ch1, message_holder_t<FirstMessage>::make(...), []{...}), send_case(ch2, message_holder_t<SecondMessage>::make(...), []{...}), send_case(ch3, message_holder_t<ThirdMessage>::make(...), []{...})); //     chW. //     chW    150ms. select(from_all().handle_n(1).empty_timeout(150ms), send_case(chW, message_holder_t<Msg>::make(...), []{...})); //     chW. //  ,   chW   . select(from_all().handle_n(1).no_wait_on_empty(), send_case(chW, message_holder_t<Msg>::make(...), []{...})); //    ,      250ms. select(from_all().handle_all().total_time(250ms), send_case(ch1, message_holder_t<FirstMessage>::make(...), []{...}), send_case(ch2, message_holder_t<SecondMessage>::make(...), []{...}), send_case(ch3, message_holder_t<ThirdMessage>::make(...), []{...})); 

स्वाभाविक रूप से, send_case select () में get_case के साथ संयोजन में उपयोग किया जा सकता है:


 //          //  .       //  . select(from_all().handle_n(1), send_case(ch1, message_holder_t<FirstMsg>::make(...), []{...}), send_case(ch2, message_holder_t<SecondMsg>::make(...), []{...}), receive_case(ch3, [](...){...}), receive_case(ch4, [](...){...})); 

इसलिए अब SObjectizer में CSP दृष्टिकोण का उपयोग किया जा सकता है, जैसा कि वे कहते हैं, सभी क्षेत्रों में। यह गो से भी बदतर नहीं होगा। Verbose, बिल्कुल। लेकिन कोई बुरा नहीं :)


हम कह सकते हैं कि एसओबीजेलाइज़र के सीएसपी दृष्टिकोण के लिए समर्थन जोड़ने का लंबा इतिहास समाप्त हो गया है।


इस रिलीज में अन्य महत्वपूर्ण बातें


अंतिम कदम github


सोर्सबिजर मूल रूप से SourceForge में रहते थे और विकसित हुए थे। 2006 से विज्ञापनों का एक वर्ष। लेकिन SF.net पर, तोड़फोड़ का प्रदर्शन कम और कम होता जा रहा था, इसलिए पिछले साल हम बिटबकेट और मर्क्यूरियल में चले गए। जैसे ही हमने ऐसा किया, एटलसियन ने घोषणा की कि बिटकॉइन के साथ मर्क्यूरियल रिपॉजिटरी को जल्द ही पूरी तरह से हटा दिया जाएगा। इसलिए, अगस्त 2019 के बाद से, सोबिजाइज़र और so5extra दोनों GitHub पर स्थित हैं।


SF.net के पास सभी पुरानी सामग्री बची हुई है, जिसमें Wiki के साथ SObjectizer के पिछले संस्करणों के प्रलेखन शामिल हैं। और फ़ाइलें खंड भी जहां से आप SObjectizer / so5extra के विभिन्न संस्करणों के अभिलेखागार डाउनलोड कर सकते हैं और न केवल (उदाहरण के लिए, SObjectizer के बारे में कुछ प्रस्तुतियों के साथ PDF )।


सामान्य तौर पर, GitHub पर अब हमारे लिए देखें। और सितारों को रखना मत भूलना, हमारे पास अभी के लिए बहुत कम है;)


ढके संदेशों का निश्चित व्यवहार


SO-5.7.0 में, एक छोटा फिक्स हुआ, जिसका उल्लेख नहीं किया जा सकता था। लेकिन यह कहने लायक है, क्योंकि यह एक अच्छा प्रदर्शन है कि सोबिजाइज़र में जमा होने वाली विभिन्न विशेषताएं इसके विकास के दौरान एक दूसरे को कैसे प्रभावित करती हैं।


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


छाए हुए संदेश तंत्र की विशेषताओं में से एक यह है कि लिफाफे से सूचित किया जाता है कि संदेश पतेदार को दिया गया है। यही है, कि इस संदेश के लिए एक हैंडलर ग्राहक एजेंट में पाया गया था और इस हैंडलर को बुलाया गया था।


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


बहुत ही दुर्लभ मामले, जो, जहाँ तक मुझे पता है, किसी के द्वारा भी व्यवहार में नहीं दिखाया गया है। फिर भी, एक मिसकॉल बनाया गया था।


इसलिए, SO-5.7.0 में इस बिंदु को बेहतर बनाया गया है और यदि आवेदन को suppress() या transfer_to_state() परिणामस्वरूप संदेश को अनदेखा किया जाता है, तो लिफाफा अब यह नहीं सोचेगा कि संदेश पते पर पहुंचा दिया गया है।


अतिरिक्त so5extra पुस्तकालय BSD-3-CLAUSE लाइसेंस बदलता है


2017 में, हमने सोब्जेक्टाइज़र के लिए अतिरिक्त घटकों का एक पुस्तकालय बनाना शुरू किया, जिसे so5extra कहा जाता है। इस समय के दौरान, पुस्तकालय में काफी वृद्धि हुई है और इसमें कई उपयोगी चीजें शामिल हैं।


So5extra को मूल रूप से एक डबल लाइसेंस के तहत वितरित किया गया था: खुले स्रोत परियोजनाओं के लिए GNU अफेरो GPL v.3 और बंद लोगों के लिए वाणिज्यिक।


अब हमने so5extra के लिए लाइसेंस बदल दिया है और संस्करण 1.4.0 so5extra से शुरू करके BSD-3-CLAUSE लाइसेंस के तहत वितरित किया गया है। यानी मालिकाना सॉफ्टवेयर विकसित करते हुए भी इसका उपयोग नि: शुल्क किया जा सकता है।


इसलिए, यदि आप SObjectizer में कुछ याद कर रहे हैं, तो आप so5extra पर एक नज़र डाल सकते हैं , क्या होगा यदि आपके पास पहले से ही आपकी ज़रूरत है?


भविष्य के SObjectizer


इससे पहले कि आप कुछ शब्दों के बारे में कहें कि एसोबिजाइज़र क्या इंतजार कर रहा है, आपको एक महत्वपूर्ण विषयांतर बनाने की आवश्यकता है। विशेष रूप से उन लोगों के लिए जो मानते हैं कि सोबिजाइज़र एक "संदर्भ अपशिष्ट", "घुटने की उच्च कारीगरी", "छात्र की प्रयोगशाला", "प्रायोगिक प्रक्षेपण है जिसे लेखक पर्याप्त रूप से खेलते समय छोड़ देते हैं" ... (यह उन विशेषताओं का केवल एक हिस्सा है जो हमने विशेषज्ञों के बारे में सुना था) पिछले 4-5 वर्षों में हमारे इंटरनेट)।


मैं लगभग अठारह वर्षों से SObjectizer विकसित कर रहा हूं। और मैं जिम्मेदारी से कह सकता हूं कि वह कभी भी पायलट प्रोजेक्ट नहीं था। यह एक व्यावहारिक उपकरण है जो 2002 के वर्ष में इसके पहले संस्करण के बाद से वास्तविक कार्य में चला गया।


मैं और मेरे सहकर्मी, और दोनों लोग, जिन्होंने SObjectizer लेने और आज़माने की हिम्मत की, कई बार आश्वस्त हुए कि SObjectizer वास्तव में कुछ प्रकार के मल्टीथ्रेडेड C ++ अनुप्रयोगों के विकास को बहुत आसान बना देता है। बेशक, SObjectizer एक चांदी की गोली नहीं है, और किसी भी तरह से इसका हमेशा उपयोग नहीं किया जा सकता है। लेकिन जहां लागू हो, यह मदद करता है।


जीवन नियमित रूप से एक बार फिर से इस बारे में आश्वस्त होने का अवसर प्रदान करता है। समय-समय पर, किसी अन्य व्यक्ति का मल्टीथ्रेड कोड हमारे ध्यान में आता है, जिसमें SObjectizer के समान कुछ भी नहीं था और कभी भी प्रदर्शित होने की संभावना नहीं है। इस कोड के साथ यहां और वहां क्षणों की डील करें, जब अभिनेता या सीएसपी चैनल का उपयोग कोड को सरल और अधिक विश्वसनीय बना सकता है। लेकिन नहीं, आपको mutex-s और condition_variables के माध्यम से थ्रेड इंटरैक्शन के गैर-तुच्छ पैटर्न का निर्माण करना होगा जहां SObjectizer में आप एक मचिन, संदेशों के एक जोड़े और SObjectizer में निर्मित टाइमर के साथ प्रबंधित कर सकते हैं। और फिर इन गैर-तुच्छ योजनाओं का परीक्षण करने के लिए बहुत समय बिताते हैं ...


इसलिए SObjectizer हमारे लिए उपयोगी था। मैंने यह सोचने की हिम्मत की कि यह न केवल हमारे लिए उपयोगी था। और सबसे महत्वपूर्ण बात, यह लंबे समय से यहां है और सभी के लिए स्वतंत्र रूप से उपलब्ध है। वह कहीं भी नहीं गया। और कहाँ जाने के लिए एक लाइसेंस के तहत OpenSource में क्या है? ;)


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


इस तरह की इच्छाएं होंगी - SObjectizer में नई सुविधाएँ होंगी।


यह नहीं होगा ... ठीक है, तो हम समय-समय पर सुधारात्मक रिलीज जारी करेंगे और C ++ संकलक के नए संस्करणों के तहत SObjectizer के प्रदर्शन की जांच करेंगे।


इसलिए अगर आप SObjectizer में कुछ देखना चाहते हैं, तो हमें बताएं। अगर आपको SObjectizer की कोई मदद चाहिए, तो बेझिझक हमसे संपर्क करें ( GitHub या Google समूह पर मुद्दों के माध्यम से), हम निश्चित रूप से मदद करने की कोशिश करेंगे।


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


पुनश्च। मैं आभारी रहूंगा यदि पाठकों को टिप्पणियों में लिखने का समय मिलेगा कि क्या यह कुलदेवता के बारे में लेख पढ़ने के लिए दिलचस्प / उपयोगी था और क्या वे भविष्य में ऐसा करना चाहते हैं। या क्या हमारे लिए इस तरह के लेख लिखने में समय बर्बाद करना बंद करना बेहतर है, और इस तरह हैबर उपयोगकर्ताओं के समय को रोकना है?


पी पी एस। या हो सकता है कि किसी ने SObjectizer को एक उपकरण के रूप में माना है जो एक कारण या किसी अन्य के लिए लागू नहीं किया जा सकता है? इस बारे में जानना बेहद दिलचस्प होगा।

Source: https://habr.com/ru/post/hi485450/


All Articles