सेल्फ (प्रोग्रामिंग भाषा)

सेल्फ एक वस्तु-उन्मुख प्रोग्रामिंग भाषा है जो प्रोटोटाइप-आधारित प्रोग्रामिंग की अवधारणा पर आधारित है। सेल्फ की शुरुआत स्मॉलटाक की एक बोली के रूप में हुई, जिसे गतिशील रूप से टाइप किया गया और समय-समय पर संकलन (JIT) के साथ-साथ वस्तुओं के लिए प्रोटोटाइप-आधारित दृष्टिकोण का उपयोग किया गया। यह पहली बार 1980 और 1990 के दशक में भाषा बनाने के लिए एक प्रायोगिक परीक्षण प्रणाली के रूप में उपयोग किया गया था। 2006 में सेल्फ अभी भी क्लेन प्रोजेक्ट के हिस्से के रूप में विकसित किया जा रहा था जो सेल्फ आभासी मशीन थी जो पूरी तरह से सेल्फ में लिखी गई थी। नवीनतम संस्करण 1 मई 2017 में जारी किया गया है।

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

एक बिंदु पर स्मालटाक का एक संस्करण सेल्फ में लागू किया गया था। क्योंकि यह समय-समय पर संकलन (JIT) का उपयोग करने में सक्षम था और इसने भी बहुत अच्छा प्रदर्शन दिया।

इतिहास
सेल्फ को 1986 में PARC (कंपनी) में काम करते हुए ज्यादातर डेविड अनगर और रान्डेल स्मिथ द्वारा बनाया गया था। उनका उद्देश्य वस्तु-उन्मुखी प्रोग्रामिंग भाषा संशोधन में कला की स्थिति को आगे बढ़ाना था। स्मॉलटाक -80 प्रयोगशालाओं द्वारा जारी किया गया था और उद्योग द्वारा इसे गंभीरता से लिया जाने लगा। वे स्टैनफोर्ड विश्वविद्यालय चले गए और 1987 में पहले वर्किंग सेल्फ संकलक का निर्माण करते हुए भाषा पर काम करना जारी रखा गया।

पहली सार्वजनिक रिलीज़ 1990 में हुई थी और अगले साल टीम सन माइक्रोप्रणाली ्स में चली गई जहाँ उन्होंने भाषा पर काम जारी रखा। 1995 में 4.0 संस्करण के साथ बड़े पैमाने पर निष्क्रिय होने तक कई नए रिलीज़ हुए। 4.3 संस्करण 2006 में जारी किया गया था और मैक ओएस एक्स और सोलारिस पर चलता था। 2010 में एक नई रिलीज, संस्करण 4.4 एक समूह द्वारा विकसित किया गया है जिसमें कुछ मूल टीम और स्वतंत्र प्रोग्रामर सम्मिलित हैं और यह मैक ओएस एक्स और लिनक्स के लिए उपलब्ध है जैसा कि निम्नलिखित सभी संस्करण हैं। अनुवर्ती 4.5 जनवरी 2014 में और तीन साल बाद संस्करण 1 मई 2017 में जारी किया गया था।

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

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

प्रोटोटाइप-आधारित प्रोग्रामिंग लैंग्वेज
पारंपरिक वर्ग-आधारित OO भाषाएँ एक गहरी जड़ वाले द्वैत पर आधारित हैं
 * 1) कक्षाएं वस्तुओं के मूल गुणों और व्यवहारों को परिभाषित करती हैं।
 * 2) वस्तु उदाहरण एक वर्ग की विशेष अभिव्यक्तियाँ हैं।

उदाहरण के लिए वस्तुओं की कल्पना करें वर्ग का एक नाम और विभिन्न क्रियाएं करने की क्षमता होती है जैसे काम करने के लिए ड्राइव करना और निर्माण सामग्री वितरित करना।  वर्ग की एक विशेष वस्तु (उदाहरण) है  जिसका नाम "बॉब की कार" है। सिद्धांत रूप में कोई भी इसे निर्माण सामग्री वितरित करने  के लिए कह कर एक संदेश भेज सकता है ।

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

यह विषय 'प्रोटोटाइप' के पीछे प्रेरक कारकों में से एक है। जब तक कोई निश्चित रूप से भविष्यवाणी नहीं कर सकता है कि दूर के भविष्य में वस्तुओं और वर्गों के एक समूह के गुण क्या होंगे, तब तक कोई वर्ग पदानुक्रम को ठीक से बनाया नहीं जा सकता है। अक्सर कार्यक्रम को अंततः अतिरिक्त व्यवहारों की आवश्यकता होती है और वस्तुओं को अलग तरीके से तोड़ने के लिए प्रणाली के अनुभागों को फिर से बनाने की आवश्यकता होगी। स्मॉलटाक जैसी शुरुआती ओओ भाषाओं के अनुभव से पता चला है कि इस तरह का विषय बार-बार सामने आया। प्रणाली  एक बिंदु तक बढ़ने लगते हैं और फिर बहुत कठोर हो जाते हैं क्योंकि प्रोग्रामर के संकेत के नीचे गहरे बुनियादी वर्ग केवल गलत हो जाते हैं। मूल वर्ग को आसानी से बदलने के किसी तरीके के बिना गंभीर समस्याएँ उत्पन्न हो सकती हैं।

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

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

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

विवरण
सेल्फ वस्तु स्लॉट्स का एक संग्रह है। स्लॉट एक्सेसर विधियाँ हैं जो मान लौटाती हैं और स्लॉट के नाम के बाद एक कोलन रखने से मान सेट हो जाता है। उदाहरण के लिए नाम नामक स्लॉट के लिए नाम में मान लौटाता है और इसे सेट करता है।

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

ध्यान दें कि सेल्फ में फ़ील्ड और विधियों के बीच कोई अंतर नहीं है: सब कुछ एक स्लॉट है। संदेशों के माध्यम से स्लॉट तक पहुँचने के बाद से सेल्फ में वाक्य - विन्यास का अधिकांश भाग बनता है, कई संदेश सेल्फ को भेजे जाते हैं और सेल्फ को छोड़ा जा सकता है।

बेसिक वाक्य - विन्यास
स्लॉट तक पहुँचने के लिए वाक्य - विन्यास स्मॉलटाक के समान है। तीन प्रकार के संदेश उपलब्ध हैं:


 * एकल


 * द्विआधारी


 * कीवर्ड

सभी संदेश परिणाम लौटाते हैं इसलिए रिसीवर (यदि स्थित है) और तर्क सेल्फ अन्य संदेशों का परिणाम हो सकते हैं। एक अवधि के बाद एक संदेश का मतलब है कि सेल्फ लौटाए गए मान को त्याग देगा। उदाहरण के लिए:

स्पष्ट रूप से पार्स किया जा सकता है और इसका मतलब वही है:

<वाक्यविन्यास हाइलाइट लैंग = स्मॉलटॉक> मान्य: ((आधार नीचे)           बीच: ((संयुक्ताक्षर नीचे) + ऊंचाई)            और: ((बेस टॉप) / (स्केल फैक्टर))।

स्मॉलटाक -80 में समान अभिव्यक्ति को इस प्रकार लिखा जाएगा:

<वाक्यविन्यास हाइलाइट लैंग = स्मॉलटॉक> मान्य: = सेल्फ आधार नीचे बीच: सेल्फ लिगेचर बॉटम + सेल्फ  हाइट और: सेल्फ बेस टॉप / सेल्फ  स्केल फैक्टर।

मान लिया जाये,  ,   और   के उदाहरण चर नहीं थे  लेकिन वास्तव मेंत रीके थे।

नई वस्तुएं बनाना
थोड़ा और जटिल उदाहरण पर विचार करें:

कॉपी संदेश के साथ लेबलविजेट वस्तु की प्रतिलिपि बनाता है (इस बार कोई शॉर्टकट नहीं है), फिर इसे लेबल नामक स्लॉट में हैलो वर्ल्ड डालने के लिए एक संदेश भेजता है। अब इसके साथ कुछ करना है:

इस स्थिति में पहले किया जाता है, सक्रिय खिड़की को विंडोज़ की सूची से लौटाता है जिसके बारे में डेस्कटॉप वस्तु जानता है। अगला (आंतरिक से बाहरी, बाएं से दाएं पढ़ें) जिस संकेत की हमने पहले जांच की थी वह लेबलविजेट लौटाता है। अंत में विजेट को सक्रिय विंडो के ड्रॉ स्लॉट में भेजा जाता है।

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

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

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

इस उदाहरण में बैंक खाते की वस्तु में जमा और निकासी की विधि नहीं होगी लेकिन माता-पिता के रूप में एक वस्तु होगी। इस तरह से बैंक अकाउंट वस्तु की कई प्रतियाँ बनाई जा सकती हैं लेकिन फिर भी हम उस रूट वस्तु में स्लॉट्स को बदलकर उन सभी के व्यवहार को बदल सकते हैं।

यह पारंपरिक वर्ग से कैसे भिन्न है? अच्छी तरह से अर्थ पर विचार करें:

यह अंश 'पैरेंट *' स्लॉट से जुड़े मान को बदलकर myObject की कक्षा को क्रम पर बदलता है (तारांकन स्लॉट नाम का हिस्सा है, लेकिन संबंधित संदेश नहीं)। विरासत या लेक्सिकल स्कूपिंग के विपरीत, प्रतिनिधि वस्तु को क्रम पर संशोधित किया जा सकता है।

स्लॉट जोड़ना
अतिरिक्त स्लॉट सम्मिलित करने के लिए सेल्फ में वस्तुओं को संशोधित किया जा सकता है। यह ग्राफिकल प्रोग्रामिंग वातावरण का उपयोग करके या आदिम 'AddSlots' के साथ किया जा सकता है। एक आदिम में एक सामान्य कीवर्ड संदेश के समान वाक्य - विन्यास होता है लेकिन इसका नाम अंडरस्कोर वर्ण से शुरू होता है। AddSlots आदिम से बचा जाना चाहिए क्योंकि यह शुरुआती कार्यान्वयन से बचा हुआ है। हालाँकि हम इसे नीचे दिए गए उदाहरण में दिखाएंगे क्योंकि यह संकेत को छोटा बनाता है।

पहले का एक उदाहरण कारों और ट्रकों के बीच व्यवहार को अलग करने में सक्षम होने के लिए वाहन नामक एक साधारण वर्ग को फिर से बनाने के बारे में था। सेल्फ में इसे कुछ इस तरह से पूरा किया जाएगा:

चूंकि 'AddSlots' प्राचीन का रिसीवर इंगित नहीं किया गया है, यह सेल्फ है। तत्पर पर टाइप किए गए भावों के स्थिति में वह एक वस्तु है जिसे लॉबी कहा जाता है। 'AddSlots' के लिए तर्क वह वस्तु है जिसके स्लॉट रिसीवर को कॉपी किए जाएंगे। इस स्थिति में यह बिल्कुल एक स्लॉट के साथ एक शाब्दिक वस्तु है। स्लॉट का नाम 'वाहन' है और इसका मूल्य एक अन्य शाब्दिक वस्तु है। <- संकेतन का तात्पर्य 'वाहन' नामक एक दूसरे स्लॉट से है जिसका उपयोग पहले स्लॉट के मान को बदलने के लिए किया जा सकता है।

= एक स्थिर स्लॉट इंगित करता है इसलिए कोई संबंधित 'पैरेंट' नहीं है। शाब्दिक वस्तु जो 'वाहन' का प्रारंभिक मूल्य है और उसमें एक स्लॉट सम्मिलित है ताकि यह क्लोनिंग से संबंधित संदेशों को समझ सके। वास्तव में खाली वस्तु जिसे (| |) या अधिक सरल रूप से के रूप में दर्शाया गया है और कोई भी संदेश प्राप्त नहीं कर सकता है।

यहां रिसीवर पिछली वस्तु है, जिसमें अब 'पैरेंट*के अलावा 'नाम' और 'नाम:' स्लॉट सम्मिलित होंगे।

हालांकि पहले 'वाहन' और 'स्पोर्ट्सकार' बिल्कुल एक जैसे थे, अब बाद वाले में एक नया स्लॉट सम्मिलित है जिसमें एक विधि है जो मूल में नहीं है। विधियों को केवल निरंतर स्लॉट में सम्मिलित किया जा सकता है।

नई वस्तु 'पोर्शे911' बिल्कुल 'स्पोर्ट्सकार' की तरह शुरू हुई लेकिन अंतिम संदेश ने इसके 'नाम' स्लॉट का मान बदल दिया। ध्यान दें कि दोनों में अभी भी समान स्लॉट हैं भले ही उनमें से एक का मान भिन्न हो।

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

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

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

कचरा संग्रह
सेल्फ के लिए कचरा संग्रहकर्ता जनरेशनल कचरा संग्रह का उपयोग करता है जो उम्र के अनुसार वस्तुओं को अलग करता है। पृष्ठ लिखने के लिए स्मृति प्रबंधन प्रणाली का उपयोग करके एक राइट-बैरियर को बनाए रखा जा सकता है। यह तकनीक उत्कृष्ट प्रदर्शन देती है हालाँकि कुछ समय चलने के बाद एक पूर्ण कचरा संग्रह हो सकता है जिसमें काफी समय लगता है। [ अस्पष्ट ]

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

यह भी देखें

 * मॉर्फिक (सॉफ्टवेयर)
 * सेसिल (प्रोग्रामिंग भाषा)

अग्रिम पठन

 * Published papers on सेल्फ
 * Series of four articles "Environment and the programming language सेल्फ"
 * Series of four articles "Environment and the programming language सेल्फ"

बाहरी संबंध

 * Former सेल्फ Home Page at Sun Microsystems
 * Alternate source of papers on सेल्फ from UCSB (mirror for the Sun papers page)
 * Merlin Project
 * सेल्फ ported to Linux (without many optimizations)
 * Automated Refactoring application on sourceforge.net, written for and in सेल्फ
 * Gordon's Page on सेल्फ
 * Prometheus object system on the Community Scheme Wiki
 * Video demonstrating सेल्फ
 * dसेल्फ: distributed extension to the delegation and language सेल्फ
 * Video demonstrating सेल्फ
 * dसेल्फ: distributed extension to the delegation and language सेल्फ