Programming and Java Fundamentals
JDK, JRE, JVM, and Bytecode
আপনি একটি 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এবং.classfile শনাক্ত করতেjavacএবংjavacommand-এর ভূমিকা বুঝতে
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
এটি সাধারণভাবে:
- JVM start করে
Mainclass খুঁজে- Class load করে
mainmethod খুঁজে- 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
.classfile - 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
| বিষয় | JDK | JRE | JVM |
|---|---|---|---|
| পূর্ণরূপ | Java Development Kit | Java Runtime Environment | Java 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 |
|---|---|---|
| Content | Java source code | Java bytecode |
| তৈরি করেন | Developer | Java compiler |
| Human-readable | হ্যাঁ | সাধারণভাবে না |
| Compile করা হয় | হ্যাঁ | না |
| JVM execute করে | সরাসরি না | হ্যাঁ |
| Example | Main.java | Main.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 Time | Runtime |
|---|---|---|
| কখন ঘটে | Code compile হওয়ার সময় | Program চলার সময় |
| প্রধান component | Compiler | JVM |
| Input | Source code | Bytecode |
| Common error | Syntax, type error | Division by zero, missing file |
| Program চলছে | না | হ্যাঁ |
| Example command | javac Main.java | java 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 compilerMain.javaহলো source file
Compiler successful হলে current directory-তে Main.class তৈরি হয়।
Directory:
project/
├── Main.java
└── Main.class
java Main Command বিশ্লেষণ
Command:
java Main
এখানে:
javaJava application launcherMainহলো class name.classextension লেখা হয় না
ভুল:
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:
- Main class খুঁজে
- Main class load করে
- Dependent class identify করে
- প্রয়োজন অনুযায়ী অন্য 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-এ সাধারণত:
- Source code save করে
- Compiler invoke করে
- Compilation error check করে
- Bytecode তৈরি করে
- Classpath configure করে
- JVM start করে
- Main class load করে
mainmethod execute করে- 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-এর প্রধান দায়িত্ব, তা লিখুন।
- Java source code compile করা
- Bytecode execute করা
- Development tool দেওয়া
- Runtime library দেওয়া
- Garbage collection করা
javaccommand দেওয়া- Class load করা
- 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
mainmethod execute করে - Developer source code লেখেন
- Compiler bytecode তৈরি করে
- JVM class load করে
- Program output দেয়
javacsource code compile করেjavacommand JVM start করে
Practice Exercise 5: Commands লিখুন
ধরা যাক, আপনার file-এর নাম:
Calculator.java
Class-এর নাম:
public class Calculator
লিখুন:
- Compile command
- Run command
- Generated class file-এর নাম
Practice Exercise 6: Diagram তৈরি করুন
নিচের term ব্যবহার করে একটি diagram তৈরি করুন:
- Developer
.javajavac.class- JVM
- CPU
- Output
Arrow ব্যবহার করুন।
Practice Exercise 7: নিজের ভাষায় ব্যাখ্যা করুন
নিচের প্রশ্নগুলোর উত্তর নিজের ভাষায় লিখুন:
- JDK কেন developer-এর জন্য প্রয়োজন?
- JVM কেন platform-specific?
- Bytecode কীভাবে Java portability support করে?
- Compile time এবং runtime-এর পার্থক্য কী?
- Compilation successful হলেও program কেন fail করতে পারে?
- 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 থাকে
javacJava source code compile করেjavacommand Java application start করে- Java source code
.javafile-এ থাকে - Compiled bytecode
.classfile-এ থাকে - 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এবংjavaccommand verify করাJAVA_HOMEconfigure করা- IntelliJ IDEA install করা
- IntelliJ IDEA-তে JDK configure করা
- একটি Java project তৈরি করার প্রস্তুতি নেওয়া