क्या C और C ++ के बीच कोई भाषा है?


18

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

हालाँकि, C के पास ये सरल, सहायक डूडैड्स नहीं हैं जो C ++ कक्षाओं की तरह प्रदान करते हैं, गैर-cstring हैंडलिंग आदि को सरल बनाते हैं, मुझे पता है कि जंप टेबल और इसी तरह का उपयोग करके C को लागू करना सभी संभव है, लेकिन यह कई बार थोड़ा बुरा होता है। , और विभिन्न कारणों से बहुत प्रकार-सुरक्षित नहीं है।

मैं C ++ में ऑब्जेक्ट्स पर अधिक जोर देने का प्रशंसक नहीं हूं, हालांकि, और मैं 'नए' ऑपरेटर और पसंद का बंदूक शर्मसार हूं। उदाहरण के लिए, C ++ को कुछ बहुत अधिक हिचकी लगती हैं, उदाहरण के लिए, सिस्टम प्रोग्रामिंग भाषा के रूप में उपयोग की जाती है।

क्या ऐसी भाषा मौजूद है जो विगेट्स और डूडोड के पैमाने पर C और C ++ के बीच बैठती है?

अस्वीकरण: मेरा मतलब यह विशुद्ध रूप से एक तथ्यात्मक सवाल है। मैं आपको गुस्सा करने का इरादा नहीं करता हूं क्योंकि मैं आपके विचार को साझा नहीं करता हूं कि C {, ++} जो कुछ भी मैं कर रहा हूं वह करने के लिए पर्याप्त है।


10
आप कहते हैं कि आपका प्रश्न "विशुद्ध रूप से तथ्यात्मक" है, लेकिन आप c ++ को छूट दे रहे हैं क्योंकि यह "लगता है" बहुत अधिक हिचकी है। ये हिचकी क्या हैं, और क्या वे सी + + छूट के लिए वैध कारण हैं?
whatsisname

2
Is विगेट्स एंड डूडोड ’का पैमाना क्या है? यदि आप "विशुद्ध रूप से तथ्यात्मक" प्रश्न के वास्तविक उत्तर चाहते हैं, तो आपको अर्थहीन मैट्रिक्स से बचना चाहिए।
कालेब

2
और कुछ चीजें जो आप C ++ के बारे में बताते हैं, कुछ गलत जानकारी देती हैं। newज्यादातर एक बीफ-अप है mallocजो आपके लिए मेमोरी को इनिशियलाइज़ करने का भी ध्यान रख सकता है । "प्लेसमेंट नया" और operator new, आप यह तय कर सकते हैं कि यह मेमोरी कैसे और कहाँ आवंटित करता है। और वस्तु के जोर के रूप में: आपके ऊपर कुछ पंक्तियाँ बताती हैं कि आप कक्षाओं को "सरल, सहायक डूडैड" मानते हैं। मन बना लो!

25
उपयोग C+ Diclaimer: क्षमा करें, मैं सका t resist. Itअप्रैल के रों 1;)
नूट

2
यह निरंतरता परिकल्पना की तरह एक भयानक बहुत लगता है, और शायद एक ही जवाब के साथ। ( en.wikipedia.org/wiki/Continuum_hypothesis )
जॉन स्मिथ

जवाबों:


29

ये वे डायरियाँ हो सकती हैं जिनकी आप तलाश कर रहे हैं ...

गो - http://golang.org/

डी - http://dlang.org/

जंग - http://rust-lang.org/


5
@dtech: D में वह बिंदुहीन GC / "सब कुछ ऑब्जेक्ट से विरासत में मिला है" / मानों को क्रैपी चूसना चाहिए। मैंने पहले ही इसके लिए C # प्राप्त कर लिया है और इसमें वास्तव में सभ्य उपकरण हैं। जाओ, मैं मानता हूँ कि मैंने इसे क्यों त्याग दिया इसकी मेरी स्मृति कुछ हद तक धुंधली है, लेकिन जैसा कि मुझे याद है, इसने कई उपयोगी सुविधाओं को काट दिया।
डेडएमजी

4
-1 के लिए "क्या सी ++ होना चाहिए था"। C ++ यह क्या है और यदि आप इसे संभाल नहीं सकते हैं, तो यह काफी हद तक आपकी समस्या है। आप एक ऐसी भाषा का उपयोग करके इससे निपट सकते हैं जो आपको बेहतर लगती है, लेकिन इसका मतलब यह नहीं है कि सी ++ उस भाषा की तरह होनी चाहिए
बैक

7
@ डीएमजीएमजी डी पर, आपने 2 सार्थक वक्तव्य दिए: जीसी अनिवार्य है और सब कुछ एक वस्तु होना चाहिए। दोनों गलत हैं। इससे मुझे लगता है कि आपका निष्कर्ष वास्तविक ज्ञान की तुलना में अज्ञानता पर आधारित है। मुझे CodexArcanum से सहमत होना होगा।
deadalnix

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

5
@ डीडीएमजी: बिना किसी विरासत के संरचना बनाना एक विशेषता है , न कि "जिम्पिंग"। यह ऐसा कुछ है जो उन्हें सही मिला है, कुछ ऐसा है कि इतिहास में हर OO भाषा में "C ++" नाम नहीं है, सही मिला (Simula, मूल OO भाषा सहित), और यह कि C ++ अविश्वसनीय रूप से गलत है। वंशानुक्रम और मूल्य प्रकार मिश्रित नहीं होते हैं। यह ऑब्जेक्ट आइडेंटिटी को तोड़ता है, यह लिस्कोव सबस्टीट्यूशन को तोड़ता है, यह पूरे OO प्रतिमान को तोड़ता है।
मेसन व्हीलर

19

काफी कुछ भाषाएं हैं (उदाहरण के लिए, जावा, गो, डी, ऑब्जेक्टिव-सी) जो या तो लगभग C ++ के समानांतर हैं, या उन समस्याओं को ठीक करने का प्रयास करती हैं जो लेखकों ने C ++ के साथ देखी थीं।

कम से कम IMO, हालांकि, उनमें से अधिकांश अधिकांश व्यावहारिक उद्देश्यों के लिए C ++ से काफी कमतर हैं।

दुर्भाग्य से, विधानसभा कोड का उत्पादन किया जाएगा, यह जानने के लिए आपके स्पष्ट स्वाद के आधार पर, हम संभवतः उद्देश्य सी और जावा को तुरंत समाप्त कर सकते हैं।

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

वह बहुत ज्यादा डी को केवल एक के रूप में छोड़ देता है जो एक मौका है। यह संभवतः C ++ (इनमें से) के समान है, लेकिन समस्याओं के रूप में आपको जो दिखता है उसे ठीक करने के लिए कम से कम संभावना (IMO)।

यह एक स्पष्ट दृष्टिकोण को छोड़ देता है: C ++ का उपयोग करें, लेकिन केवल उन हिस्सों का उपयोग करें जो आप चाहते हैं, और उन हिस्सों से बचें जो आपको पसंद नहीं हैं।


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

1
@DocBrown शायद यह इसलिए है क्योंकि C ++ को अच्छी तरह से जानना इतना आसान नहीं है।
मैल्कम

3
@ मैल्कम: आधुनिक C ++ में गहराई से सीखना निश्चित रूप से कठिन है। लेकिन दूसरी तरफ, "नए ऑपरेटर की बंदूक शर्म" होने का कोई कारण नहीं है, जो मुझे सिर्फ अंधविश्वास लगता है।
डॉक ब्राउन

3
@ मैल्कम: संभवतः क्योंकि अवधारणा बहुत सरल है । क्या मुझे UTF-32 स्ट्रिंग शाब्दिक या UTF-16 स्ट्रिंग शाब्दिक की आवश्यकता है? खैर, यह जवाब देने के लिए एक बहुत आसान सवाल है, यह मानते हुए कि आप wtf स्ट्रिंग एनकोडिंग की मूल बातें जानते हैं। और हार्ड सुविधाओं की उन भीड़? वे एक कारण के लिए मौजूद हैं । उदाहरण के लिए, जावा की जेनरिक। वे टेम्पलेट्स की तुलना में दयनीय हैं । यकीन है, सीखने के लिए कम है, लेकिन यह सिर्फ इसलिए है क्योंकि वे अभी बहुत उपयोगी नहीं हैं। यह ब्रेनफक की तुलना में अधिक जटिल कुछ भी कॉल करने जैसा है।
डेडएमजी

3
@ मैल्कम: यह बिल्कुल सच नहीं है। भाषा अच्छी / उपयोगी है या नहीं, इसके अलावा 99999 चीजों से लोकप्रियता प्रभावित होती है।
डेडजैम

16

हालाँकि, C के पास ये सरल, सहायक डूडैड्स नहीं हैं जो C ++ कक्षाओं की तरह प्रदान करते हैं, गैर-cstring हैंडलिंग आदि को सरल बनाते हैं, मुझे पता है कि जंप टेबल और इसी तरह का उपयोग करके C को लागू करना सभी संभव है, लेकिन यह कई बार थोड़ा बुरा होता है। , और विभिन्न कारणों से बहुत प्रकार-सुरक्षित नहीं है।

मैं C ++ में ऑब्जेक्ट्स पर अधिक जोर देने का प्रशंसक नहीं हूं, हालांकि, और मैं 'नए' ऑपरेटर और पसंद का बंदूक शर्मसार हूं।

क्षमा करें, मित्र, विरोधाभास अलार्म। गैर-cstring हैंडलिंग की आवश्यकता है new । यह एक मूलभूत आवश्यकता है। तुम्हारे std::stringबिना नहीं हो सकता new। और इसके अलावा, new/ deleteबिल्कुल के बराबर है malloc/ freeलेकिन सुरक्षित है, क्योंकि यह सही निर्माण और विनाश के ढेर वस्तुओं (पूरी तरह से आवश्यक!) और का उपयोग करता है अपवाद एक के बजाय निपटने की गारंटी देता है NULLवापसी, और इसलिए हर फैशन कल्पना में बेहतर है। C ++ 11 में अपने स्वयं के new-स्टाइल फ़ंक्शन को लिखना बहुत संभव है , क्योंकि सही अग्रेषण आपको किसी भी प्रकार के किसी भी निर्माता से निपटने की अनुमति देता है। यदि आप बंदूक के बारे में शर्मिंदा हैं new, तो मेरा सुझाव है कि आप वास्तव में नहीं जानते कि आप किसके साथ काम कर रहे हैं।

ओह, हाँ, और स्मार्ट पॉइंटर्स इसे बनाते हैं ताकि आप कभी भी, कभी भी, वास्तव में खुद में से किसी के साथ व्यवहार न करें।

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


1
मैं सहमत हूँ। C ++ का उपयोग उस तरीके से करना बेहतर है जिस तरीके से आप (संभावित अवर) विकल्प की खोज करना चाहते हैं
dtech

1
मुझे नहीं लगता कि लंबोदर कार्यात्मक रूप से प्रोग्राम करने के लिए पर्याप्त हैं। मैं एक फंक्शन कंपोजिशन ऑपरेटर, करी, इत्यादि की भी अपेक्षा करूंगा। यह भी देखें stackoverflow.com/questions/1981400/functional-programming-in-c । मेरे लिए ऐसा लगता है जैसे COP में OOP करना लगभग ...
जियोर्जियो

@ जियोर्जियो: उस सवाल के जवाब बस कहते हैं "यह मुश्किल है!"। वे कोई सबूत नहीं दिखाते हैं कि यह वास्तव में मुश्किल है । आप फ़ंक्शन रचना के लिए एक अलग ऑपरेटर क्यों चाहते हैं? f(g(x))मेरे लिए बस ठीक काम करने लगता है। और मैं यह भी मानता हूं कि करीने से लाइब्रेरी के रूप में C ++ 11 में किया जा सकता है।
डेडएमजी

1
@DeadMG: फंक्शनल प्रोग्रामिंग में एक फंक्शन कंपोजिशन ऑपरेटर काफी अच्छी तरह से स्थापित, बुनियादी अवधारणा है। मैं इसे एफपी का समर्थन करने वाली भाषा में खोजने की उम्मीद करूंगा। मुझे अन्य फ़ंक्शन (जैसे कि आप यूनिक्स में पाइप के साथ करते हैं) की तरह एक जटिल फ़ंक्शन को परिभाषित करने के लिए बहुत सुविधाजनक (संक्षिप्त) लगता है: चर = k = h का उपयोग किए बिना। जी। f
जियोर्जियो

1
@ जियोर्जियो: std::bindऐसी चीजों का समर्थन करता है।
डेडएमजी

5

C लगभग C ++ का सबसेट है, इसलिए आप C ++ के उन हिस्सों का उपयोग कर सकते हैं जिन्हें आप पसंद करते हैं और बाकी की अवहेलना करते हैं। वैध सी लिखना भी संभव है जो वैध सी ++ भी है।

आप मुहावरेदार C ++ नहीं लिखेंगे, लेकिन यह "इन-इन" जैसा है।

वैकल्पिक रूप से, आप अन्य भाषाओं की जांच कर सकते हैं जो सी को कुछ अधिक शक्तिशाली, सबसे विशेष रूप से डी और ऑब्जेक्टिव-सी की ओर बढ़ाने की कोशिश करते हैं।

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


दरअसल, कंसोल गेम डेवलपमेंट जैसे उद्योगों में काम करना, जहां हम वास्तव में "सी और सी ++ के बीच एक भाषा" चाहते थे, ठीक यही हमने किया। हमने C ++ कार्यक्षमता के सबसेट का उपयोग किया, जिसमें कुछ चीजें ऑफ-लिमिट होती हैं, या प्रदर्शन-क्रिटिकल लूप के भीतर अधिक संभावित ऑफ-लिमिट होती है।
कार्सन 63000

3

बस एक जंगली की पेशकश करने के लिए, आउट ऑफ द बॉक्स जवाब: यदि आप चाहते हैं कि भाषा मौजूद नहीं है, तो खुद को क्यों न बनाएं? वहाँ कई शक्तिशाली भाषा विकास उपकरण हैं, जो कि (F) लेक्स और Yacc / Bison के पुराने स्टैंड-बाय्स के ठीक नीचे हैं। चूँकि आप पहले से ही C को जानते हैं, इसलिए आपको C कोड को आउटपुट करने के लिए अपने "कंपाइलर" की आवश्यकता है, जिसे आप तब अपने मौजूदा टूल चेन के लिए उपयोग करते हैं।

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

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


2

आपने यह नहीं कहा है कि C ++ की विशेषताएं आपके लिए क्या कष्टप्रद हैं। वैसे भी आप उद्देश्य-सी की कोशिश कर सकते हैं। यह C ++ पर स्टैंडर्ड लाइब्रेरी के बजाय ऑब्जेक्ट ओरिएंटेड पर जोर देता है।


2
imho ऑब्जेक्टिव-सी कई वर्गों में सी और अवर को कई तरह से पेश करने का एक मामूली प्रयास है। इसके अलावा यह मैक ओएस एक्स / आईओएस के बाहर बहुत कम उपयोग किया जाता है।
dtech

1
@dtech: दिलचस्प बात यह है कि मेरा एक पूर्व सहयोगी, जो मैक प्रशंसक नहीं है (बल्कि डेबियन / लिनक्स लड़का) आश्वस्त था कि ऑब्जेक्टिव-सी, C ++ की तुलना में C का बहुत अधिक स्वच्छ OO विस्तार था। मैंने हालांकि ऑब्जेक्टिव-सी की कोशिश नहीं की है, इसलिए मेरी इस पर कोई राय नहीं है।
जियोर्जियो

1
@dtech: तब मैं विनम्रतापूर्वक सुझाव देता हूं कि आप अपनी राय पर पुनर्विचार करें;) ऑब्जेक्टिव-सी ऑब्जेक्ट ओरिएंटेशन के बारे में है, और यह उस समय C ++ पर बेहतर काम करता है, क्योंकि यह मैसेज पासिंग का परिचय देता है। जबकि मैं मानता हूं कि भाषा कई तरह से C ++ से नीच है, यह अन्य तरीकों से बहुत बेहतर है।
बैक

@ जिओर्जियो मैं आपकी कॉलगर्ल से सहमत हूँ, हालाँकि ओबज-सी की भी कुछ सीमाएँ हैं (शायद इनमें से कुछ ओब्ज-सी 2.0 के साथ दूर हो गई हैं), जैसे मैं "तरीकों" (चयनकर्ताओं) का ओवरलोडिंग करना चाहूँगा - मुझे पसंद आएगा समारोह में एक ला फोरट्रान ओवरलोडिंग सी ...
शिनटेकेज़ो

2

एंबेडेड दुनिया निर्दिष्ट एंबेडेड सी ++ , जो आप के लिए देख रहे हो सकता है। उन्होंने कई विरासत और इस तरह की चीजों को हटा दिया। जहाँ तक मुझे पता है, यह बहुत ज्यादा बाहर मर गया है।


0

आपको यह C-++, ऑब्जेक्टिव-सी, जावा और C # उपयोगी की तुलना में गहराई से मिल सकता है । व्यक्तिगत रूप से मुझे लगता है कि C ++ की तुलना में C # काम करने के लिए बहुत साफ है। मैंने सिंटैक्स और संख्यात्मक डेटा प्रकारों की समानता के कारण कई परिवर्तन किए बिना कई (संख्यात्मक / गणना) C फ़ंक्शन को C # से पहले पोर्ट किया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.