क्या ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग लैंग्वेज मौजूद हैं जो क्लास-बेस्ड नहीं हैं?


44

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


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

4
@kylben: "ओरिएंटेड" एक बिना रुकावट के खिंचाव है। आप सी को ऑब्जेक्ट-ओरिएंटेड व्यवहार में बदल सकते हैं। आप इसे इस तरह से उन्मुख होने में शामिल नहीं कर सकते।
डेविड थॉर्नले

जवाबों:


74

जहाँ तक मुझे पता है, स्व मूल भाषा है जिसने प्रोटोटाइप के आधार पर "क्लास-फ्री" प्रतिमान का आविष्कार किया था । यह पहले से ही अस्तित्व में है (एक प्रायोगिक चरण में) 1980 के दशक में और स्मॉलटाक के प्रोटोटाइप पैटर्न के सुरुचिपूर्ण उपयोग को चरम पर धकेलता है , जैसे कि कक्षाएं पूरी तरह से समाप्त हो जाती हैं।

इसने अन्य सभी "वर्ग-मुक्त" OO भाषाओं को प्रभावित किया, जिनके बारे में मुझे पता है:

  • सबसे प्रमुख रूप से जावास्क्रिप्ट,
  • शास्त्रीय प्रोग्रामिंग भाषा और पर्यावरण स्क्वीक (जो स्मालटाक के शीर्ष पर बनाया गया है)
  • बहु-प्रतिमान लिपि भाषा लुआ

2
@ अदम: स्थिर टाइपिंग के बिना, यह सब सिर्फ वाक्यात्मक चीनी नहीं है?
केविन क्लाइन

5
@DeadMG OO भाषा वह नहीं है जो आपको OO विचारों को कार्यान्वित करने में सक्षम बनाती है, बल्कि वह जो आपके लिए करता है :)
Piotr Dobrogost

4
दरअसल, सिमुला (1960) और स्मॉलटाक -71 (साथ ही स्मॉलटाक -72) दोनों में कक्षाएं नहीं थीं, जो कि लगभग तीन दशकों से सेल्फ से संबंधित हैं। कक्षाएं केवल सिमूला -67 और स्मॉलटाक -74 में जोड़ी गईं (और एलन के उन्हें एक गलती मानते हैं, या अधिक सटीक रूप से एक आवश्यक बुराई है)।
जोर्ज डब्ल्यू मित्तग

2
@kevincline: यकीन नहीं होता कि आप क्या कर रहे हैं; OO और स्टेटिक टाइपिंग पूरी तरह से ऑर्थोगोनल हैं।
पॉल बिगगर

2
1979 में एमआईटी में सिमुला (जो कक्षा प्रतिमान पर ले जाती थी) के अलावा फ्लेवर पेश किया गया था, और सीएलओएस के अग्रदूत थे, दोनों ने स्व।
मैथ्यू फ्लिन

32

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


2
कोई भी ECMAScript संस्करण प्रोटोटाइप प्रतिमान का उपयोग करता है।
zzzzBov

खैर, लगभग किसी भी प्रकार। ActionScript (फ्लैश भाषा) कक्षाओं का उपयोग करता है, हालांकि अंतर्निहित VM उन्हें प्रोटोटाइप के संदर्भ में लागू कर सकता है।
mjfgates

@mjfgates, Actionscript 2 का इस्तेमाल ECMAScript आधारित हुआ करता था और जावास्क्रिप्ट बहुत कुछ मिलता जुलता था। Actionscript 3 उससे दूर जा रही है, लेकिन फिर भी अपनी गतिशील प्रकृति रखती है। आप किसी भी चर को मजबूत / कमजोर कर सकते हैं क्योंकि सार सब कुछ एक वस्तु है।
J_A_X

13

दुनिया में सबसे लोकप्रिय वस्तु-उन्मुख प्रोग्रामिंग भाषा में कक्षाएं नहीं हैं, इसे जावास्क्रिप्ट कहा जाता है और यह प्रोटोटाइप आधारित है: http://en.wikipedia.org/wiki/Prototyp-based_programming


11
"दुनिया में सबसे लोकप्रिय वस्तु-उन्मुख प्रोग्रामिंग भाषा"? मुझे उस दावे पर बिल्कुल यकीन नहीं है।
थॉमस ओवेन्स

8
@ThomasOwens, वेब पर इसके समावेश के कारण, आप आसानी से कह सकते हैं कि हर आधुनिक वेब-सक्षम प्लेटफॉर्म (मोबाइल उपकरणों सहित) में जावास्क्रिप्ट दुभाषिया शामिल है। यह एक बहुत मजबूत मामला है कि यह वर्तमान में अस्तित्व में सबसे लोकप्रिय प्रोटोटाइप आधारित भाषा है। (जब तक आपको नहीं लगता कि आप "SELF" के लिए एक समान तर्क दे सकते हैं)
riwalk

1
जावास्क्रिप्ट निश्चित रूप से दुनिया में सबसे व्यापक रूप से इस्तेमाल की जाने वाली प्रोग्रामिंग भाषाओं में से एक है, लेकिन मैं सबसे अधिक उपयोग करने की उम्मीद करूँगा सादे पुराने अनिवार्य या प्रक्रियात्मक, शायद पहलू-आधारित प्रोग्रामिंग (कॉलबैक? AJAX? इवेंट हैंडलर?) के एक बिट के साथ और वहाँ, इसलिए जावास्क्रिप्ट को 'सबसे लोकप्रिय ओओपी भाषा' कहना काफी न्यायसंगत नहीं है।
tdammers

9
अपनी लोकप्रियता के गुणों पर चर्चा को आगे बढ़ाने के लिए मैं "सर्वव्यापी" भी कहूंगा।
एंथनी पेग्राम

3
@ Stargazer712: मुझे भाषा का बड़ा होना पसंद नहीं है, लेकिन वह दावा करता है कि "दुनिया में सबसे लोकप्रिय वस्तु-उन्मुख प्रोग्रामिंग भाषा [ed: Javascript] में कक्षाएं नहीं हैं"। यह दो दावों से विघटित हो सकता है: "जावास्क्रिप्ट सबसे लोकप्रिय वस्तु उन्मुख प्रोग्रामिंग भाषा है" और "जावास्क्रिप्ट में कक्षाएं नहीं हैं"; दोनों जिनमें से, मैं सहमत हूं।
लेयन रेयान

6

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

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


6

किले कक्षाओं के बजाय लक्षणों के आधार पर एक वस्तु-उन्मुख भाषा है। अंतर मुख्य रूप से कार्यान्वयन रचना में है। एक वस्तु का व्यवहार (विधि परिभाषाएं) अभी भी कार्यक्रम पाठ में एक विशिष्ट बिंदु पर घोषणाओं द्वारा निर्धारित किया जाता है। तो इस मायने में यह क्लास-आधारित सिस्टम के समान है।

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

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


5

Ada, 1995 के संशोधन के रूप में, Ada ऑब्जेक्ट-ओरिएंटेड है, लेकिन कई अन्य OO भाषाओं के विपरीत यह ऑब्जेक्ट-ओरिएंटेड प्रकार और मॉड्यूल को एक "क्लास" नामक एकल निर्माण में संयोजित नहीं करता है। एक प्रकार को "वर्ग फू" घोषित करने के बजाय, और सभी संबंधित विधि घोषणाओं को वर्ग घोषणा के अंदर रखकर, आप एक पैकेज घोषित करते हैं recordऔर पैकेज के अंदर प्रकार (ए ) और अन्य चीजों की घोषणा करते हैं । यह उस तरह से "क्लास-फ्री" नहीं है जैसे कि कुछ अन्य उल्लेखित भाषाएं हैं, यह चीजों को व्यवस्थित करने का सिर्फ एक अलग तरीका है।

Ada 95 के ऑब्जेक्ट-ओरिएंटेड फीचर्स को भाषा के मौजूदा 1983 संस्करण में जोड़ा गया था; इसने मौजूदा रिकॉर्ड और पैकेज निर्माणों का विस्तार किया जो विरासत वगैरह का समर्थन करता है।


यही मुझे याद है, आपको प्रत्येक सदस्य समारोह में अपना रिकॉर्ड पास करने की भी ज़रूरत है
निक्को

@ निक्को: यह वही है जो हर वस्तु-उन्मुख भाषा में पर्दे के पीछे होता है, और पायथन और सीएलओएस (आम लिस्प) में काफी स्पष्ट रूप से।
मार्सिन

5

Io एक और प्रोटोटाइप-आधारित ऑब्जेक्ट-ओरिएंटेड भाषा है। यह वास्तव में कई भाषाओं से प्रेरणा लेता है जो पहले से ही अन्य उत्तरों में उल्लिखित हैं।

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


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