मेमरीचा पाया (The Absolute Basics of Computer Memory)
जेव्हा आपण एखादा प्रोग्रॅम लिहितो, तेव्हा तो हवेत चालत नाही, बरोबर? त्याला काम करण्यासाठी एका भौतिक (Physical) जागेची गरज असते. ही जागा म्हणजेच तुमची RAM (Random Access Memory). कोणत्याही Software Architecture चा पाया अगदी इथूनच सुरू होतो.
चला तर मग, मेमरीच्या आत प्रत्यक्षात काय घडते, ते आपण एकदम सोप्या भाषेत उघडून पाहूया.
मेमरी (RAM) प्रत्यक्षात काय असते?
तुम्हाला कधी प्रश्न पडला आहे का की, हार्डवेअरच्या नजरेतून RAM म्हणजे नक्की काय असते?
Software च्या दुनियेतून बाहेर येऊन पहिले तर, RAM म्हणजे दुसरे-तिसरे काही नसून लक्षावधी सूक्ष्म स्विचेसचा (Transistors आणि Capacitors) एक विशाल संच आहे. हे समजण्यासाठी आपण आपल्या घरातील साध्या लाईटच्या बटनाचे उदाहरण घेऊया.
या प्रत्येक स्विचची फक्त दोनच रूपे (States) असू शकतात:
1 म्हणतो.0 म्हणतो.👉 या आकृतीत काय दाखवले आहे?
1 मानली जाते.0 मानली जाते.कॉम्प्युटरला इंग्रजी, मराठी किंवा JavaScript समजत नाही. त्याला फक्त "करंट चालू आहे" किंवा "करंट चालू नाही" एवढेच समजते. या एका सिंगल स्विचला आपण Bit (Binary Digit) म्हणतो. Bit हे माहिती साठवण्याचे सर्वात लहानात लहान एकक (Unit) आहे.
आता या एका बटनाला थोडे 'Zoom Out' करून पाहूया. तुमची RAM म्हणजे असे लागून-लागून असलेले कोट्यवधी स्विचेस असतात:
या आकृतीत काय दाखवले आहे?
[0] किंवा [1] हा एक स्वतंत्र Bit दर्शवतो.डेटा साठवताना एक-एक सिंगल Bit का नाही वापरला जात? (The Concept of Byte)
आता तुम्हाला नक्कीच प्रश्न पडला असेल की, जर RAM मध्ये लक्षावधी Bits आहेत आणि १ Bit Data store करू शकतो, तर आपण एक-एक Bit स्वतंत्रपणे का वापरत नाही?
याचे साधे उत्तर आहे: जरी RAM मध्ये लक्षावधी सूक्ष्म स्विचेस असले, तरी Data store करण्यासाठी किंवा read करण्यासाठी त्यांना एक-एक (Single) वापरले जात नाही. त्यांना नेहमी ८-८ चे गट करून वापरले जाते.
या आकृतीत काय दाखवले आहे?
या संकल्पनेचे मुख्य मुद्दे:
पण ८ चाच गट का बनवला जातो?
याचे मुख्य कारण आहे 'Addressing' (पत्ता शोधण्याची गुंतागुंत). कल्पना करा की, एका मोठ्या शहरात प्रत्येक माणसाला स्वतंत्र घराचा पत्ता दिला, तर Postman ला पत्रे वाटताना किती त्रास होईल? त्याऐवजी एका इमारतीत (Building) ८ फ्लॅट्सचा गट बनवून त्या इमारतीला एकच पत्ता दिला, तर काम खूप वेगाने होते. CPU चे काम अगदी Postman सारखे असते. जर त्याने RAM मधील प्रत्येक सिंगल Bit ला (स्विचला) वेगळा पत्ता दिला, तर कोट्यवधी पत्ते तयार होतील आणि CPU चा वेग प्रचंड मंदावेल. यावर उपाय म्हणून इंजिनिअर्सनी ८ Bits चा एक गट तयार केला आणि या गटाला नाव दिले Byte.
** या आकृतीत काय दाखवले आहे?**
महत्त्वाचा नियम: CPU जेव्हाही RAM मधून डेटा Read किंवा Write करतो, तेव्हा तो कमीत कमी १ पूर्ण Byte (८ Bits) एकत्र उचलतो. जरी तुम्हाला फक्त एकच Bit बदलायचा असला, तरी CPU तो पूर्ण Byte स्वतःकडे घेतो, त्यातला Bit बदलतो आणि तो पूर्ण Byte परत RAM मध्ये ठेवून देतो.
मेमरी ॲड्रेस (Memory Addressing) कसे दिले जातात?
आता आपल्याला माहित आहे की डेटा Bytes च्या स्वरूपात साठवला जातो. पण CPU ला बरोबर तोच Byte कसा सापडतो जिथे तुमचा Variable किंवा Data आहे? यासाठी Memory Addresses वापरले जातात.
RAM च्या Architecture मध्ये, प्रत्येक Byte ला एक युनिक क्रमांक दिलेला असतो (जसा आपल्या घराचा पिन कोड किंवा पत्ता असतो). हा पत्ता वाचायला सोपा जावा म्हणून सहसा Hexadecimal (उदा. 0x0001) format मध्ये लिहिला जातो.
या आकृतीत काय दाखवले आहे?
0x00000001).False value, 255 हा Number आणि True value बायनरीमध्ये कशी दिसते हे दाखवले आहे.जेव्हा JavaScript मधील एखादे इंजिन एखादा Variable डिक्लेअर करते (उदा. let x = true;), तेव्हा ते Operating System कडे RAM मध्ये थोडी जागा मागते. Operating System एखादा रिकामा पत्ता (उदा. 0x00000004) शोधते आणि त्या पत्त्यावर 00000001 ही value नेऊन ठेवते.
या संकल्पनेचे मुख्य मुद्दे:
💡 Technical Key Takeaway:
कोणतीही आधुनिक Programming Language असो, मग ती JavaScript असो वा दुसरी कोणतीही, ती शेवटी या ८-बिटच्या डब्यांवर आणि Memory Address वरच खेळत असते. जर तुमचा हा 'First Principles' चा बेस पक्का असेल, तर भविष्यात Memory Leaks शोधणे आणि Performance Optimization करणे तुम्हाला खूप सोपे जाईल!
जावास्क्रिप्ट (JavaScript) मधील Call Stack आणि Event Loop: एक छोटा धडा
JavaScript 'under-the-hood' कसे काम करते याची एक छोटी झलक खालीलप्रमाणे आहे.
१. Call Stack [ ☰ ] हे एक डेटा स्ट्रक्चर आहे जे 'LIFO' (Last In, First Out) तत्त्वावर काम करते. जेव्हा आपण एखादे function चालवतो, तेव्हा ते stack च्या सर्वात वर जोडले जाते [ ➔ ]. त्या function चे काम पूर्ण झाल्यावर ते तिथून काढून टाकले जाते [ ↶ ].
२. Web APIs [ ⚙ ]
setTimeout, DOM events किंवा asynchronous कामे JavaScript इंजिन स्वतः करत नाही, तर ती ब्राउझरच्या Web APIs कडे सोपवली जातात. तिथे त्यांचे टायमर चालतात किंवा डेटा फेच होतो [ ◷ ]. यामुळे आपला मुख्य कोड (main thread) अडकत नाही [ ✓ ].
३. Event Loop [ ↻ ] Event Loop चे काम खूप सोपे पण महत्त्वाचे आहे. तो सतत तपासत असतो [ ⌕ ] की Call Stack रिकामा आहे का. जर तो रिकामा असेल आणि Task Queue मध्ये एखादे function तयार असेल, तर Event Loop त्याला Queue मधून उचलतो आणि Stack मध्ये ढकलतो [ ⚡ ].
महत्त्वाची सूचना [ ⚠ ] : मोठी किंवा वेळ खाणारी कामे नेहमी asynchronous पद्धतीने हाताळा, जेणेकरून तुमचा Call Stack ब्लॉक होणार नाही आणि युजर इंटरफेस सुरळीत चालेल.
(टीप: या धड्यात इमोजींऐवजी [ ☰ ], [ ➔ ], [ ⚙ ], [ ◷ ], [ ↻ ], [ ⚠ ] यांसारख्या Google Docs मधील Special Characters चा वापर केला आहे.)
☰ [ ☰ ], [ ➔ ], [ ⚙ ], [ ◷ ], [ ↻ ], [ ⚠ ]