C ++ बनाम C #



हर कोई जानता है कि बहस करने से ज्यादा बेवकूफी कुछ और नहीं है "कौन सी भाषा बेहतर है।" उदाहरण के लिए, क्या बेहतर है? अलग-अलग भाषाएं अलग-अलग niches में सफल होती हैं - और इस पर विचार किए बिना निश्चित निष्कर्ष निकालना व्यर्थ है।

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

C ++ से, C ++ रूस सम्मेलन की कार्यक्रम समिति के अध्यक्ष सर्गेई सर्प प्लैटोनोव ने भाग लिया। C # पक्ष का अनातोली कुलकोव द्वारा प्रतिनिधित्व किया गया था - वह डॉटनेट सम्मेलन के पीसी में शामिल है, और डॉटनेटेरू के नेताओं के बीच । और चर्चा के नेता, जिसके जीवन में ये दोनों विश्व सह-अस्तित्व में थे, दिमित्री मेज़ेस्टेल निस्टरुक थे




दिमित्री: शुभ दोपहर, सहकर्मी। प्रोग्रामिंग भाषाओं के विषय पर अनौपचारिक समारोहों में आपका स्वागत है। इंटरनेट पर हमें लगातार याद दिलाया जाता है कि भाषाओं की तुलना नहीं की जा सकती। और आज हम वही करेंगे जो आप नहीं कर सकते हैं: C ++ की C # और .NET के साथ तुलना करें, उनके पेशेवरों और विपक्षों के साथ। कृपया अपना परिचय दें।

अनातोली: मेरा नाम अनातोली है, और आज मैं सी # के लिए डूबूंगा, क्योंकि मैं इस भाषा का इसके पहले संस्करणों से अध्ययन कर रहा हूं और ऐसा लगता है, मुझे इसके बारे में सब कुछ पता है।

सेर्गेई: हाय, मेरा नाम सर्गेई है, मैं आज C ++ के लिए डूबूंगा। दीमा ने सही कहा कि हम पेशेवरों और विपक्ष की तुलना करेंगे। हर कोई इसे "पेशेवरों" कहता है, यह ज्ञात है कि, यह पता चला है कि इस चर्चा में सी # एक शून्य से होगा। क्या यह सही है, अनातोली?

अनातोली: सी # में दो और प्लस हैं! इसलिए, मुझे लगता है कि यह उन लाभों का विकासवादी विकास है जो पहले से ही अप्रचलित हैं और लगभग कहीं भी प्रतिस्पर्धा करने में सक्षम नहीं हैं।



गठन


दिमित्री: हमारी चर्चा का पहला विषय है। कल्पना कीजिए कि नए छात्र विश्वविद्यालय में आते हैं, उन्हें पहली भाषा की आवश्यकता होती है। आपको क्या लगता है कि पहली भाषा जो लोगों को उनके पहले वर्ष में मिलनी चाहिए: सी ++, सी #, या सामान्य रूप से कोडांतरक?

सर्गेई: मैंने कुछ समय तक पढ़ाया, इसलिए मेरे पास एक स्थापित राय है। मैं समझता हूं कि यहां हम चर्चा करने जा रहे हैं कि कौन सी भाषा बेहतर है, और मैं सी ++ के लिए खड़ा हूं ... लेकिन सी ++ जानने के लिए, आपको कंप्यूटर की वास्तुकला को समझने की आवश्यकता है। और इसके साथ, छात्रों को पढ़ाने की बड़ी समस्या (कम से कम विश्वविद्यालय में जहां मैंने पढ़ाया है)। और एल्गोरिदम और सामान को पढ़ाने के लिए, आपको शायद कुछ ऐसी चीज़ की आवश्यकता होती है जो भाषा में ही बुनियादी ढाँचे पर केंद्रित न हो। यहां एफिल ऐसा करने का प्रयास कर रहा था, लेकिन इसमें बहुत जादू भी है। इसलिए, मैं कहूंगा कि हमारी दो भाषाओं में से कोई भी उपयुक्त नहीं है।

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

अनातोली: हां, मैं पूरी तरह से सहमत हूं कि आपको वस्तुओं को अलग करने की आवश्यकता है, और इसे "प्रोग्रामिंग" में नहीं डालें और एक भाषा में सब कुछ हथौड़ा दें। लेकिन अगर आप उस बिंदु पर पहुंच जाते हैं जहां आपने मूल बातें, बुनियादी बातों, एल्गोरिदम को सीखा है, और किसी तरह की औद्योगिक भाषा चुनना शुरू करते हैं, तो निश्चित रूप से, सी # बहुत बेहतर होगा। क्योंकि यह आपको आर्किटेक्चर के स्तर, मेमोरी के बाइट्स, और अन्य "सनसेट्स बाय हैंड" के स्तर पर सीखने के लिए मजबूर नहीं करता है। यह एक तुरंत समझने योग्य भाषा, सरल वाक्यविन्यास देता है, और इस भाषा में पहले या दूसरे वर्ष से आप काफी ठोस पैसा कमा सकते हैं।

दिमित्री: एक तर्क है कि शुरुआत करने वाले छात्रों को कुछ चीजें नहीं दे रहे हैं जैसे कि संकेतकर्ता कुछ प्रकार के बलिदान हैं। उनके पास एक बड़ा छेद होगा यदि कोई व्यक्ति यह नहीं समझता है, उदाहरण के लिए, एक लिंक वास्तव में स्मृति में केवल एक चर का पता है। आप इस बारे में क्या सोचते हैं?

अनातोली: 20 साल पहले, यह सच था जब कंप्यूटर में पर्याप्त मेमोरी नहीं थी, पर्याप्त डिस्क और अन्य चीजें नहीं थीं। अब इन javascripts को देखें, ये 500 मेगाबाइट्स को प्रत्येक "हैलो वर्ल्ड" में लाइब्रेरी में खींचते हैं। वे स्मृति में कितना लेते हैं? उनका प्रदर्शन क्या है? वहाँ क्या लिंक हैं? हां, किसी को परवाह नहीं है। मुख्य बात यह है कि उत्पादन में कुछ जल्दी से रोल और रिलीज करना है। मैं यह दावा नहीं करता कि यह एक अच्छा या सही तरीका है, मैं तर्क देता हूं कि वास्तविकताओं के साथ-साथ परिवर्तन करना आवश्यक है। शायद अब यह इतना महत्वपूर्ण नहीं है कि आपका लिंक कितना महत्वपूर्ण है।

सेर्गेई: शायद जहां पर निर्भर करता है। दिमित्री, जहां तक ​​मैं समझता हूं, एल्गोरिथम ट्रेडिंग में दिलचस्पी थी - मैं स्पष्ट रूप से कल्पना कर सकता हूं कि वह जेएस पर पुस्तकालयों को कैसे भेजता है ताकि एक्सचेंज को एक ऑर्डर भेजा जा सके।

दिमित्री: हाँ, हाँ, बेशक, कोई भी इस प्रकार की भाषाओं का उपयोग नहीं करता है। यद्यपि सैद्धांतिक रूप से यह संभव हो सकता है: चलो यह न भूलें कि कमजोर पैसे को जेएस के बुनियादी ढांचे में नहीं डाला जा रहा है। इंजन जो जेएस को किसी भी चीज और हर चीज में संकलित करते हैं। कई लोग इस भाषा को सामान्य रूप से सब कुछ के लिए प्रथम श्रेणी की भाषा मानते हैं।

स्वाभाविक रूप से, इस तरह के एक अनुशासन से अब एल्गो ट्रेडिंग एक दूरस्थ अनुशासन है, लेकिन समग्र रूप से एल्गो ट्रेडिंग और वित्तीय गणित आमतौर पर एक विशिष्ट क्षेत्र है। यह सिर्फ C ++ को प्रबल करता है। और यह आंशिक रूप से जड़ता के कारण होता है, केवल ऐतिहासिक कारणों से: शुरुआत में हर कोई C ++ में था, और यह क्षेत्र रूढ़िवादी है।

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

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

लेकिन हमारी चर्चा केवल एल्गोरिथम ट्रेडिंग के आसपास ही नहीं है, बल्कि साधारण चीजों के आसपास भी है। यहाँ मैं एक उदाहरण देता हूँ। निर्माण के संबंध में, मुझे विभिन्न चीजों की गणना करने वाले कई छोटे अनुप्रयोगों को लिखने की आवश्यकता थी: उदाहरण के लिए, एक घर के समोच्च के चारों ओर ईंटों को कैसे रखना है। और मैं शायद ही सोच सकता हूं कि सी ++ में ऐसी चीजें कैसे करें, क्योंकि यूआई से संबंधित सब कुछ वहां कमजोर है। केवल एक ही ढांचा है, क्यूटी और यहां तक ​​कि उस पर लिखना बहुत मुश्किल है। और अगर मैं WinForms के लिए C # के लिए बैठ जाता हूं, तो मैं बस तुरंत आवेदन करता हूं।

अनातोली: खैर, दृश्य भाग हमेशा सी # की ताकत रहा है। Microsoft ने नए नए साँचे, और यहाँ तक कि क्रॉस-प्लेटफ़ॉर्म मोल्ड्स में और सामान्य रूप से विज़ुअलाइज़ेशन में बहुत निवेश किया। इसलिए, अगर हम दृश्य डेस्कटॉप अनुप्रयोगों के बारे में बात कर रहे हैं, तो यह मुझे लगता है कि प्लसस आम तौर पर बहुत पीछे हैं।

सेर्गेई: ठीक है, यह हमेशा की तरह निर्भर करता है। मुझे वास्तव में यूआई पसंद नहीं है, लेकिन प्लसस पर मुझे लगातार ऐसा करना पड़ता है। यह जेएस को लाने के लिए प्रतीत होता है और सिर्फ पेशेवरों के साथ बातचीत करता है। लेकिन मैंने एम्बेडेड के साथ काम किया, और वहां यह कठिन है। लोगों ने किसी तरह का तेज़ महंगा इंजन खरीदा, लेकिन यह अभी भी जेएस में लिखे गए यूआई के सामान्य प्रतिपादन का सामना नहीं कर सका। और क्यूटी पर यह सब लिखने के बाद, यह ओवरक्लॉक हो गया। साधारण कहानी।



क्रॉस-प्लेटफॉर्म बनाम क्रॉस-प्लेटफ़ॉर्म


सेर्गेई: मैं यहाँ स्पष्ट करना चाहता था। मुझे C # के बारे में ज्यादा जानकारी नहीं है, मैंने इसे बहुत पहले खुद ही छू लिया था, बहुत पहले संस्करणों में (फिर मैं पीछे की संगतता तोड़ दिया गया था)। तो सवाल यह है: यह अभी भी केवल Microsoft द्वारा विकसित किया जा रहा है?

अनातोली: नहीं, अब यह क्रॉस-प्लेटफॉर्म है, आईएसओ (ईसीएमए -334 और आईएसओ / आईईसी 23270) के तहत खुला और सत्यापित है। वैसे, जहां तक ​​मुझे पता है, सी ++ में अभी भी एक खुला आईएसओ विनिर्देश नहीं है, केवल भुगतान किया गया है। और C #, इसके विपरीत, पूरी तरह से खुला है। कई कंपनियों (Google, अमेज़ॅन और सैमसंग सहित) द्वारा विकसित, हमारे पास .NET फाउंडेशन है । मुझे अब C # और उसके .NET प्लेटफ़ॉर्म से अधिक खुली भाषा भी नहीं आती।

सर्गेई: ठीक है, हास्केल।

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

सेर्गेई: वे सपने देख सकते हैं, और यहां तक ​​कि इस दिशा में काम भी चल रहा है। लेकिन यह स्पष्ट है कि हर चीज की अपनी कीमत होती है। सी ++ में, वे बस इस कीमत का भुगतान करने से इनकार करते हैं।

अनातोली: कौन सा? वे दो घंटे के लिए संकलित हैं, और क्या कीमत हो सकती है?

सर्गेई: सी ++ में, शून्य लागत अमूर्त का सिद्धांत। खैर, यह है, एक आभासी मशीन एक शून्य लागत अमूर्त नहीं है, है ना? हमें इसके साथ लगना होगा।

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

सर्गेई: लेकिन सी ++ में, संकलन के दौरान, आप पूरी तरह से नियंत्रित कर सकते हैं कि आपको किन निर्देशों की आवश्यकता है। इस मामले में, आप इसे अपने हाथों से नियंत्रित नहीं करते हैं, लेकिन आप उपकरण (संकलक) को छोड़ देते हैं। देखिए, इस आर्किटेक्चर पर क्या निर्देश हैं, निर्देशों का क्या सेट ...

दिमित्री: यह समझ में आता है। लेकिन आप इसे इस तरह से तैयार कर सकते हैं: चूंकि एक लाख प्लेटफार्म हैं, इसलिए हमें कभी भी किसी भी तरह का आदर्श नहीं मिलेगा, क्योंकि हम विभिन्न संकलन झंडों के साथ एक लाख संस्करण जारी नहीं कर सकते हैं। है न? हम आम तौर पर x86 और x64 जारी करते हैं, लेकिन इसे सभी उपसमूहों में नहीं तोड़ते हैं।

सर्गेई: हम क्यों नहीं कर सकते? XXI सदी। विभिन्न मापदंडों के साथ डॉकर को पकड़ो, बस इतना ही।

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

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

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

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

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

अनातोली: इस चर्चा में, हमने एक महत्वपूर्ण विषय पर छुआ, इस तरह के एक मिथक: सी ++ को कई साल पहले इस तरह के क्रॉस-प्लेटफॉर्म भाषा के रूप में घोषित किया गया था, लेकिन फिलहाल सी-प्लेटफॉर्म सी # में बहुत अधिक है। एक और केवल बाइनरी हर जगह काम करता है जहां .NET समर्थित है, और यह लगभग हर जगह है।

सेर्गेई: ठीक है, यह भी काफी निराधार है। एक ऐसे व्यक्ति के रूप में जिसने अपना अधिकांश जीवन एम्बेडेड में बिताया है, मैंने शायद ही कभी देखा है। .NET को हार्डवेयर निर्माता के टूलचिन द्वारा समर्थित किया गया है। लोहे का उत्पादन करने वाली कंपनियां समान G ++ या Clang लेती हैं या इसे अपने प्लेटफ़ॉर्म के लिए कोड बनाना शुरू कर देती हैं।

दिमित्री: हाँ, लेकिन समस्या यह है कि हर बार जब वे ऐसा करते हैं, तो वे C ++ से कुछ खो देते हैं। उदाहरण के लिए, नोकिया ने C ++ की भिन्नता का उपयोग किया, लेकिन उनका सी ++ पागल ट्विस्ट और पागल एपीआई के साथ था जिसने सभी को प्रभावित किया। यही है, यह सिर्फ C ++ नहीं है, बल्कि एक या दूसरे प्लेटफॉर्म के लिए C ++ है। और तब समस्याएं शुरू होती हैं। उदाहरण के लिए, उसी CUDA को लें। यह ऐसा है जैसे कि यह केवल पेशेवरों को खुद के माध्यम से जाने देना चाहिए, यह बिल्कुल संकलक नहीं है, बल्कि सिर्फ एक चालक है। लेकिन इसके बावजूद, उसने इस तथ्य के साथ जुगाड़ किया है कि वह अभी भी CUDA फ़ाइलों को GPU और CPU भागों में फाड़ने के लिए किसी प्रकार की रूपरेखा का उपयोग करती है। और कभी-कभी वह सफल नहीं होती है।

सर्गेई: मेरा मतलब यह नहीं था कि थोड़ा। यह सिर्फ इतना है कि जब मैं सुनता हूँ ".NET हर जगह चलता है," मेरी अधिकांश जीवनी काम करती है। जब आप कस्टम प्रोसेसर के साथ हार्डवेयर का एक टुकड़ा खरीदते हैं, तो यह सिर्फ G ++ डिलीवरी के साथ बंडल में आता है। और साधारण सी ++ है, जो जी ++ टूलकिन से इस विशेष प्रोसेसर द्वारा समर्थित मशीन कोड में बदल सकता है।

दिमित्री: लेकिन फिर, यह आश्वस्त होना चाहिए ...

सर्गेई: बिल्कुल।

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

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



स्थिरता, अनुकूलता, भाषा का विकास


दिमित्री: शून्य लागत सार का भी उल्लेख किया गया था, लेकिन समस्या यह है कि इसकी बहुत बड़ी कीमत है। उदाहरण के लिए, .NET में एन्यूमरेटेड टाइप और IEnumerable इंटरफ़ेस की अवधारणा है। और प्रत्येक प्रकार के लिए, उदाहरण के लिए, एक सरणी, आप इट्रेटर के माध्यम से ले और जा सकते हैं। लेकिन C ++ में ऐसा कोई विचार नहीं है। शून्य लागत अमूर्तता के कारण, संग्रह के चारों ओर जाने के लिए, शुरू () और अंत () के एक जोड़े हैं, उनके काम के लिए नियम हैं, और यह सब बहुत अधिक जटिल है (विशेषकर उन लोगों के लिए जो कार्यक्रम शुरू करते हैं)। यह एक सीधी समस्या है: ए से जेड तक कुछ सरणी कैसे प्राप्त करें।

सेर्गेई: यदि मैं सही ढंग से समझता हूं कि आप किस बारे में बात कर रहे हैं ... यदि आपको शुरुआत से अंत तक एक कंटेनर के चारों ओर जाने की जरूरत है, तो अब आप बस लिखते हैं, जैसे कुछ पायथन में।

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

सर्गेई: हम किस C ++ के बारे में बात कर रहे हैं? सी ++ के बारे में सामान्य तौर पर, भविष्य के सी ++, सी ++, जो अब एक मानक के रूप में स्वीकार किए जा रहे हैं?

दिमित्री: ठीक है, अगर भविष्य के पेशेवरों में यह होगा ...

सर्गेई: सी ++ 20 में, यह पहले से ही है। आप पहले से ही कह सकते हैं, आप खुद को घोषित भी कर सकते हैं। ये इंटरफेस नहीं हैं, लेकिन, इसे सही कैसे कहें ... सामान्य तौर पर, आप यह घोषणा कर सकते हैं कि आपके प्रकार को इस तरह की और ऐसी शर्तों को पूरा करना चाहिए। उदाहरण के लिए, यह शुरू और अंत हो गया है, जो एक पुनरावृत्त लौटाते हैं। और मानक पुस्तकालय में एक पुनरावृत्त ऐसी तैयार अवधारणा है। वह कहता है कि यह क्या है, वर्णन करता है। Iterators भी अलग हैं। सामान्य तौर पर, हम कोशिश करते हैं, हम इसे लोगों के लिए अधिक सुविधाजनक बनाते हैं।

दिमित्री: मुझे ऐसा लगता है कि यह इस तथ्य से बढ़ गया है कि लोगों को सिर्फ एहसास हुआ कि किसी वस्तु के चलने योग्य की अवधारणाओं के बिना जीना मुश्किल है। क्योंकि यह स्पष्ट नहीं है कि सामान्यीकृत चीजों को कैसे लिखना है। हां, शून्य लागत अमूर्तता का मतलब है कि हमारे पास खोज करते समय वी-टेबल पर घूमने की लागत नहीं है ... उदाहरण के लिए .NET में सिर्फ एक विशिष्ट विधि है। और हम, इसे खोजने के लिए, स्वाभाविक रूप से, प्रयासों को खर्च करना होगा, जिसे प्लसस मना करते हैं। लेकिन प्रयोज्यता के दृष्टिकोण से, अंतिम परिणाम इतना अच्छा नहीं है, मैं कहूंगा।

सर्गेई: स्वाभाविक रूप से, एक संतुलन होना चाहिए। आपके पास एक बार में सब कुछ नहीं हो सकता।

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

सेर्गेई: खैर चलो! "खराब विकसित" का क्या अर्थ है?

आपने एक समिति का उल्लेख किया - C ++ में एक ISO समिति भी है जो इसे विकसित करती है। माइक्रोसॉफ्ट सहित, वहाँ के प्रतिनिधि हैं, जो इस तथ्य के लिए दृढ़ता से डूब जाते हैं कि "आप ऐसा नहीं कर सकते, क्योंकि हमारे पास बहुत सारी विरासत है जिसका हमें समर्थन करने की आवश्यकता है।" बस C ++ पहले से आयोजित की गई भाषा है। और, ज़ाहिर है, वह बहुत सावधानी से चलता है। मुख्य कार्यों में से एक (जो बनाते समय स्ट्रैसपुप द्वारा पहले ही घोषित किया गया था) सी के साथ संगतता है लेकिन अब सी भी काफी दूर विकसित हो गया है, आपको यह नामित करना होगा कि कौन सी सी के साथ संगत है।

और मेरी राय में, अब सी ++ एक जबरदस्त गति से विकसित हो रहा है। अवधारणाओं और इतने पर के बारे में - वास्तव में, सब कुछ बढ़ता है, ज़ाहिर है, पुनरावृत्ति से नहीं। वास्तव में, विकास निम्नानुसार है जो अलेक्जेंडर स्टेपानोव ने भी वर्णित किया है - अब हम "सामान्यीकृत प्रोग्रामिंग" के लेखकों में से एक हैं, वह व्यक्ति जो वास्तव में टेम्पलेट्स, जेनेरिक और इसी तरह C ++ में घसीटता है। ईमानदार होने के लिए, मुझे नहीं पता कि समिति इन विचारों से कितनी प्रेरित है, लेकिन मुझे ऐसा लगता है कि निश्चित रूप से उनके बीच कुछ अंतरंगता है।

अनातोली: ऐसा लगता है कि ये सभी मेटाक्लासेस, पुनरावृत्तियां वास्तव में प्रेरणा हैं, जो कि कई दशक पहले ही थी। यहां तक ​​कि अगर आप मेटाप्रोग्रामिंग, टेम्प्लेट, मैक्रोज़ लेते हैं - इन सभी लोगों के पास लंबे समय से अनुभवी, पीस रहे हैं, और बहुत सरल, स्पष्ट, समझने योग्य अवधारणाएं हैं। अन्य भाषाओं में, यह सब एक लाख गुना बेहतर और तेजी से किया जाता है, प्रकार की सुरक्षा के साथ, समय की जाँच, और इसी तरह।

सर्गेई: रुको, आप पहले से ही कुछ के बारे में बात कर रहे हैं जो हर कोई भुगतान करने के लिए तैयार नहीं है। मैं नहीं चाहता कि मेरा कार्यक्रम मेरी जानकारी के बिना संकलित समय में कुछ की जाँच करें। क्या आप समझते हैं?

अनातोली: मुझे लगता है कि झंडे के साथ इन सभी को कॉन्फ़िगर किया जा सकता है। आप अनुकूलन स्तर सेट करते हैं, और यह या तो आपकी जाँच करता है या नहीं। यह कोई समस्या नहीं है।

सर्गेई: अक्सर आपको अपने हाथों से सब कुछ नियंत्रित करने की आवश्यकता होती है। जानिए आखिर क्या चल रहा है। क्योंकि उपकरण - ठीक है, कि।

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

सर्गेई: यह स्पष्ट नहीं है कि जब आपके पास असुरक्षित और सुरक्षित है, जैसा कि जंग में, मैं सी के साथ अंतर नहीं देखता, उदाहरण के लिए, इस मामले में।

अनातोली: अंतर यह है कि आप सुरक्षित रूप से लिख सकते हैं और आप तेजी से लिख सकते हैं। और C में आपको खतरनाक तरीके से लिखना है। खैर, हाँ, शायद जल्दी। स्थिरता कभी-कभी गति से अधिक महत्वपूर्ण होती है।

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

सर्गेई: ठीक है, यह तय है। एसटीडी हैं , एक निश्चित लंबाई के साथ आवश्यक प्रकार। अब समिति पर रूस का प्रतिनिधि चर लंबाई (अच्छी तरह से, फिर से, शून्य लागत अमूर्त के साथ) का एक अंतर खींच रहा है

अनातोली: क्या मुझे सही ढंग से याद है कि एक विधि के लिए सूचक का एक गैर-निर्धारक आकार भी है? यही है, अलग-अलग संकलक और विभिन्न प्लेटफार्मों के तहत, पॉइंटर्स अलग हैं?

सर्गेई: स्वाभाविक रूप से, यह वास्तुकला है। जब आप हार्डवेयर के करीब होते हैं, तो आप पॉइंटर के आकार की गारंटी कैसे दे सकते हैं, यदि आप 8-बिट पर हैं, तो 64-बिट पर?

अनातोली: और कोई उसके बाद अंक पर अंकगणित कैसे कर सकता है? यह पागल है।

सर्गेई: मेरा मतलब है? खैर, ध्यान से।

अनातोली: मैं देख रहा हूं। दृष्टिकोण हर जगह स्पष्ट है, ध्यान से हैंडल के साथ सब कुछ नियंत्रित करना।

सेर्गेई: ठीक है, हाँ। फिर से, आधुनिक सी ++ मानकों में दृष्टिकोण विकसित किए गए हैं ... अगर हम पसंद के बारे में बात करते हैं, तो आधुनिक प्लसस में, वास्तव में, एक विकल्प है कि कचरा कलेक्टर का उपयोग करना है या नहीं। यह सिर्फ इतना है कि जीसी को संदर्भ काउंटर पर बनाया गया है।

सामान्य तौर पर, आपके शब्दों में, सहकर्मियों, मुझे, खेद है, आपको लगता है कि आपने लंबे समय से आधुनिक प्लसस के बारे में अपने ज्ञान को अपडेट नहीं किया है।

अब, स्ट्रैसेंसेप जैसे लोग, जो प्लस देवताओं के पैंटियन का हिस्सा हैं, आधुनिक C ++ को कैसे पढ़ाया जाए, यह जानने के लिए बहुत से कॉल आते हैं। समस्या यह है कि लोग 2003 सी ++ श्रेणियों में क्या सोचते हैं, और उसी श्रेणियों में सिखाते हैं। और इसके संबंध में दिलचस्प नई परियोजनाएं और दृष्टिकोण हैं, आधुनिक पाठ्यक्रम हैं - मान लीजिए कि यैंडेक्स के लोगों ने एक अद्भुत पाठ्यक्रम बनाया है। और अब प्लसस में इसे एक खराब शिष्टाचार माना जाता है, उदाहरण के लिए, शुद्ध नए का उपयोग करना और हटाना।

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

सबसे सरल उदाहरण रेंज ( रेंज-वी 3 और इस पूरे विषय) के बारे में बात कर रहा है। एक तरफ, यह सब महान है: ऐसी चीजें हैं जो कई वर्षों से C # में हैं, उदाहरण के लिए, मानक संग्रह के किसी भी परिवर्तन द्वारा कैलेंडर बनाने की अनुमति देना। दूसरी ओर, इसे C ++ में लागू करने का तरीका C # की तुलना में केवल अप्रिय है: यह भारी है, पठनीय नहीं है।

सर्गेई: यह स्वादिष्ट है। मैं, इसके विपरीत, इसे पसंद करता हूं। जैसा कि मैंने इसे समझा, आप निबलर रिपोर्ट और इसकी प्रस्तुति के लिए हैं ...

दिमित्री: आप देखते हैं, जब किसी संग्रह को फ़िल्टर करने के लिए "या" ऑपरेटर का उपयोग किया जाता है, तो मुझे तुरंत इस बारे में प्रश्न करने होते हैं। सी # और जावा दोनों ने सामान्य तरीकों से डॉट के माध्यम से सब कुछ किया।

सेर्गेई: और यह मुझे लगता है कि यह बैश से प्रेरित है। यानी यह सिर्फ एक पाइप है।

दिमित्री: ठीक है, हाँ, शायद यह इस दृष्टिकोण में कुछ समझाता है।

सेर्गेई: यह बहुत कुछ समझाता है! पॉवरशेल के बारे में बात करते हैं, क्योंकि हम बैश के बारे में बात कर रहे हैं। किसने देखा पॉवरशेल?

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

सर्गेई: रेंज पाइप में, यह बहुत ही ...

दिमित्री: रेंज में उनका उपयोग किया जाता है, मेरी राय में, निम्न कारण के लिए ... मैं यह कहूंगा: यदि सी ++ में विस्तार के तरीके या विस्तार कार्य थे, तो आप उनका उपयोग करेंगे, निश्चित रूप से। क्योंकि सबसे स्वाभाविक बात अगर आपको किसी संग्रह को क्रमबद्ध करने की आवश्यकता है तो "संग्रह" फ़िल्टर () लिखें। और नहीं "संग्रह | दृश्य :: फ़िल्टर () "।

अनातोली: मुझे यह भी आभास हुआ कि आपको 20 साल से पैरों में गोली लगी थी, चेहरे पर चोट लगी थी, दीवार पर अपना सिर पीट लिया था, और फिर अंत में बोले: “अच्छा, अब हम 20 वीं कक्षा में खूबसूरती से सब कुछ कर चुके हैं, अब सिखाते हैं पेशेवरों सही हैं। ” हाँ, कोई भी उन्हें सही ढंग से सिखाना नहीं चाहता है! यही है, यह एक दीर्घकालिक दर्द है।

सेर्गेई: कृपया मत सिखाओ। क्या समस्या है? सी # में लिखें - इस पर व्यापार करें, एम्बेडेड लिखें। मुझे कोई आपत्ति नहीं है।

अनातोली: ठीक है, वहाँ संकीर्ण niches हैं जहां पेशेवरों अभी भी वहाँ हैं।

सेर्गेई: एंबेडेड एक "संकीर्ण आला" है ... अभी, मेरी रसोई में चारों ओर देख रहा हूं, मुझे कंप्यूटर का एक गुच्छा दिखाई देता है।

दिमित्री: हर बार जब मैं विमान से उड़ान भरता हूं, मुझे लगता है: "धिक्कार है, मुझे उम्मीद है कि इन प्लसस ने वहां सब कुछ अच्छा लिखा है।"

सेर्गेई: ठीक है, वैसे, मुख्य रूप से अडा है, जहां तक ​​मुझे याद है।

दिमित्री: अडा वहाँ हावी है, हाँ।

अनातोली: वैसे, मैं हाल ही में एक उत्कृष्ट लेख में आया था, जहां विभिन्न भाषाओं में लेखक (लगभग 10) ने 10-गीगाबिट इंटेल कार्ड के लिए एक निम्न-स्तरीय ड्राइवर - नेटवर्क ड्राइवर लिखा था। C से Swift, JS, Python और स्वाभाविक रूप से C #। यदि हम इन ग्राफों को देखें, जो उन्हें मिला, तो C # बड़े बैचों पर (जब लॉन्च की लागत को समतल किया जाता है) C और Rust के बराबर होता है।



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

सेर्गेई: ठीक है, यह फिर से शुरू होता है। बात यह है कि जब आप उस जावा, उस C # का अनुकूलन शुरू करते हैं, तो यह स्पष्ट नहीं हो जाता है कि प्लसस पर क्यों नहीं लिखना चाहिए। क्योंकि आपको विशिष्ट ज्ञान की आवश्यकता है। और, जैसा कि मुझे प्रतीत होता है, C # और Java जैसी भाषाओं का लाभ सम्‍मिलित है - बहुत अधिक इनपुट सीमा नहीं है। जहां तक ​​मैं समझता हूं, बस दिमित्री के बारे में क्या बात कर रहा था: कोड पठनीयता, बहुत कुछ सीखना, कुछ अवधारणाओं को समझाने के लिए कठिन, और इसी तरह।

अनातोली: मैं अपना सारा समय "सामान्य" सी # में लिखने का 99% काम करता हूं - सुरक्षित, स्थिर और हर समय काम करना। और समय का 1% मैं किसी तरह का तेज, निम्न-स्तरीय कोड लिखना चाहता हूं। और यह C # मुझे भी अनुमति देता है। लेकिन मेरा मुख्य उपकरण अभी भी स्थिर है, पठनीय है, त्रुटियों के बिना ...

दिमित्री: तोल्या, मैं आपको एक सरल उदाहरण देता हूं: वैश्वीकरण। .NET में वैश्वीकरण के साथ, सब कुछ बहुत खराब है, इस तथ्य के बावजूद कि System.Numerics.Vectors को धीरे-धीरे देखा जा रहा है। और यह मेरे हिस्से के लिए क्या करता है, उदाहरण के लिए? इस तथ्य के लिए कि यदि आप बाजार में चारों ओर घूम रहे हैं और .NET के लिए एक गणितीय पुस्तकालय खरीद रहे हैं, तो यह पेशेवरों (पूर्ण आवरण के साथ) पर लिखा है। क्योंकि .NET में व्यावहारिक रूप से हार्डवेयर त्वरण (AVX, आदि) तक पहुंच नहीं है, यह अब कुछ भ्रूण अवस्था में है।

अनातोली: आंतरिक कोर .NET कोर 3 में जारी किए जाते हैं जहां आप सीधे एवीएक्स तक पहुंच सकते हैं। वे वास्तव में अपनी प्रारंभिक अवस्था में हैं, लेकिन बुनियादी चीजें हैं, और बाकी काफी चलती है।

दिमित्री: आप समझते हैं, हमारे पास 2019 यार्ड में है। इस सभी गणितीय के उपयोगकर्ता के रूप में अच्छा हुआ, मैंने इसके लिए इंतजार नहीं किया। और परिणामस्वरूप, मेरे लिए, अगर मैं जल्दी से कुछ पर विचार करना चाहता हूं, तो C # अब उम्मीदवार नहीं है। क्योंकि C ++ लाइब्रेरी पहले से मौजूद हैं। शायद इसके लिए समय पहले ही खो दिया गया है।

अनातोली: यह मुझे लगता है कि सी # प्लसस की दिशा में आगे बढ़ रहा है, यह उनके बाजार को जीतने की कोशिश कर रहा है। लेकिन प्लस अब कहीं नहीं जा रहे हैं।

सेर्गेई: यह कहाँ से आता है? "प्लसस कहीं नहीं जाना है" का क्या मतलब है?

अनातोली: जब वे मुझे 2019 में बताएंगे कि मानक में पुनरावृत्त होंगे, तो लंबोदर के बारे में कुछ प्रगति होगी, ऐसा मुझे लगता है कि ...

सर्गेई: मुझे नहीं पता कि आप पुनरावृत्तियों और मेमनों के बारे में क्यों बात कर रहे हैं, मुझे समझ नहीं आया कि पत्थर किस तरह से था ...

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

सर्गेई: यह सब इस बात पर निर्भर करता है कि यह आवश्यक है या नहीं। हम पैटर्न के मिलान पर चर्चा कर रहे हैं। लेकिन अभी तक इस बात के कोई तर्क नहीं हैं कि पेशेवरों में इसकी जरूरत है या नहीं।

दिमित्री: मैंने प्लसस से बहुत सी समान टिप्पणियां सुनी हैं, जो कहती हैं कि "हालांकि अन्य भाषाओं में इस या उस दृष्टिकोण की एक स्पष्ट उपस्थिति पहले से ही है, यह पहले से ही काम कर चुका है, लोग इसे पसंद करते हैं और इस पर समाधान बनाते हैं, हम अभी भी प्लसस में ऐसा नहीं करते हैं," क्योंकि यह मुहावरेदार नहीं है। " और यह मुझे लगता है कि जावा एक ही छेद में गिर गया। जावा ने कहा "नहीं दोस्तों, हमारे पास प्रतिनिधि नहीं हैं।" और जावा में अभी भी प्रतिनिधियों की कोई अवधारणा नहीं है, लेकिन .NET में यह सब ठीक है।

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

दिमित्री: ठीक है, शून्य लागत अमूर्त एक कोडांतरक है। यदि हम सामान्य रूप से शून्य लागत अमूर्त चाहते हैं, तो हमें असेंबलर में सब कुछ लिखने की आवश्यकता है।

सेर्गेई: कोई अमूर्तता नहीं है।

दिमित्री: असेंबलर बाइनरी कोड पर एक अमूर्त है। यह सिर्फ दूसरी पीढ़ी है, तीसरी नहीं।

सेर्गेई: तो, "सुविधाजनक चीजों" के सभी प्रकार के बारे में, यह पता चला है कि यह स्पष्ट नहीं है कि उन्हें जल्दी से कैसे काम करना है।

दिमित्री: उन्हें धीमी गति से काम करने दें। अतुल्यकालिक पुनरावृत्तियों, कोरटाइन के साथ विचार, यह सब - .NET में C # के साथ उपज का कीवर्ड अब नहीं जानता कि कितने रिलीज महान काम करते हैं। हां, पर्दे के पीछे बहुत बड़ी राजकीय मशीनें बनाई जा रही हैं, बस जादू। लेकिन async / प्रतीक्षा भी जादू बनाता है, और पुनरावृत्तियों में। लेकिन हर कोई इसका उपयोग करता है, और यह वास्तव में सुविधाजनक है।

सेर्गेई: कोराउटाइन ने प्लसस, हेलो को जोड़ा।

दिमित्री: ठीक है, हाँ, प्रगति की जा रही है। लेकिन कोरियोटिन अब दिखाई दे रहे हैं, 10 साल पहले नहीं।

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

दिमित्री: हाँ, लेकिन आप एक आधुनिक संकलक के साथ C # 1.0 में लिखे गए कोड को संकलित करते हैं।

सर्गेई: यह सच नहीं है। चर्चा की शुरुआत में, मैंने कहा कि .NET के मेरे शुरुआती संस्करणों पर एक अपडेट आया, और अचानक सभी कार्यक्रमों ने काम करना बंद कर दिया।

दिमित्री: हो सकता है कि आपके द्वारा उपयोग किए गए एपीआई बस बदल गए हों। यहां आपको लाइब्रेरी और प्रोग्रामिंग भाषा को अलग करने की आवश्यकता है।

सेर्गेई: मेरे पास कुछ भी नहीं था, बस सी #। मैं छोटा था, ये पहले साल थे।

दिमित्री: मुझे याद है कि C # 4 में केवल एक ब्रेकिंग चेंज था - फॉरच के व्यवहार में थोड़ा बदलाव। बेशक, संस्करणों में 1.x सब कुछ अधिक अशांत हो सकता है, लेकिन अब हम निश्चित रूप से उस चरण में नहीं हैं जहां कोई अचानक कुछ तोड़ता है।

अनातोली: ठीक है, आधिकारिक तौर पर Microsoft उस स्थिति का पालन करता है जो सख्ती से पिछड़ी संगतता की निगरानी करता है, वे बड़ी संख्या में मशीनों और कोड बेस पर नए संस्करणों का परीक्षण करते हैं। शायद आपके पास एक बग या ऐसा कुछ था।

दिमित्री: सामान्य तौर पर, .NET पिछड़ी अनुकूलता पर भी नजर रखता है, लेकिन प्रगति की गति ने C ++ और Java दोनों को जकड़ लिया है।

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

दिमित्री: तो आपका तर्क यह है कि हम सभी समितियों के बंधक हैं जो नवाचार द्वारा संचालित नहीं हैं?

सर्गेई: समस्या यह है कि आप ऐसा समाधान नहीं चुनते जो सभी को संतुष्ट करे। यह उपकरण इतना व्यापक रूप से वितरित किया जाता है कि इसका उपयोग बहुत सारी कंपनियों द्वारा किया जाता है। आपको वही कॉरआउट्स याद थे: उन्होंने उन्हें देर से क्यों प्राप्त किया? क्योंकि Microsoft, ऐसा लगता है, Google से सहमत नहीं हो सकता है। दो कार्यान्वयन थे - मुझे याद नहीं है कि कौन स्टैकफुल के पीछे था और कौन स्टैकलेस के पीछे था, लेकिन सहमत नहीं हो सकता था। क्योंकि दोनों कंपनियां बड़ी हैं, उनके पास विशाल कोड आधार हैं जिनमें पहले से ही एक समाधान है, और वे इसे फिर से लिखने से इनकार करते हैं।

दिमित्री: पाठक के दृष्टिकोण से, किसी को यह महसूस होगा कि वे उस पर एक उच्च घंटी टॉवर से थूकते हैं, क्योंकि कॉर्पोरेट हित हैं, वे इंटरलोवर्स में लगे हुए हैं, और यह सब आपको चिंता नहीं करता है - जाओ, अभाव, "उन्हें केक खाने दो"

सेर्गेई: काफी विपरीत। समिति यह चुनने का प्रयास कर रही है ताकि एक सामान्य व्यक्ति को नुकसान न उठाना पड़े। और अक्सर यह मुश्किल है।

दिमित्री: ठीक है, मैं खुद के लिए कह सकता हूं कि मुझे नुकसान नहीं हुआ अगर शून्य लागत कहीं सीधे जाती है, लेकिन बाइनरी ट्री के माध्यम से चलने और समय चर के बिना अलग-अलग तरीकों से पुनरावृति करने के लिए किसी प्रकार का लचीला अवसर होगा। yield, - - — , , , , - .

: , , , , - .

: , Boost .

: , . Boost , , , … - . std::string, , . size(), length(), : , - ? - , , . , . , , , . , , , - .




: , , , . ?

: , , «», .

: .

: embedded-, include, ?

: . embedded -.

, , - ? , , . ?

: . 150 . - , . .

: , !

: , Steam, , , 64 . , 150 ?

: , , .

: , -. ? , , , — , zero cost abstractions . -?

: , , , , ?

: , . , , .

: , , , . — , . , . , , . , . -. C.

: . «». : , . , , , . . , .

: , . . , . proposal. .

: , proposal. , « »: , STL , . , - , .

: STL . STL . , , STL — , , .

: , — , ? , greenfield. brownfield development, . — , . — . ?

: , . , , . , . , , . G++ , Clang . .

: , , , . « , A, B». , .NET, . , , , , , ?

: , , . , C++ 2.0. ++C++. , C.

: , . , , . , , , , #include #import - — . , . , , , , .

. , . , , , C# C++, .

: , , 10 . , , , , , , . « », . , .

C# , C++. , C# . , , . , , , , JIT' — , , - ( int). , , , , .

: , , , C# — . , , C++ . , . ( , ) — cutting edge. , UI- C++, , . C# — . C++ , .

, . , , , C++ , , , . , .

, C# Microsoft. , .NET Foundation, , , Microsoft. , .



C++ Russia DotNext . : ?

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


All Articles