जैसा कि इस उत्तर में सुझाया गया है , यह हार्डवेयर समर्थन की बात है, हालांकि भाषा डिजाइन में परंपरा भी एक भूमिका निभाती है।
जब कोई फ़ंक्शन वापस आता है तो यह एक विशिष्ट रजिस्टर में रिटर्निंग ऑब्जेक्ट के लिए एक पॉइंटर छोड़ देता है
तीन प्रथम भाषाओं में से, फोरट्रान, लिस्प और कोबोल, ने पहली बार एकल रिटर्न मान का उपयोग किया था क्योंकि यह गणित पर आधारित था। दूसरे ने मापदंडों की एक मनमानी संख्या को उसी तरह लौटाया जो उन्हें प्राप्त हुआ: एक सूची के रूप में (यह भी तर्क दिया जा सकता है कि यह केवल पारित हुआ और एकल पैरामीटर लौटा: सूची का पता)। तीसरा वापसी शून्य या एक मान।
इन पहली भाषाओं ने उन भाषाओं के डिजाइन पर बहुत अधिक प्रभाव डाला, जो उनके पीछे थे, हालांकि एकमात्र जो कई मूल्यों को लौटाता था, लिस्प, कभी भी उनकी लोकप्रियता को इकट्ठा नहीं करते थे।
जब C आया, उससे पहले की भाषाओं से प्रभावित होने के दौरान, इसने C को भाषा और इसे लागू करने वाले मशीन कोड के बीच घनिष्ठ संबंध रखते हुए हार्डवेयर संसाधन के कुशल उपयोग पर बहुत ध्यान दिया। इसकी कुछ पुरानी विशेषताएं, जैसे "ऑटो" बनाम "रजिस्टर" चर, उस डिजाइन दर्शन का एक परिणाम हैं।
यह भी बताया जाना चाहिए कि विधानसभा की भाषा 80 के दशक तक व्यापक रूप से लोकप्रिय थी, जब अंत में इसे मुख्यधारा के विकास से बाहर किया जाने लगा। संकलक और निर्मित भाषा लिखने वाले लोग असेंबली से परिचित थे , और अधिकांश भाग के लिए, वहाँ जो सबसे अच्छा काम करता था, रखा गया।
इस मानदंड से निकली अधिकांश भाषाओं को कभी भी बहुत लोकप्रियता नहीं मिली, और इसलिए, उन्होंने कभी भी भाषा डिजाइनरों के निर्णयों को प्रभावित करने वाली एक मजबूत भूमिका नहीं निभाई (जो निश्चित रूप से, वे जो जानते थे उससे प्रेरित थे)।
तो चलिए विधानसभा भाषा की जांच करते हैं। आइए सबसे पहले 6502 को देखें , जो 1975 का एक माइक्रोप्रोसेसर था जिसे Apple II और VIC-20 माइक्रो कंप्यूटर द्वारा प्रसिद्ध किया गया था। यह उस समय की मेनफ्रेम और मिनीकॉम्पैक्टर्स में उपयोग किए जाने की तुलना में बहुत कमजोर था, हालांकि प्रोग्रामिंग भाषाओं की भोर में 20 से 30 साल पहले के पहले कंप्यूटरों की तुलना में शक्तिशाली था।
यदि आप तकनीकी विवरण को देखते हैं, तो इसमें 5 रजिस्टर और कुछ एक-बिट झंडे हैं। केवल "पूर्ण" रजिस्टर प्रोग्राम काउंटर (पीसी) था - जो कि अगले निर्देश को निष्पादित करने के लिए रजिस्टर करता है। अन्य रजिस्टर जहां संचायक (ए), दो "सूचकांक" रजिस्टर (एक्स और वाई), और एक स्टैक पॉइंटर (एसपी)।
एसपी द्वारा बताई गई मेमोरी में पीसी को सबरूटीन कहते हैं, और फिर एसपी को घटाता है। एक सबरूटीन से वापस आना उल्टा काम करता है। एक स्टैक पर अन्य मूल्यों को धक्का और खींच सकता है, लेकिन एसपी के सापेक्ष मेमोरी को संदर्भित करना मुश्किल है, इसलिए फिर से प्रवेश करने वाले सबरूटीन्स लिखना मुश्किल था। यह चीज जो हम लेते हैं, किसी भी समय हम जिस तरह से महसूस करते हैं, उसे एक सबरूटीन कहते हैं, इस वास्तुकला पर इतना आम नहीं था। अक्सर, एक अलग "स्टैक" बनाया जाएगा ताकि पैरामीटर और सबरूटीन रिटर्न पता अलग रखा जा सके।
यदि आप 6502, 6800 को प्रेरित करने वाले प्रोसेसर को देखते हैं , तो इसके पास एक अतिरिक्त रजिस्टर था, इंडेक्स रजिस्टर (IX), एसपी के रूप में चौड़ा, जो एसपी से मूल्य प्राप्त कर सकता था।
मशीन पर, एक फिर से प्रवेश करने वाले सबरूटीन को कॉल करने के लिए स्टैक पर मापदंडों को धक्का देना, पीसी को धक्का देना, पीसी को नए पते पर बदलना शामिल था, और फिर सबरूटीन स्टैक पर अपने स्थानीय चर को धक्का देगा । क्योंकि स्थानीय चर और मापदंडों की संख्या ज्ञात है, उन्हें संबोधित करते हुए स्टैक के सापेक्ष किया जा सकता है। उदाहरण के लिए, दो मापदंडों को प्राप्त करने वाला एक फ़ंक्शन और दो स्थानीय चर इस तरह दिखेंगे:
SP + 8: param 2
SP + 6: param 1
SP + 4: return address
SP + 2: local 2
SP + 0: local 1
इसे किसी भी समय कहा जा सकता है क्योंकि सभी अस्थायी स्थान स्टैक पर हैं।
8080 , टीआरएस -80 और CP / M आधारित माइक्रो-कंप्यूटरों के एक मेजबान पर इस्तेमाल 6800 के लिए इसी तरह कुछ कर सकते हैं, स्टैक पर सपा को आगे बढ़ाने के लिए और फिर अपने अप्रत्यक्ष रजिस्टर, HL पर यह पॉपिंग से।
यह चीजों को लागू करने का एक बहुत ही सामान्य तरीका है, और इसे अधिक आधुनिक प्रोसेसर पर और भी अधिक समर्थन मिला, बेस पॉइंटर के साथ जो आसान लौटने से पहले सभी स्थानीय चर को डंपिंग बनाता है।
समस्या यह है कि, आप कुछ भी कैसे लौटा सकते हैं ? प्रोसेसर रजिस्टर बहुत जल्दी नहीं थे, और उनमें से कुछ का उपयोग करने के लिए अक्सर यह भी पता लगाने की आवश्यकता होती थी कि स्मृति के किस टुकड़े को संबोधित करना है। स्टैक पर चीजों को वापस करना जटिल होगा: आपको सब कुछ पॉप करना होगा, पीसी को सहेजना होगा, रिटर्निंग पैरामीटर (जो कि इस बीच जहां होगा?) को धक्का देगा, फिर पीसी को फिर से पुश करें और वापस आ जाएं।
इसलिए आमतौर पर जो किया जाता था वह रिटर्न वैल्यू के लिए एक रजिस्टर को जमा करता था । कॉलिंग कोड जानता था कि रिटर्न वैल्यू एक विशेष रजिस्टर में होगी, जिसे तब तक संरक्षित रखना होगा जब तक इसे बचाया या इस्तेमाल नहीं किया जा सकता है।
आइए एक ऐसी भाषा देखें जो कई रिटर्न वैल्यू की अनुमति देती है: फोर्थ। फोर्थ जो करता है वह एक अलग रिटर्न स्टैक (आरपी) और डेटा स्टैक (एसपी) रख रहा है, ताकि सभी फ़ंक्शन को अपने सभी मापदंडों को पॉप करना पड़े और स्टैक पर रिटर्न मान छोड़ दें। चूंकि रिटर्न स्टैक अलग था, यह रास्ते में नहीं मिला।
जैसा कि किसी ने कंप्यूटर के साथ अनुभव के पहले छह महीने में असेंबली लैंग्वेज और फोर्थ सीखा, कई रिटर्न वैल्यूज मुझे पूरी तरह से सामान्य लगते हैं। फोर्थ जैसे ऑपरेटर /mod
, जो पूर्णांक विभाजन और बाकी को लौटाते हैं , स्पष्ट प्रतीत होते हैं। दूसरी ओर, मैं आसानी से देख सकता हूं कि कोई व्यक्ति जिसका प्रारंभिक अनुभव C मन था, उस अवधारणा को अजीब पाया: यह "कार्य" क्या है की उनकी बाधित उम्मीदों के खिलाफ जाता है।
गणित के लिए ... ठीक है, मैं कंप्यूटर की प्रोग्रामिंग कर रहा था, इससे पहले कि मैं गणित की कक्षाओं में काम करता। वहाँ है सीएस और प्रोग्रामिंग भाषाओं जो गणित से प्रभावित है की एक पूरी अनुभाग वहाँ एक पूरी अनुभाग जो नहीं है, लेकिन, फिर,।
इसलिए हमारे पास ऐसे कारकों का संगम है जहां गणित ने प्रारंभिक भाषा के डिजाइन को प्रभावित किया, जहां हार्डवेयर की कमी ने तय किया कि क्या आसानी से लागू किया गया था, और जहां लोकप्रिय भाषाओं ने प्रभावित किया कि कैसे हार्डवेयर विकसित हुआ (लिस्प मशीन और फोर्थ मशीन प्रोसेसर इस प्रक्रिया में रोडकिल थे)।