Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ক্লাস ২৪ - Go Internal Memory (Code, Data, Stack, Heap)

🧠 আলোচনার বিষয়বস্তু

এই ক্লাসে একটি Go program কম্পিউটারের মেমরিতে কীভাবে বিন্যস্ত থাকে সেটি নিয়ে বিস্তারিত আলোচনা করা হয়েছে। নিচে প্রয়োজনীয় ধারনাগুলো উল্লেখ করা হল :

  • কোড সেগমেন্ট (Code Segment): কম্পাইল্ড ইন্সট্রাকশন (যেমন ফাংশন, কনস্ট্যান্ট ভ্যারিয়েবল ইত্যাদি যা পরবর্তীতে পরিবর্তন হওয়ার সুযোগ নেই) সংরক্ষণ করে।
  • ডেটা সেগমেন্ট (Data Segment): প্রোগ্রামের স্ট্যাটিক (static) এবং গ্লোবাল (global) ভ্যারিয়েবল সংরক্ষণের জন্য ব্যবহৃত হয় (যেমন var a = 10)।
  • স্ট্যাক (Stack): ফাংশনের মধ্যে ব্যবহৃত লোকাল ভেরিয়েবলগুলো স্ট্যাকে সংরক্ষণ করা হয়। প্রতিটি ফাংশন কলের জন্য নতুন স্ট্যাকফ্রেম (Stack Frame) তৈরি করে।
  • হিপ (Heap): ডাইনামিক মেমোরি অ্যালোকেশন (dynamic memory allocation) এর জন্য ব্যবহৃত হয় (এটি নিয়ে পরবর্তীতে বিস্তারিত আলোচনা করা হবে)।
  • গারবেজ কালেক্টর (Garbage Collector): হিপ মেমোরি (heap memory) থেকে অব্যবহৃত বা অপ্রয়োজনীয় মেমোরি সরিয়ে মেমোরি ফাঁকা করে।

📜 ক্লাসের কোড:

package main

import "fmt"

var a = 10

func add(x, y int) {
    z := x + y
    fmt.Println(z)
}

func main() {
    add(5,4)
    add(a,3)
}

func init() {
    fmt.Println("Hello")
}

🔍 কোড এক্সিকিউশন ফ্লো এবং মেমোরি লেআউট

       ┌────────────────────────────────────────────┐
       │               Code Segment                 │
       │--------------------------------------------│
       │ Functions: init, main, add                 │
       └────────────────────────────────────────────┘
                      │
                      ▼
       ┌────────────────────────────────────────────┐
       │              Data Segment                  │
       │--------------------------------------------│
       │ Global Variable: a = 10                    │
       └────────────────────────────────────────────┘
                      │
                      ▼
          ┌────────────────────────────┐
          │          Stack             │
          │----------------------------│
          │ main() Stack Frame         │
          │   - Calls add(5, 4)        │
          │       - x=5, y=4           │
          │       - z=9                │
          │   - Calls add(10, 3)       │
          │       - x=10, y=3          │
          │       - z=13               │
          └────────────────────────────┘
                      │
                      ▼
       ┌────────────────────────────────────────────┐
       │               Heap (Unused here)           │
       │       (Managed by the Garbage Collector)   │
       └────────────────────────────────────────────┘

⚙️ এক্সিকিউশন অর্ডার (Execution Order)

১। init() একটি বিশেষ ফাংশন, যা main() ফাংশনের আগে স্বয়ংক্রিয়ভাবে (automatically) রান হয়। তাই এটি শুরুতে Hello প্রিন্ট করবে।

Hello

২। এই পর্যায়ে main() ফাংশন রান হবে এবং -[] add(5, 4) ফাংশনকে কল করবে। ফলে প্রিন্ট হবে 9

9

এরপর -[] add(a, 3) ফাংশনকে কল করবে যেখানে a এর মান 10 ব্যবহার করবে (ডেটা সেগমেন্ট থেকে)। ফলে প্রিন্ট হবে 13

13

📌 মূল ধারনা পুনরালোচনা (Key Concepts Recap)

  • কোড সেগমেন্ট | সব ফাংশন কম্পাইল হওয়ার পর যেখানে থাকে
  • ডেটা সেগমেন্ট | গ্লোবাল ভেরিয়েবল সংরক্ষণ করে
  • স্ট্যাক | ফাংশন রান হওয়ার সময় অস্থায়ী মেমরি (লোকাল ভেরিয়েবল, প্যারামিটার)
  • হিপ | ডাইনামিক মেমরির জন্য
  • গারবেজ কালেক্টর | হিপে থাকা মেমরি স্বয়ংক্রিয়ভাবে ম্যানেজ করে
  • init() ফাংশন | Go-তে বিশেষ ফাংশন — main() এর আগে রান হয়

🧼 গারবেজ কালেক্টর সম্পর্কে উপলব্ধি: Go-এর গারবেজ কালেক্টর হিপে থেকে অব্যবহৃত মেমরি মুছে ফেলে। ছোট প্রোগ্রামে এটি তেমন বোঝা যায় না, তবে অ্যাপ বড় হলে এটি আপনার সেরা বন্ধু।

[Author: @ifrunruhin12, @nazma98 Date: 2025-05-01 - 2025-05-14 Category: interview-qa/class-wise ]