जब कंप्यूटर में stack और heap नहीं थे, तब subroutine call
- आधुनिक computing में stack और heap को स्वाभाविक माना जाता है, लेकिन computing के शुरुआती दौर में कंप्यूटर stack या heap के बिना काम करते थे.
- dynamic memory allocation के बिना computing की कल्पना करना इतना कठिन नहीं है. हर चीज़ के लिए fixed-size memory buffer का उपयोग करना पड़ता था.
- अगर variable-size data को संभालना हो, तो संभावित data को समायोजित करने के लिए पर्याप्त बड़ा fixed-size buffer आरक्षित किया जाता था.
- compile-time settings देकर client को maximum capacity समायोजित करने की सुविधा दी जा सकती थी, या fixed-size buffer से memory को "allocate" और "free" करने वाला custom allocator लिखा जा सकता था.
stack के बिना function call करना
- compiler हर function के inbound parameter, return address, और local variable के लिए गुप्त global variables परिभाषित करता था.
- function call बनाने के लिए compiler parameter values को उन गुप्त global variables में assign करता, return address को function के गुप्त "return address variable" में assign करता, और फिर function की शुरुआत पर jump करता था.
- function, parameter को गुप्त global variables से पढ़ता और logical local variables के अनुरूप पहले से परिभाषित गुप्त global variables का उपयोग करता था.
- function समाप्त होने पर, वह function के गुप्त "return address variable" में मौजूद address पर jump करता था.
ABI optimization
- ABI को optimize करने के लिए कुछ values को global variables की जगह register में pass किया जाता था.
- अधिकांश processors में "link" register और "branch with link" instruction होते हैं, जो अपने-आप link register को "branch with link" instruction के बाद वाले address पर सेट कर देते हैं.
- पहले दो parameters को register में pass करने वाली calling convention को optimize किया गया.
recursive call की असंभवता
- recursive call काम नहीं करता था. recursive call return address variable को recursive call के return address से overwrite कर देता था, इसलिए बाहरी call पूरा होने पर गलत जगह jump हो जाता था.
- उस समय की programming languages ने यह घोषित करके इस समस्या को हल किया कि वे recursion को support नहीं करतीं.
बोनस चर्चा
- कुछ compilers self-modifying code का उपयोग करके और भी चतुराई से काम करते थे: विशेष return address variable वास्तव में function के अंत में मौजूद jump instruction के address field ही होता था.
- जब processor indirect jump को support नहीं करता था, तब यह तरीका व्यावहारिक आवश्यकता के रूप में इस्तेमाल किया जाता था.
- subroutine की व्यावहारिक उपयोगिता पहचाने जाने के बाद, कई processors ने subroutine call instructions जोड़े, जो return address को subroutine के पहले word में store करते थे और subroutine के दूसरे word से execution शुरू करते थे.
- subroutine से return करने के लिए subroutine start label के माध्यम से indirect jump चलाया जाता था.
GN⁺ की राय
- यह लेख शुरुआती computing युग में stack और heap के अभाव में programming कैसे की जाती थी, इसे समझाकर आधुनिक software development में उपयोग होने वाली memory management techniques के विकास को समझने में मदद करता है.
- stack और heap के बिना वाले दौर की programming आधुनिक developers को बहुत अपरिचित और अक्षम लग सकती है, लेकिन यह computing के इतिहास के माध्यम से यह समझने के लिए महत्वपूर्ण पृष्ठभूमि देती है कि तकनीक कैसे विकसित हुई.
- recursive call असंभव होने वाले दौर की programming सीमाएँ, आज recursive algorithms का उपयोग करने वाले developers के लिए एक रोचक ऐतिहासिक तथ्य प्रस्तुत करती हैं.
- आलोचनात्मक दृष्टि से देखें तो, ये शुरुआती programming तरीके यह भी दिखाते हैं कि वे आधुनिक जटिल और विविध आवश्यकताओं को पूरा करने के लिए बहुत सीमित थे.
1 टिप्पणियां
Hacker News राय
"The Art of Computer Programming" किताब के बारे में सकारात्मक मूल्यांकन
इस बारे में विवरण कि कैसे दो array एक ही space को dynamic रूप से साझा कर सकते हैं
ALGOL भाषा में recursive function को शामिल करना विवादास्पद था—इस पर एक रोचक कहानी का लिंक साझा किया गया
SUBLEQ मशीन और bit-serial मशीन के लिए Forth interpreter लिखने का अनुभव साझा किया गया
PDP-8 प्रोसेसर में subroutine call से जुड़ी तकनीकी प्रगति का विवरण
लंबे समय से functional programming करने वाले एक उपयोगकर्ता ने recursion के प्रति अपनी पसंद साझा की
1991 के आसपास RS232 serial multiplexer design करने का अनुभव साझा किया गया
उस दौर का उल्लेख जब heap को expand नहीं किया जा सकता था, इसलिए programmers को input के संभावित distribution पर विचार करके intermediate storage का आकार ठीक से तय करना पड़ता था
उस समय का विवरण जब recursion इस्तेमाल नहीं किया जा सकता था, लेकिन tail recursion संभव था
branch_with_linkके अलावा सामान्य branch का उपयोग करना पड़ता था।यह विवरण कि Enhanced GNU Awk में compiler function के बाहर मौजूद @let block के लिए गुप्त global variable allocate करता है
"Goto considered harmful" पेपर की दुनिया का वर्णन करने वाली एक पोस्ट का उल्लेख