Programming and Java Fundamentals

JDK, JRE, JVM, and Bytecode

ReadingPreview

আপনি একটি free preview lesson দেখছেন।

Lesson Overview

Java program লেখা থেকে শুরু করে program execute হওয়া পর্যন্ত কয়েকটি গুরুত্বপূর্ণ component একসঙ্গে কাজ করে।

এই componentগুলোর মধ্যে সবচেয়ে গুরুত্বপূর্ণ হলো:

  • JDK
  • JRE
  • JVM
  • Java compiler
  • Bytecode

Java শেখার শুরুতে এই termগুলো প্রায়ই confusing মনে হয়। অনেক learner JDK, JRE এবং JVM-কে একই জিনিস মনে করেন। কিন্তু প্রতিটির দায়িত্ব আলাদা।

এই lesson-এ আমরা বিস্তারিতভাবে জানব:

  • JDK কী
  • JRE কী
  • JVM কী
  • Java compiler কীভাবে কাজ করে
  • Bytecode কী
  • Compile time এবং runtime-এর পার্থক্য
  • Java program কীভাবে compile এবং execute হয়
  • Development environment এবং runtime environment-এর সম্পর্ক

Learning Objectives

এই lesson শেষ করার পর আপনি পারবেন:

  • JDK, JRE এবং JVM-এর দায়িত্ব ব্যাখ্যা করতে
  • JDK, JRE এবং JVM-এর পার্থক্য বুঝতে
  • Java compiler-এর কাজ ব্যাখ্যা করতে
  • Java source code এবং bytecode-এর পার্থক্য বলতে
  • Compile time এবং runtime আলাদা করতে
  • Java program-এর complete execution flow ব্যাখ্যা করতে
  • .java এবং .class file শনাক্ত করতে
  • javac এবং java command-এর ভূমিকা বুঝতে

Java Development-এর প্রধান Components

Java program তৈরি এবং চালানোর flow সাধারণভাবে এমন:

Java Source Code
        ↓
Java Compiler
        ↓
Java Bytecode
        ↓
JVM
        ↓
Operating System
        ↓
CPU

এই flow-তে:

  • Developer Java source code লেখেন
  • Java compiler source code compile করে
  • Compiler bytecode তৈরি করে
  • JVM bytecode load এবং execute করে
  • Operating system JVM process manage করে
  • CPU final machine instruction execute করে

JDK, JRE এবং JVM এই process-এর বিভিন্ন অংশে কাজ করে।


JDK কী?

JDK-এর পূর্ণরূপ:

Java Development Kit

JDK হলো Java application develop করার জন্য প্রয়োজনীয় tool এবং runtime component-এর একটি collection।

Java code লিখতে, compile করতে, test করতে এবং run করতে সাধারণত JDK install করতে হয়।

JDK-এর মধ্যে থাকে:

  • Java compiler
  • Java runtime
  • JVM
  • Standard library
  • Debugging tools
  • Documentation tools
  • Packaging tools
  • অন্যান্য development utilities

সহজভাবে:

JDK হলো Java developer-এর complete toolkit।


JDK কেন প্রয়োজন?

ধরা যাক, আপনি নিচের Java program লিখেছেন:

public class Main {

    public static void main(String[] args) {
        System.out.println("Hello Java");
    }
}

Fileটি save করা হলো:

Main.java

এখন source code-কে compile করতে হবে।

Compile command:

javac Main.java

এখানে javac JDK-এর অংশ।

Compilation successful হলে তৈরি হবে:

Main.class

এরপর program run করা যায়:

java Main

java command-ও JDK installation-এর মাধ্যমে পাওয়া যায়।

JDK ছাড়া সাধারণভাবে আপনি Java source code compile করতে পারবেন না।


JDK-এর গুরুত্বপূর্ণ Tools

JDK-এর মধ্যে অনেক command-line tool থাকে।

Beginner হিসেবে সব tool এখনই জানা প্রয়োজন নেই। তবে কয়েকটি গুরুত্বপূর্ণ tool সম্পর্কে ধারণা থাকা দরকার।


javac

javac হলো Java compiler।

এর কাজ:

  • Java source code পড়া
  • Syntax check করা
  • Type check করা
  • Compilation error detect করা
  • Source code-কে bytecode-এ convert করা

Example:

javac Main.java

Input:

Main.java

Output:

Main.class

java

java command Java application start করে।

Example:

java Main

এটি সাধারণভাবে:

  1. JVM start করে
  2. Main class খুঁজে
  3. Class load করে
  4. main method খুঁজে
  5. Program execute করে

javadoc

javadoc source code থেকে HTML documentation তৈরি করতে পারে।

Example:

javadoc Calculator.java

Professional Java project-এ public class এবং method document করার জন্য Javadoc ব্যবহার করা হয়।

Example Javadoc comment:

/**
 * Calculates the sum of two numbers.
 */
public int add(int firstNumber, int secondNumber) {
    return firstNumber + secondNumber;
}

jar

jar tool Java class এবং resource file package করতে ব্যবহৃত হয়।

JAR-এর পূর্ণরূপ:

Java Archive

একটি JAR file-এর মধ্যে থাকতে পারে:

  • Compiled .class file
  • Configuration
  • Image
  • Text resource
  • Metadata
  • Dependency information

Example:

application.jar

Java backend application প্রায়ই executable JAR হিসেবে package করা হয়।

Run example:

java -jar application.jar

jshell

jshell হলো Java-এর interactive shell।

এখানে complete class তৈরি না করেও ছোট Java expression test করা যায়।

Example:

jshell

তারপর:

int firstNumber = 10;
int secondNumber = 20;
firstNumber + secondNumber

Result:

30

ছোট concept দ্রুত test করার জন্য jshell useful।


JDK-এর Simplified Structure

Conceptually JDK-কে এভাবে বোঝা যায়:

JDK
├── Java Compiler
├── Development Tools
├── Java Runtime
├── JVM
└── Standard Library

আরও simplifiedভাবে:

JDK = Development Tools + Runtime Environment

JDK developer-এর প্রয়োজনীয় compile এবং run—দুটি কাজই support করে।


JRE কী?

JRE-এর পূর্ণরূপ:

Java Runtime Environment

JRE-এর উদ্দেশ্য হলো compiled Java application run করার environment দেওয়া।

JRE conceptually অন্তর্ভুক্ত করে:

  • JVM
  • Java standard library
  • Runtime support files
  • Required runtime components

সহজভাবে:

JRE Java program চালানোর environment দেয়।


JRE কী করে?

ধরা যাক, Java source code আগেই compile করা হয়েছে।

আপনার কাছে আছে:

Main.class

এই bytecode execute করার জন্য প্রয়োজন:

  • JVM
  • Java runtime library
  • Required runtime component

এই environment-কে conceptually JRE বলা হয়।

JRE source code compile করার development tool দেয় না।

অর্থাৎ traditional distinction অনুযায়ী:

  • JDK দিয়ে code develop ও compile করা যায়
  • JRE দিয়ে compiled code run করা যায়

Modern Java-তে JRE

পুরোনো Java installation-এ আলাদা JDK এবং JRE package খুব common ছিল।

Modern Java ecosystem-এ standalone JRE distribution আগের মতো সব vendor-এর primary offering নয়।

সাধারণত developer একটি JDK install করেন, যার মধ্যে application run করার প্রয়োজনীয় runtime component থাকে।

Production application-এর জন্য প্রয়োজন অনুযায়ী custom runtime image-ও তৈরি করা যায়।

তবে concept বোঝার জন্য:

JRE = JVM + Runtime Libraries

এই model এখনও useful।


JVM কী?

JVM-এর পূর্ণরূপ:

Java Virtual Machine

JVM হলো এমন একটি virtual execution environment, যা Java bytecode execute করে।

JVM সরাসরি Java source code execute করে না।

JVM-এর input সাধারণত compiled bytecode:

.class

JVM-এর প্রধান দায়িত্ব:

  • Class load করা
  • Bytecode verify করা
  • Bytecode execute করা
  • Memory allocate করা
  • Object manage করা
  • Garbage collection চালানো
  • Thread manage করা
  • Runtime error report করা
  • Security rule enforce করা
  • Bytecode machine code-এ convert করা

JVM কেন Virtual Machine?

JVM একটি physical machine নয়।

এটি software-এর মাধ্যমে একটি abstract machine environment তৈরি করে।

Developer একই bytecode বিভিন্ন operating system-এর JVM-এ run করতে পারেন।

Example:

Main.class
    ↓
Windows JVM

অথবা:

Main.class
    ↓
Linux JVM

অথবা:

Main.class
    ↓
macOS JVM

প্রতিটি JVM underlying operating system এবং hardware-এর জন্য আলাদাভাবে implement করা হয়।

কিন্তু JVM একই ধরনের bytecode instruction বুঝতে পারে।


JVM-এর গুরুত্বপূর্ণ দায়িত্ব

Class Loading

JVM প্রয়োজনীয় .class file খুঁজে এবং load করে।

Bytecode Verification

JVM bytecode valid এবং নিরাপদ কি না check করে।

Execution

JVM bytecode instruction execute করে।

Memory Management

Program-এর object, variable এবং runtime data-এর জন্য memory manage করে।

Garbage Collection

Unused object-এর memory reclaim করে।

Thread Management

একাধিক thread-এর execution coordinate করে।

Runtime Error Handling

Execution-এর সময় error হলে exception তৈরি এবং report করে।

Runtime Optimization

Frequently executed code JIT compiler-এর মাধ্যমে optimize করতে পারে।


JVM এবং Operating System

JVM platform-independent নয়।

প্রতিটি operating system-এর জন্য compatible JVM implementation প্রয়োজন।

উদাহরণ:

  • Windows JVM
  • Linux JVM
  • macOS JVM

Windows-এর জন্য তৈরি JVM operating system-এর Windows API এবং hardware instruction-এর সঙ্গে কাজ করে।

Linux-এর জন্য তৈরি JVM Linux environment-এর সঙ্গে কাজ করে।

Java bytecode platform-neutral, কিন্তু JVM platform-specific।


JDK, JRE এবং JVM-এর সম্পর্ক

Conceptual relationship:

JDK
└── JRE
    └── JVM

আরও বিস্তারিতভাবে:

JDK
├── Compiler
├── Debugging Tools
├── Documentation Tools
├── Packaging Tools
└── JRE
    ├── Standard Library
    ├── Runtime Components
    └── JVM

সহজভাবে মনে রাখুন:

JDK = Develop + Compile + Run
JRE = Run
JVM = Execute Bytecode

JDK বনাম JRE বনাম JVM

বিষয়JDKJREJVM
পূর্ণরূপJava Development KitJava Runtime EnvironmentJava Virtual Machine
প্রধান উদ্দেশ্যJava application develop করাJava application run করাBytecode execute করা
Compiler থাকেহ্যাঁনানা
JVM থাকেহ্যাঁহ্যাঁনিজেই JVM
Standard library থাকেহ্যাঁহ্যাঁLibrary ব্যবহার করে
Developer ব্যবহার করেনহ্যাঁConceptually runtime-এর জন্যIndirectly
.java compile করেহ্যাঁনানা
.class execute করেRuntime-এর মাধ্যমেJVM-এর মাধ্যমেহ্যাঁ

একটি সহজ উদাহরণ

ধরা যাক, একটি restaurant আছে।

এই analogy-তে:

  • JDK হলো complete kitchen এবং cooking tools
  • JRE হলো খাবার serve করার environment
  • JVM হলো chef, যে recipe execute করে
  • Bytecode হলো recipe
  • CPU হলো physical worker বা machine, যা actual operation সম্পন্ন করে

তবে analogy পুরোপুরি technical reality represent করে না। এটি শুধু concept মনে রাখার জন্য।


Java Compiler কী?

Java compiler Java source code-কে bytecode-এ convert করে।

Compiler-এর command:

javac

Source code:

public class Main {

    public static void main(String[] args) {
        System.out.println("Learning Java");
    }
}

Compile command:

javac Main.java

Output:

Main.class

Compiler source code analyze করে।

এটি check করে:

  • Syntax valid কি না
  • Variable declared কি না
  • Type compatible কি না
  • Method call valid কি না
  • Required symbol পাওয়া যাচ্ছে কি না
  • Class structure valid কি না

Compilation Error কী?

Compiler source code translate করতে না পারলে compilation error দেয়।

Example:

public class Main {

    public static void main(String[] args) {
        System.out.println("Hello")
    }
}

Problem:

System.out.println("Hello")

Statement-এর শেষে semicolon নেই।

Compile করলে compiler error দেখাবে।

Correct code:

System.out.println("Hello");

Type-Related Compilation Error

Example:

public class Main {

    public static void main(String[] args) {
        int age = "twenty";
    }
}

age একটি int variable।

কিন্তু assign করা হয়েছে String value।

Compiler এই incompatible type detect করবে।

Correct example:

int age = 20;

অথবা:

String age = "twenty";

Unknown Variable Error

Example:

public class Main {

    public static void main(String[] args) {
        int firstNumber = 10;

        System.out.println(secondNumber);
    }
}

secondNumber declare করা হয়নি।

Compiler variableটি resolve করতে পারবে না।

Correct code:

public class Main {

    public static void main(String[] args) {
        int firstNumber = 10;
        int secondNumber = 20;

        System.out.println(secondNumber);
    }
}

Java Source Code কী?

Java source code হলো developer-এর লেখা human-readable code।

Java source file-এর extension:

.java

Example:

Main.java

Content:

public class Main {

    public static void main(String[] args) {
        System.out.println("Hello");
    }
}

Source code version control system-এ রাখা যায়।

যেমন:

  • Git
  • GitHub
  • GitLab

Source code edit, review এবং maintain করা যায়।


Bytecode কী?

Bytecode হলো Java compiler-এর তৈরি intermediate instruction format।

Bytecode সাধারণত .class file-এ থাকে।

Example:

Main.class

Bytecode:

  • Java source code নয়
  • Direct processor machine code নয়
  • JVM instruction format
  • Platform-neutral
  • Compiled representation

Conceptual flow:

Main.java
    ↓
javac
    ↓
Main.class

Bytecode কেন প্রয়োজন?

Java compiler যদি সরাসরি Windows machine code তৈরি করত, তাহলে সেই compiled code Linux বা macOS-এ চলত না।

Java পরিবর্তে একটি intermediate format তৈরি করে:

Bytecode

তারপর প্রতিটি platform-এর JVM সেই bytecode execute করে।

                  ┌── Windows JVM
Main.class ───────┼── Linux JVM
                  └── macOS JVM

এই design Java portability support করে।


Bytecode কি Human-Readable?

.class file সাধারণ text editor-এ meaningful Java source code হিসেবে দেখা যায় না।

কারণ এটি binary format-এ থাকে।

তবে JDK-এর tool ব্যবহার করে bytecode instruction inspect করা যায়।

Example tool:

javap

Command:

javap -c Main

এটি class-এর bytecode instruction-এর readable representation দেখাতে পারে।

Beginner হিসেবে bytecode instruction মুখস্থ করার প্রয়োজন নেই।

তবে বুঝতে হবে:

Java source code এবং generated bytecode একই জিনিস নয়।


.java এবং .class File-এর পার্থক্য

বিষয়.java File.class File
ContentJava source codeJava bytecode
তৈরি করেনDeveloperJava compiler
Human-readableহ্যাঁসাধারণভাবে না
Compile করা হয়হ্যাঁনা
JVM execute করেসরাসরি নাহ্যাঁ
ExampleMain.javaMain.class

Compile Time কী?

Compile time হলো source code compile হওয়ার সময়।

এই stage-এ compiler source code analyze করে।

Compile time-এ detect হতে পারে:

  • Syntax error
  • Missing semicolon
  • Unknown variable
  • Incompatible type
  • Invalid method call
  • Missing class
  • Duplicate declaration

Example:

int quantity = "five";

এটি compile-time error।

কারণ int variable-এর মধ্যে String value রাখা হয়েছে।


Runtime কী?

Runtime হলো program execute হওয়ার সময়।

Compilation successful হওয়ার পর JVM program চালায়।

Runtime-এ হতে পারে:

  • Object তৈরি
  • Method call
  • User input নেওয়া
  • Calculation করা
  • File open করা
  • Database connection তৈরি
  • Network request করা
  • Exception হওয়া

Example:

int result = 10 / 0;

এই code compile হতে পারে।

কিন্তু run করার সময় exception হবে।

এটি runtime error।


Compile Time এবং Runtime-এর পার্থক্য

বিষয়Compile TimeRuntime
কখন ঘটেCode compile হওয়ার সময়Program চলার সময়
প্রধান componentCompilerJVM
InputSource codeBytecode
Common errorSyntax, type errorDivision by zero, missing file
Program চলছেনাহ্যাঁ
Example commandjavac Main.javajava Main

Compilation Success মানেই কি Program Correct?

না।

একটি program successfully compile করতে পারে, কিন্তু runtime-এ fail করতে পারে।

Example:

public class Main {

    public static void main(String[] args) {
        int firstNumber = 10;
        int secondNumber = 0;

        int result = firstNumber / secondNumber;

        System.out.println(result);
    }
}

Compilation:

javac Main.java

Successful হতে পারে।

Execution:

java Main

Runtime-এ error হবে।

কারণ zero দিয়ে integer divide করা যায় না।


Program Run করলেই কি Logic Correct?

না।

Program compile এবং run—দুটিই successfully হতে পারে, তবুও result ভুল হতে পারে।

Example:

int mathematics = 80;
int english = 90;

int total = mathematics + english;
int average = total / 3;

System.out.println(average);

Program compile করবে।

Program run করবে।

কিন্তু average ভুল হবে।

কারণ subject দুটি, divide করা হয়েছে 3 দিয়ে।

এটি logical error।


Java Program-এর Complete Flow

একটি Java program-এর flow step-by-step দেখা যাক।

Source file:

Main.java

Source code:

public class Main {

    public static void main(String[] args) {
        int firstNumber = 10;
        int secondNumber = 20;
        int total = firstNumber + secondNumber;

        System.out.println(total);
    }
}

Step 1: Source Code লেখা

Developer Main.java file তৈরি করেন।

public class Main {
    // Code
}

Step 2: Source Code Save করা

Fileটি storage-এ save হয়।

Main.java

Step 3: Compiler চালানো

Command:

javac Main.java

Compiler source code analyze করে।


Step 4: Compilation Error Check

Compiler check করে:

  • Syntax valid কি না
  • Type correct কি না
  • Class structure valid কি না
  • Variable available কি না

Error থাকলে compilation বন্ধ হয়।


Step 5: Bytecode তৈরি

Compilation successful হলে তৈরি হয়:

Main.class

Step 6: JVM Start করা

Command:

java Main

Java launcher JVM start করে।


Step 7: Class Load করা

JVM class loader Main class খুঁজে এবং load করে।


Step 8: Bytecode Verify করা

JVM bytecode valid কি না check করে।


Step 9: main Method খোঁজা

JVM নিচের method খুঁজে:

public static void main(String[] args)

Step 10: Program Execute করা

JVM method-এর bytecode execute করে।

Variables তৈরি হয়:

int firstNumber = 10;
int secondNumber = 20;

Calculation হয়:

int total = firstNumber + secondNumber;

Step 11: Output তৈরি

Console-এ output:

30

Complete Diagram

Developer writes code
        ↓
Main.java
        ↓
javac Main.java
        ↓
Compilation
        ↓
Main.class
        ↓
java Main
        ↓
JVM starts
        ↓
Class loading
        ↓
Bytecode verification
        ↓
main method execution
        ↓
Output

javac Main.java Command বিশ্লেষণ

Command:

javac Main.java

এখানে:

  • javac হলো Java compiler
  • Main.java হলো source file

Compiler successful হলে current directory-তে Main.class তৈরি হয়।

Directory:

project/
├── Main.java
└── Main.class

java Main Command বিশ্লেষণ

Command:

java Main

এখানে:

  • java Java application launcher
  • Main হলো class name
  • .class extension লেখা হয় না

ভুল:

java Main.class

সঠিক:

java Main

JVM classpath থেকে Main.class খুঁজে।


Public Class এবং File Name

নিচের class:

public class Main {
}

সাধারণভাবে file name হতে হবে:

Main.java

Class name:

Main

File name:

Main.java

Case-ও match করা উচিত।

ভুল example:

main.java

যখন class:

public class Main {
}

Java case-sensitive।


Classpath কী?

Classpath JVM-কে বলে কোথায় class এবং library খুঁজতে হবে।

Simple program-এর ক্ষেত্রে current directory classpath হিসেবে কাজ করতে পারে।

java Main

JVM current directory থেকে Main.class খুঁজে নেয়।

Larger application-এ classpath-এর মধ্যে থাকতে পারে:

  • Compiled class directory
  • JAR file
  • External dependency
  • Framework library

Classpath advanced topic। পরবর্তী সময়ে project structure শেখার সময় এটি আরও পরিষ্কার হবে।


JVM Class Loading

JVM-এর class loader প্রয়োজনীয় class load করে।

Program start করার সময় JVM:

  1. Main class খুঁজে
  2. Main class load করে
  3. Dependent class identify করে
  4. প্রয়োজন অনুযায়ী অন্য class load করে

Example:

public class Main {

    public static void main(String[] args) {
        Calculator calculator = new Calculator();
    }
}

এখানে JVM-এর Main এবং Calculator class প্রয়োজন হতে পারে।


Bytecode Verification

JVM bytecode execute করার আগে verification করতে পারে।

Verification check করতে পারে:

  • Class file structure valid কি না
  • Type rule follow করা হয়েছে কি না
  • Invalid instruction আছে কি না
  • Stack operation valid কি না
  • Illegal access হচ্ছে কি না

এটি JVM security এবং reliability improve করে।


JVM Execution Engine

JVM-এর execution engine bytecode execute করে।

এটি ব্যবহার করতে পারে:

  • Interpreter
  • JIT compiler
  • Native code execution

Simplified flow:

Bytecode
    ↓
Execution Engine
    ↓
Machine Instruction
    ↓
CPU

Interpreter-এর ভূমিকা

Interpreter bytecode instruction একে একে process এবং execute করতে পারে।

এর সুবিধা:

  • Program দ্রুত start করা যায়
  • Immediate execution সম্ভব

কিন্তু একই code বারবার interpret করলে performance cost হতে পারে।

এই কারণে JVM JIT compiler ব্যবহার করতে পারে।


JIT Compiler-এর ভূমিকা

JIT-এর পূর্ণরূপ:

Just-In-Time Compiler

JVM runtime-এ frequently executed code identify করতে পারে।

তারপর JIT compiler সেই bytecode machine code-এ compile করে।

Frequently Executed Bytecode
            ↓
        JIT Compiler
            ↓
      Native Machine Code

পরবর্তী execution-এ optimized machine code ব্যবহার করা যেতে পারে।

এর ফলে long-running Java application ভালো performance দিতে পারে।


JVM Memory

Java program run করার সময় JVM বিভিন্ন ধরনের memory area manage করে।

Beginner হিসেবে এখন শুধু high-level ধারণা প্রয়োজন।

JVM memory-এর মধ্যে conceptually থাকে:

  • Heap
  • Stack
  • Method-related memory
  • Native memory

Heap

Heap-এ সাধারণত object তৈরি হয়।

Example:

Student student = new Student();

new Student() ব্যবহার করে একটি object তৈরি করা হয়।

এই object সাধারণত heap memory-তে থাকে।


Stack

Method call এবং local variable-এর runtime information stack-এর সঙ্গে সম্পর্কিত।

Example:

public static void main(String[] args) {
    int age = 30;
}

age local variable-এর execution context stack frame-এর অংশ হতে পারে।

Heap এবং stack আমরা object-oriented programming এবং memory lesson-এ বিস্তারিত শিখব।


Garbage Collection

Java automatic memory management ব্যবহার করে।

যেসব object application আর ব্যবহার করতে পারে না, Garbage Collector তাদের memory reclaim করতে পারে।

Example:

Student student = new Student();

student = null;

এখানে তৈরি object-এর আর কোনো reachable reference না থাকলে সেটি future garbage collection-এর candidate হতে পারে।

Garbage collection সঙ্গে সঙ্গে ঘটবে—এমন নিশ্চয়তা নেই।

JVM প্রয়োজন এবং strategy অনুযায়ী garbage collection চালায়।


JDK Version Check

JDK install করার পর version check করা যায়:

java -version

Compiler version check:

javac -version

Example output:

java version "21"

অথবা vendor অনুযায়ী output কিছুটা ভিন্ন হতে পারে।

দুটি command কাজ করলে সাধারণত বোঝা যায়:

  • Java runtime available
  • Java compiler available

শুধু java Command থাকলে কী বোঝায়?

যদি:

java -version

কাজ করে, কিন্তু:

javac -version

কাজ না করে, তাহলে environment-এ runtime available হলেও compiler path-এ নাও থাকতে পারে।

Java development-এর জন্য javac প্রয়োজন।

Modern development environment-এ full JDK install করা সবচেয়ে সাধারণ approach।


JAVA_HOME কী?

JAVA_HOME একটি environment variable।

এটি সাধারণত JDK installation directory নির্দেশ করে।

Conceptual example:

JAVA_HOME=/path/to/jdk

কিছু development tool JAVA_HOME ব্যবহার করে Java installation খুঁজে।

যেমন:

  • Maven
  • Gradle
  • Application server
  • Build script
  • IDE

Exact path operating system এবং installation-এর ওপর নির্ভর করে।


PATH কী?

PATH environment variable operating system-কে বলে command কোথায় খুঁজতে হবে।

JDK-এর bin directory PATH-এ থাকলে terminal থেকে চালানো যায়:

java
javac
jar
javadoc

JDK bin path না থাকলে command not found error হতে পারে।


IDE ব্যবহার করলে কি JDK প্রয়োজন?

হ্যাঁ।

IntelliJ IDEA বা অন্য IDE code editor এবং development support দেয়।

কিন্তু Java source code compile এবং run করার জন্য JDK প্রয়োজন।

IDE JDK ব্যবহার করে:

  • Code compile করতে
  • Program run করতে
  • Error detect করতে
  • Project build করতে
  • Test চালাতে

IDE install থাকলেই Java runtime automatically correctly configured থাকবে—এমন নয়।

Project SDK হিসেবে JDK configure করতে হয়।


IDE কী Automatically করে?

IDE-তে Run button চাপলে background-এ সাধারণত:

  1. Source code save করে
  2. Compiler invoke করে
  3. Compilation error check করে
  4. Bytecode তৈরি করে
  5. Classpath configure করে
  6. JVM start করে
  7. Main class load করে
  8. main method execute করে
  9. Console output দেখায়

IDE processটি সহজ করে, কিন্তু underlying JDK, compiler এবং JVM একই concept follow করে।


Development Environment বনাম Runtime Environment

Development Environment

যেখানে developer:

  • Source code লেখেন
  • Code compile করেন
  • Debug করেন
  • Test চালান
  • Application package করেন

প্রয়োজন:

JDK

Runtime Environment

যেখানে compiled application run করে।

প্রয়োজন:

JVM + Required Runtime Libraries

Production server-এ source code থাকা বাধ্যতামূলক নয়।

সেখানে compiled application package deploy করা হতে পারে।


Development Machine এবং Production Server

Development machine-এ থাকতে পারে:

  • Source code
  • IDE
  • JDK
  • Build tool
  • Test code
  • Debugging configuration

Production server-এ থাকতে পারে:

  • Compiled JAR
  • Required runtime
  • Configuration
  • Monitoring agent
  • Environment variable

Example production command:

java -jar liveklass-api.jar

এখানে server compiled JAR execute করছে।


JAR File এবং JVM

একাধিক .class file package করে JAR তৈরি করা যায়।

Example structure:

application.jar
├── Main.class
├── Course.class
├── Student.class
└── META-INF/

Executable JAR run:

java -jar application.jar

Java backend service সাধারণত এই ধরনের package হিসেবে deploy হতে পারে।


Common Misconceptions

Misconception 1

JVM Java source code compile করে।

সঠিক নয়।

Java compiler source code compile করে।

javac

JVM bytecode execute করে।


Misconception 2

JDK এবং JVM একই জিনিস।

সঠিক নয়।

JDK complete development toolkit।

JVM JDK-এর runtime componentগুলোর একটি।


Misconception 3

Bytecode হলো machine code।

সঠিক নয়।

Bytecode JVM-এর intermediate instruction।

CPU সরাসরি Java bytecode execute করে না।


Misconception 4

Compilation successful হলে program অবশ্যই correct।

সঠিক নয়।

Program runtime error বা logical error তৈরি করতে পারে।


Misconception 5

Java platform-independent হওয়ায় JVM-ও platform-independent।

সঠিক নয়।

Bytecode platform-neutral।

JVM platform-specific।


Misconception 6

IDE Java program execute করে।

IDE execution initiate এবং manage করে।

Actual compilation compiler এবং execution JVM করে।


Example: Successful Compilation and Execution

Source code:

public class Main {

    public static void main(String[] args) {
        String courseName = "Java Foundation";

        System.out.println(courseName);
    }
}

Compile:

javac Main.java

Generated file:

Main.class

Run:

java Main

Output:

Java Foundation

Example: Compile-Time Error

public class Main {

    public static void main(String[] args) {
        int coursePrice = "4990";
    }
}

Problem:

  • coursePrice হলো int
  • "4990" হলো String

Compiler incompatible type error দেবে।

Correct code:

int coursePrice = 4990;

Example: Runtime Error

public class Main {

    public static void main(String[] args) {
        int totalStudents = 100;
        int groups = 0;

        int studentsPerGroup = totalStudents / groups;

        System.out.println(studentsPerGroup);
    }
}

Code compile করতে পারে।

কিন্তু runtime-এ division by zero error হবে।


Example: Logical Error

public class Main {

    public static void main(String[] args) {
        int price = 1000;
        int quantity = 3;

        int total = price + quantity;

        System.out.println(total);
    }
}

Output:

1003

Expected calculation:

1000 × 3 = 3000

Correct code:

int total = price * quantity;

এটি logical error-এর example।


গুরুত্বপূর্ণ Terms

JDK

Java Development Kit। Java application develop, compile এবং run করার toolkit।

JRE

Java Runtime Environment। Compiled Java application run করার runtime environment।

JVM

Java Virtual Machine। Java bytecode load এবং execute করা virtual machine।

Java Compiler

Java source code-কে bytecode-এ convert করা tool।

javac

Java compiler command।

java

Java application start করার command।

Source Code

Developer-এর লেখা human-readable Java code।

Bytecode

Java compiler-এর তৈরি JVM-compatible intermediate instruction।

Compile Time

Source code compile হওয়ার stage।

Runtime

Compiled program execute হওয়ার stage।

Class File

Java bytecode থাকা .class file।

JAR

Java Archive। একাধিক class এবং resource package করার file format।

Classpath

JVM class এবং library কোথায় খুঁজবে, তার location configuration।

JIT Compiler

Runtime-এ bytecode machine code-এ compile করে performance improve করা component।

Garbage Collector

Unused object-এর memory reclaim করা JVM component।

JAVA_HOME

JDK installation location নির্দেশ করা environment variable।


Practice Exercise 1: Component শনাক্ত করুন

নিচের কাজগুলো JDK, JRE নাকি JVM-এর প্রধান দায়িত্ব, তা লিখুন।

  1. Java source code compile করা
  2. Bytecode execute করা
  3. Development tool দেওয়া
  4. Runtime library দেওয়া
  5. Garbage collection করা
  6. javac command দেওয়া
  7. Class load করা
  8. Java application package করার tool দেওয়া

Practice Exercise 2: File Type শনাক্ত করুন

নিচের fileগুলোর মধ্যে কোনটি source code এবং কোনটি bytecode, তা লিখুন:

Main.java
Main.class
Student.java
Student.class
Course.java
Course.class

Practice Exercise 3: Compile Time নাকি Runtime?

প্রতিটি problem compile time নাকি runtime-এ ঘটতে পারে, তা লিখুন।

Problem 1

Statement-এর শেষে semicolon নেই।

Problem 2

Integer value zero দিয়ে divide করা হচ্ছে।

Problem 3

Unknown variable ব্যবহার করা হয়েছে।

Problem 4

Program যে file open করতে চায়, fileটি নেই।

Problem 5

String value একটি int variable-এ assign করা হয়েছে।

Problem 6

Database server unavailable।


Practice Exercise 4: Execution Flow সাজান

নিচের stepগুলো সঠিক order-এ সাজান:

  • JVM main method execute করে
  • Developer source code লেখেন
  • Compiler bytecode তৈরি করে
  • JVM class load করে
  • Program output দেয়
  • javac source code compile করে
  • java command JVM start করে

Practice Exercise 5: Commands লিখুন

ধরা যাক, আপনার file-এর নাম:

Calculator.java

Class-এর নাম:

public class Calculator

লিখুন:

  1. Compile command
  2. Run command
  3. Generated class file-এর নাম

Practice Exercise 6: Diagram তৈরি করুন

নিচের term ব্যবহার করে একটি diagram তৈরি করুন:

  • Developer
  • .java
  • javac
  • .class
  • JVM
  • CPU
  • Output

Arrow ব্যবহার করুন।


Practice Exercise 7: নিজের ভাষায় ব্যাখ্যা করুন

নিচের প্রশ্নগুলোর উত্তর নিজের ভাষায় লিখুন:

  1. JDK কেন developer-এর জন্য প্রয়োজন?
  2. JVM কেন platform-specific?
  3. Bytecode কীভাবে Java portability support করে?
  4. Compile time এবং runtime-এর পার্থক্য কী?
  5. Compilation successful হলেও program কেন fail করতে পারে?
  6. IDE থাকলেও JDK প্রয়োজন কেন?

Knowledge Check

Question 1

JDK-এর পূর্ণরূপ কী?

Question 2

JRE-এর পূর্ণরূপ কী?

Question 3

JVM-এর পূর্ণরূপ কী?

Question 4

Java source code কোন command compile করে?

Question 5

Java application কোন command start করে?

Question 6

Java source file-এর extension কী?

Question 7

Java bytecode file-এর extension কী?

Question 8

JVM কি সরাসরি .java file execute করে?

Question 9

Bytecode কী?

Question 10

JDK এবং JRE-এর প্রধান পার্থক্য কী?

Question 11

Compile time-এ কী ধরনের error পাওয়া যায়?

Question 12

Runtime error-এর একটি example দিন।

Question 13

Java bytecode platform-neutral হলেও JVM platform-specific কেন?

Question 14

JIT compiler কী করে?

Question 15

JAVA_HOME কী নির্দেশ করে?

Question 16

Classpath কী?

Question 17

JAR file কী কাজে ব্যবহৃত হয়?

Question 18

Garbage Collector কী করে?


Knowledge Check Answers

Answer 1

JDK-এর পূর্ণরূপ:

Java Development Kit

Answer 2

JRE-এর পূর্ণরূপ:

Java Runtime Environment

Answer 3

JVM-এর পূর্ণরূপ:

Java Virtual Machine

Answer 4

Java source code compile করার command:

javac

Answer 5

Java application start করার command:

java

Answer 6

Java source file-এর extension:

.java

Answer 7

Java bytecode file-এর extension:

.class

Answer 8

না। JVM সরাসরি .java source file execute করে না। JVM compiled .class bytecode execute করে।

Answer 9

Bytecode হলো Java compiler-এর তৈরি platform-neutral intermediate instruction, যা JVM execute করতে পারে।

Answer 10

JDK Java application develop এবং compile করার tool দেয়। JRE compiled Java application run করার environment দেয়।

Answer 11

Compile time-এ syntax error, incompatible type, unknown variable এবং invalid method call-এর মতো error পাওয়া যায়।

Answer 12

Integer value zero দিয়ে divide করলে runtime error হতে পারে।

int result = 10 / 0;

Answer 13

প্রতিটি JVM underlying operating system এবং hardware-এর সঙ্গে কাজ করে। তাই Windows, Linux এবং macOS-এর JVM implementation আলাদা।

Answer 14

JIT compiler runtime-এ frequently executed bytecode machine code-এ compile করে performance improve করতে পারে।

Answer 15

JAVA_HOME সাধারণত JDK installation directory নির্দেশ করে।

Answer 16

Classpath JVM-কে বলে class এবং library কোথায় খুঁজতে হবে।

Answer 17

JAR file একাধিক compiled class এবং resource একটি archive-এর মধ্যে package করতে ব্যবহৃত হয়।

Answer 18

Garbage Collector unused এবং unreachable object-এর memory reclaim করতে সাহায্য করে।


Lesson Summary

এই lesson-এ আমরা শিখেছি:

  • JDK হলো Java development-এর complete toolkit
  • JRE compiled Java application চালানোর runtime environment
  • JVM Java bytecode execute করে
  • JDK-এর মধ্যে compiler, runtime এবং development tool থাকে
  • javac Java source code compile করে
  • java command Java application start করে
  • Java source code .java file-এ থাকে
  • Compiled bytecode .class file-এ থাকে
  • Bytecode platform-neutral
  • JVM platform-specific
  • Compile time এবং runtime আলাদা stage
  • Compilation success program-এর correctness guarantee করে না
  • JVM class loading, bytecode verification এবং memory management করে
  • JIT compiler runtime performance improve করতে পারে
  • Garbage Collector unused object-এর memory reclaim করে
  • IDE underlying JDK, compiler এবং JVM ব্যবহার করে
  • Java application JAR file হিসেবে package এবং deploy করা যায়

Next Lesson

পরবর্তী lesson-এ আমরা Java development environment তৈরি করব।

আমরা শিখব:

  • সঠিক JDK নির্বাচন করা
  • JDK install করা
  • java এবং javac command verify করা
  • JAVA_HOME configure করা
  • IntelliJ IDEA install করা
  • IntelliJ IDEA-তে JDK configure করা
  • একটি Java project তৈরি করার প্রস্তুতি নেওয়া