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 প্রোগ্রামের অভ্যন্তরীণ কার্যকলাপ নিয়ে আলোচনা করা হয়েছে, বিশেষ করে নিচের বিষয়গুলোর ওপর:

  • কম্পাইলেশন পর্যায় (Compilation Phase)
  • এক্সিকিউশন পর্যায় / রানটাইম (Execution Phase / Runtime)
  • Go কীভাবে go build দিয়ে বাইনারি ফাইল তৈরি করে
  • সেই বাইনারি ফাইলে কী কী সংরক্ষিত হয় (ফাংশন, কনস্ট্যান্ট, গ্লোবাল ভেরিয়েবল ইত্যাদি)
  • ফাংশন এক্সপ্রেশনের (যেমন, add := func(...)) মেমরিতে কীভাবে হ্যান্ডল করা হয়

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

ধারনাব্যাখ্যা
কম্পাইলেশন পর্যায়সোর্স কোডকে বাইনারি এক্সিকিউটেবল এ পরিণত করে। এখনো কোনো কোড রান হয় না।
এক্সিকিউশন পর্যায়কম্পাইল হওয়া বাইনারি ফাইল রান করে, প্রথমে init() এবং তারপর main() থেকে শুরু হয়।
কোড সেগমেন্টকম্পাইল হওয়া ফাংশন (main, call, anonymous add) এবং কনস্ট্যান্ট (a) এক্সিকিউটেবল ইন্সট্রাকশনের অংশ হিসেবে এখানে সংরক্ষিত থাকে।
ডেটা সেগমেন্টগ্লোবাল ভেরিয়েবল (যেমন, p) এখানে সংরক্ষিত হয়।
ফাংশন এক্সপ্রেশনরানটাইমে ফাংশন অবজেক্ট হিসেবে বিবেচিত হয় এবং কোড সেগমেন্টে সংরক্ষিত থাকে।

📋 ক্লাস ২৫ এর কোড:

package main

import "fmt"

const a = 10 // constant
var p = 100

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

	add(5, 6)
	add(p, a)
}

func main() {
	call()
	fmt.Println(a)
}

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

🔄 কম্পাইলেশন পর্যায়ের ভিজ্যুয়ালাইজেশন

go build main.go
  • পার্সার/কম্পাইলার: সিনট্যাক্স, স্কোপ এবং ডিপেন্ডেন্সি যাচাই করে।
  • সংরক্ষণ করে:
    • কনস্ট্যান্ট: a = 10
    • গ্লোবাল ভেরিয়েবল: p = 100
    • ফাংশন: init, main, call, এবং call এর ভেতরের anonymous add ফাংশন
    • প্রয়োজনীয় মেশিন কোড + মেটাডাটার বাইনারি জেনারেট করে

বাইনারি ফাইলে থাকে:

  • কোড সেগমেন্ট: কনস্ট্যান্ট a, main, call, anonymous ফাংশন
  • ডেটা সেগমেন্ট: ভ্যারিয়েবল p
  • এখানে কোনো এক্সিকিউশন হয় না।

⏱ এক্সিকিউশন পর্যায়ের ভিজ্যুয়ালাইজেশন

   ১. init()            => "Hello"
   ২. main()            => call() ফাংশনকে কল করে
   ৩. call()            => add() ফাংশনকে ডিক্লেয়ার এবং কল করে
       - add(5, 6)      => 11
       - add(100, 10)   => 110
   ৪. fmt.Println(a)    => 10

🧠 মেমরি লেআউট

┌─────────────────────────────┐
│       Code Segment          │
│-----------------------------│
│ const a = 10                |
| main, call, init, add-func  │
└─────────────────────────────┘
          ↓
┌─────────────────────────────┐
│       Data Segment          │
│-----------------------------│
│ var p = 100                 │
└─────────────────────────────┘
          ↓
┌─────────────────────────────┐
│           Stack             │
│-----------------------------│
│ call() frame → add func     │
│   x=5,y=6,z=11              │
│   x=100,y=10,z=110          │
└─────────────────────────────┘

🔹সারাংশ

  • একটি Go প্রোগ্রাম দুইটি পর্যায়ে রান হয়: কম্পাইলেশন এবং এক্সিকিউশন।
  • কম্পাইলেশন চলাকালে, Go মেমরি লেআউট প্রস্তুত করে, ফাংশন এবং এক্সপ্রেশন কম্পাইল করে।
  • এক্সিকিউশন পর্যায়ে, প্রথমে init() এবং তারপর main() রান হয়।
  • ফাংশন এক্সপ্রেশন (যেমন, add := func(...)) হলো ফার্স্ট ক্লাস ভ্যালু, যা কোড সেগমেন্টে সংরক্ষিত থাকে।
  • go build থেকে তৈরি হওয়া বাইনারি ফাইলে কোড, ডেটা, এবং মেটাডাটা সহ প্রয়োজনীয় সবকিছু থাকে।

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