आधुनिक पुस्तकालय OOP का उपयोग क्यों नहीं करते हैं


20

मैं एक शुरुआती स्तर का सी ++ प्रोग्रामर हूं, लेकिन मैं भाषा की अवधारणाओं को काफी अच्छी तरह से समझता हूं। जब मैंने SDL, OpenGL (शायद कुछ और भी) जैसे बाहरी C ++ पुस्तकालयों को सीखना शुरू किया, तो मेरे महान आश्चर्य के लिए मुझे पता चला कि वे C ++ अवधारणाओं का उपयोग बिल्कुल नहीं करते हैं।

उदाहरण के लिए, न तो SDL, और न ही OpenGL कक्षाओं या अपवादों का उपयोग करता है, कार्यों और त्रुटि कोड को प्राथमिकता देता है। OpenGL में मैंने glVertex2f जैसे फ़ंक्शंस को देखा है, जो इनपुट के रूप में 2 फ़्लोट वैरिएबल लेता है और शायद एक टेम्पलेट के रूप में बेहतर होगा। इसके अलावा, ये पुस्तकालय कभी-कभी मार्कोस का उपयोग करते हैं, जबकि ऐसा लगता है कि मैक्रों का उपयोग करना एक सामान्य समझौता है।

सभी सभी में, वे सी शैली में सी ++ शैली की तुलना में अधिक लिखे गए लगते हैं। लेकिन वे पूरी तरह से अलग भाषाएं हैं, क्या वे नहीं हैं?

प्रश्न यह है कि आधुनिक पुस्तकालयों में लिखी गई भाषा के लाभों का उपयोग क्यों नहीं किया जाता है?


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

5
इसके अलावा, न तो ओपनजीएल और न ही "आधुनिक" इस अर्थ में हैं कि वे युवा हैं, या कम से कम फैंसी नए आकर्षण को अपनाने में सक्षम हैं। दोनों का एक लंबा इतिहास है (OpenGL 1.1: 1997; SDL: 1998) और पीछे-संगतता संगतता।

1
बस इतना कहा गया है: DirectX बहुत अधिक आपत्तिजनक है (यदि काफी कम स्तर का है)।
cHao

1
Native C ++ लाइब्रेरी, जैसे stl और Boost, भद्दे, पुराने, बेकार OOP अवधारणाओं का भी उपयोग नहीं करते हैं।
SK- तर्क

5
मुझे लगता है कि आपकी गलतफहमी यहाँ है कि SDL और OpenGL बहुत सारे "आधुनिक पुस्तकालयों" के प्रतिनिधि हैं। उदाहरण के लिए, बहुत लोकप्रिय क्यूटी लाइब्रेरी पूरी तरह से ऑब्जेक्ट ओरिएंटेड है। आपका प्रश्न शीर्षक बेहतर होना चाहिए "SDL और OpenGL OOP का उपयोग क्यों नहीं करते"?
डॉक ब्राउन

जवाबों:


31

OpenGL और SDL दोनों C लाइब्रेरियाँ हैं और दुनिया के बाकी हिस्सों के लिए एक C इंटरफ़ेस का खुलासा करते हैं (जैसा कि हर भाषा में C के साथ इंटरफ़ेस हो सकता है लेकिन C ++ के साथ जरूरी नहीं है)। इस प्रकार, वे प्रक्रियात्मक इंटरफ़ेस तक सीमित हैं जो C आपको डेटा संरचनाओं को घोषित करने और उपयोग करने का C और तरीका देता है।

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

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


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

प्रभावी या कुशल? किसी भी तरह से, यह एसडीएल या ओपनगेल के लिए सी ++ आवरण को खोजने के लिए काफी आसान होना चाहिए। एक त्वरित Google ने इस रैपर को OpenGL के लिए लाया: oglplus.org - यह पता नहीं है कि यह कितना अच्छा है, मैंने इसका उपयोग नहीं किया है।
टिमो जूसच

1
हाँ, बहुत सी परियोजनाएँ हैं जो ओपन सीएल को अधिक सी ++ ish इंटरफेस के साथ लपेटने का प्रयास करती हैं (मेरे पास एक स्वयं भी है, हालांकि मैं कई विशेषताओं से परहेज करता हूं और ज्यादातर ओवरलोडिंग और ऐसे जोड़ देता हूं)। मेरी धारणा यह है कि अधिकांश बहुत सारे सामान जोड़ते हैं, जो शुद्ध ओपनग्लिप स्निपेट का अनुवाद करना और मानक अनुकूलन को लागू करना कठिन बनाता है (डेटा-ओरिएंटेड डिज़ाइन देखें; कुछ गेम इसके द्वारा शपथ लेते हैं)। लेकिन हर तरह से आपको निराश नहीं करते। वैकल्पिक रूप से, आपके पास नंगे-हड्डियों वाले ग्राफिक्स एपीआई के बजाय पूरे गेम इंजन (जैसे कि इरक्लिक्ट या ऑग्रे) का उपयोग करके अधिक भाग्य हो सकता है।

ठीक है, मुझे लगता है कि मेरे पास वे सभी उत्तर हैं जिनकी मुझे तलाश थी। सबको धन्यवाद!
सेज

यह भी ध्यान दिया जाना चाहिए कि ग्राफिक्स हार्डवेयर कक्षाओं पर समझ या प्रदर्शन नहीं करता है। आपके पास है float3क्योंकि सभी हार्डवेयर फ़्लोट के सरणियों से संबंधित है। "वर्ग" संरचना (यह धारणा कि एक वेक्टर 2, 3 या 4 फ़्लोट्स है) यह सब अंतर्निहित है कि कार्ड को मेमोरी के ढेर तक पहुंचने के लिए कैसे कहा जाता है। प्रोग्रामिंग ग्राफिक्स करते समय कक्षाओं में कोशिश करना और सोचना अच्छा हो सकता है, लेकिन मेरी राय में, उस तरह का काम हार्डवेयर के काफी करीब है कि इसे लागू करने के गंदे विवरणों को दूर करने में मदद करने की तुलना में अधिक परेशानी होती है।
डेविड काउडन

10

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

  1. C और C ++ पूरी तरह से अलग सिस्टम नहीं हैं। C ++ C के शीर्ष पर बनाया गया था और a) C कोड का आसानी से उपभोग कर सकता है और b) C- स्टाइल एपिस प्रदान करने में पूरी तरह सक्षम है।
  2. सी इंटरफेस का लाभ यह है कि यह दुनिया के बाकी हिस्सों से बहुत आसानी से पीने योग्य है। इंटरोप परतें हैं जो सी एपीआई को किसी भी भाषा (अजगर, जावा, सी #, पीएचपी ...) के बारे में बताती हैं, जहां C ++ इंटरफ़ेस से ..... अच्छी तरह से उपभोग करने योग्य है, शायद C ++ और अभी भी नहीं ( विभिन्न संकलक, एक ही संकलक के विभिन्न संस्करण मुद्दों का कारण बनेंगे)

अतीत में, काम में एक परियोजना में एक प्रयोग के रूप में, मैंने एक C ++ DLL से "OO" इंटरफ़ेस को उजागर करने का निर्णय लिया। आंतरिक विवरण छिपाने और अन्य चीजों के एक समूह से बचने के लिए, मैंने विंडोज COM (घटक ऑब्जेक्ट मॉडल) को फिर से बनाना लगभग समाप्त कर दिया है। उस परियोजना के बाद, मुझे एहसास हुआ कि COM उतना बुरा नहीं है, क्योंकि लोग इसे बाहर कर देते हैं क्योंकि a) यह OOP इंटरफेस को उजागर करता है, b) मेरे द्वारा भागे गए सभी मुद्दों का ध्यान रखता है और c) मानक मानक है जो कई संख्याओं से उपभोग करने योग्य है अन्य भाषाएँ।

लेकिन COM अभी भी अपने सामान के बिना नहीं है। कई मामलों में, नियमित, सी-स्टाइल एपीआई अभी भी एक बेहतर विकल्प है।


7

OpenGL और SDL दोनों C लाइब्रेरी हैं, C ++ लाइब्रेरी नहीं। आप उन्हें C ++ से उपयोग कर सकते हैं, लेकिन वे C में लिखे गए हैं और उनमें C API है (जो अन्य भाषाओं से भी सुलभ है; C ++ एक FFI के माध्यम से एक्सेस करने के लिए एक दर्द है)। सामान्य उद्देश्य (और कुछ विशेष) C ++ पुस्तकालयों और SFML के लिए C ++ मल्टीमीडिया लाइब्रेरी के एक बड़े सरणी के लिए Boost पर एक नज़र डालें ।


3

OpenGL से विशेष रूप से बात करते हुए, OpenGL मूल रूप से API के ढेर का हिस्सा था - OpenGL ने निम्न-स्तर, प्रदर्शन-उन्मुख API, C (या फोरट्रान) से सुलभ, जबकि OpenInventor एक उच्च-स्तरीय ऑब्जेक्ट-उन्मुख API प्रदान करता है, जिसे डिज़ाइन किया गया है C ++ से उपयोग किया जा सकता है, और एक उच्च-स्तरीय दृश्य-ग्राफ़ API प्रदान कर रहा है, और फ़ाइलों को / से और GUI एकीकरण को पढ़ने / पढ़ने के लिए सार।

OpenGL ने OpenInventor की तुलना में बहुत आगे जाना समाप्त कर दिया (यह एक अधिक दबाव की आवश्यकता को भर देता है, वीडियो हार्डवेयर निर्माताओं को इसके लिए अनुकूलन करने के लिए कुछ देता है, और एक सामान्य निम्न-स्तरीय एपीआई लोग प्रदान करता है जो सीधे 3D त्वरण हार्डवेयर से निपटने के बजाय लक्ष्य कर सकता है)। लेकिन OpenInventor अभी भी बाहर है, और Unix / X11, Windows और MacOS X / कोको के लिए समर्थन के साथ एक अच्छा खुला स्रोत कार्यान्वयन है - Coin3D।


-2

वे पुस्तकालय दूरस्थ रूप से आधुनिक नहीं हैं। वे सी एपीआई, और उस पर बुरे हैं। आपका आधार त्रुटिपूर्ण है।


OpenGL आधुनिक नहीं है?
जेम्स

1
मैं वास्तव में इस से सहमत होना होगा। ओपनजीएल आधुनिक नहीं है कि वह जिस राज्य का प्रबंधन और प्रबंधन करता है, उसका मॉडल 1990 के दशक की शुरुआत से हार्डवेयर पर आधारित है। किसी विशेष इकाई पर एक विशेष लक्ष्य के लिए एक बनावट को बांधने जैसी चीजों को करना, और केवल उन लोगों के लिए सीमित संख्या में उपलब्ध होना जिनके पास वीआरएएम में आपके कितने बनावट हैं, बहुत आधुनिक नहीं है।
user1118321
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.